init
This commit is contained in:
parent
adee68fbf2
commit
70a2c32b1a
|
@ -1,3 +1,10 @@
|
||||||
# temperaturedimmer
|
# temperaturedimmer
|
||||||
|
|
||||||
AC Light Dimmer with DS18B20 temperature sensor
|
AC Light Dimmer Module with DS18B20 temperature sensor changes gradually
|
||||||
|
changing of AC power (useful for infrared ceramic heating bulbs). Note
|
||||||
|
maxtemp and mintemp variables, in this range, the dimmer is working at
|
||||||
|
partially power gradient-like. Reads temperature every minute, changes
|
||||||
|
of dimming - 3 times per minute.
|
||||||
|
|
||||||
|
|
||||||
|
![temperaturedimmer](https://dev.ussr.win/microcontrollers/temperaturedimmer/raw/branch/master/temperaturedimmer_bb.jpg)
|
Binary file not shown.
|
@ -0,0 +1,104 @@
|
||||||
|
// temperaturedimmer : AC Light Dimmer Module with DS18B20 temperature sensor changes gradually changing
|
||||||
|
// of AC power (useful for infrared ceramic heating bulbs). Note maxtemp and mintemp variables, in this
|
||||||
|
// range, the dimmer is working at partially power gradient-like. Reads temperature every minute, changes
|
||||||
|
// of dimming - 3 times per minute.
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
#include <Thread.h>
|
||||||
|
#define ONE_WIRE_BUS 6 // Temperature senson DS18B20 signal pin
|
||||||
|
OneWire oneWire(ONE_WIRE_BUS);
|
||||||
|
DallasTemperature sensors(&oneWire);
|
||||||
|
bool serialshow = true; // Enable/disable serial output
|
||||||
|
int currenttemp = -127; // -127 - means sensor can't gain temperature data
|
||||||
|
int dimmerpin = 10; // Dimmer Digital PWM pin
|
||||||
|
int dimming = 128; // Dimming level (0-128) 0 = FULL ON, 128 = OFF
|
||||||
|
// 4-128 is recommended range (4 is maximum)
|
||||||
|
int maxtemp = 24; // Maximum temperature - dimmer works at minimum power
|
||||||
|
// if above maxtemp, dimmer not working
|
||||||
|
int mintemp = 21; // Minumum temperature (or less) - dimmer works at maximum power
|
||||||
|
// Threads:
|
||||||
|
Thread checkTempThread = Thread(); // Thread for temperature state checking
|
||||||
|
Thread changeDimmerThread = Thread(); // Thread for dimmer level changing
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
if (serialshow) {
|
||||||
|
Serial.begin(9600); // Initializes the Serial connection @ 9600 baud for debug
|
||||||
|
Serial.println("start");
|
||||||
|
}
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT); // Initializes builtin LED
|
||||||
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
pinMode(dimmerpin, OUTPUT); // Set the AC Load as output
|
||||||
|
attachInterrupt(0, zero_cross_int, RISING); // Choose the zero cross interrupt # from the table above
|
||||||
|
sensors.begin();
|
||||||
|
// Warning! zero_cross_int with sensors changes internal time,
|
||||||
|
// so digital 1000ms ~ physical 7100ms on Arduino Uno
|
||||||
|
checkTempThread.onRun(checkTemp);
|
||||||
|
checkTempThread.setInterval(8450); // Interval for checking temperature ~60sec
|
||||||
|
changeDimmerThread.onRun(changeDimmer);
|
||||||
|
changeDimmerThread.setInterval(2800); // Interval for change dimmer state ~20sec
|
||||||
|
checkTemp();
|
||||||
|
}
|
||||||
|
|
||||||
|
// zero_cross_int function from http://electronics.stackexchange.com/q/59615
|
||||||
|
// the interrupt function must take no parameters and return nothing
|
||||||
|
void zero_cross_int() { // function to be fired at the zero crossing to dim the light
|
||||||
|
// Firing angle calculation : 1 full 50Hz wave =1/50=20ms
|
||||||
|
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle)
|
||||||
|
// For 60Hz => 8.33ms (10.000/120)
|
||||||
|
// 10ms=10000us
|
||||||
|
// (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65
|
||||||
|
int dimtime = (75*dimming); // For 60Hz =>65
|
||||||
|
delayMicroseconds(dimtime); // Wait till firing the TRIAC
|
||||||
|
digitalWrite(dimmerpin, HIGH); // Fire the TRIAC
|
||||||
|
delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33)
|
||||||
|
digitalWrite(dimmerpin, LOW); // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
digitalWrite(LED_BUILTIN, LOW);
|
||||||
|
// Threads init:
|
||||||
|
if (checkTempThread.shouldRun())
|
||||||
|
checkTempThread.run();
|
||||||
|
if (changeDimmerThread.shouldRun())
|
||||||
|
changeDimmerThread.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkTemp() {
|
||||||
|
sensors.requestTemperatures();
|
||||||
|
currenttemp = int(sensors.getTempCByIndex(0));
|
||||||
|
if (serialshow) {
|
||||||
|
long currentTime = millis();
|
||||||
|
String tempString = currentTime + String(" temp: ")+ currenttemp;
|
||||||
|
Serial.println(tempString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void changeDimmer() {
|
||||||
|
if (currenttemp != -127) {
|
||||||
|
if (currenttemp <= mintemp)
|
||||||
|
if (dimming > 4) dimming = dimming - 1;
|
||||||
|
if (currenttemp > maxtemp)
|
||||||
|
if (dimming < 128) dimming = dimming + 1;
|
||||||
|
if ((mintemp < currenttemp) and (currenttemp <= maxtemp)) {
|
||||||
|
int dimlevel = (124 / (maxtemp - mintemp)) * (currenttemp - mintemp);
|
||||||
|
if (dimming < dimlevel)
|
||||||
|
dimming = dimming + 1;
|
||||||
|
if (dimming > dimlevel)
|
||||||
|
dimming = dimming - 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (dimming < 128) dimming = dimming + 1;
|
||||||
|
if (serialshow) {
|
||||||
|
long currentTime = millis();
|
||||||
|
String tempString = currentTime + String(" can't get temp data");
|
||||||
|
Serial.println(tempString);
|
||||||
|
}
|
||||||
|
// LED blinking is indication of temperature sensor failure
|
||||||
|
for (int i=1; i <= 10; i++) {
|
||||||
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
delay(10);
|
||||||
|
digitalWrite(LED_BUILTIN, LOW);
|
||||||
|
delay(20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 99 KiB |
Loading…
Reference in New Issue