Arduino kontrollerade ljus dimmer (7 / 15 steg)
Steg 7: Mjukvaran till sätta nivå med hjälp av upp-och nedknapparna
Nedan en kod att ställa ljuset nivå med upp-och nedknapparna. Den använder en timer som kontrollerar om tid som krävs för att utlösa TRIAC, snarare än att vänta i en försening loop
/*
AC ljus kontroll
Använder upp och ner knappar att ställa in nivåer
använder en timer avbryta för att ange nivån för ljusreglering
*/
#include < TimerOne.h > / / Avaiable från http://www.arduino.cc/playground/Code/Timer1
flyktiga int jag = 0; Variabel att använda som en räknare för dimmring steg. Det är flyktiga eftersom det passerar mellan avbryter
flyktiga boolean zero_cross = 0; Flagga som anger vi har korsat noll
int AC_pin = 3; Utgång till Opto Triac
int buton1 = 4; första knappen på pin 4
int buton2 = 5; andra knappen på stift 5
int dim2 = 0; ledde kontroll
int dim = 128; Ljusreglering nivå (0-128) 0 = på 128 = 0ff
int pas = 8. steg för count;
int freqStep = 75. Detta är det dröjsmål-per-ljusstyrka steget i mikrosekunder. Gör det möjligt för 128 steg
Om du använder 60 Hz rutnät frekvens set detta till 65
void setup() {/ / börja installationen
Serial.BEGIN(9600);
pinMode (buton1, ingång); Set buton1 pin som indata
pinMode (buton2, ingång); Set buton1 pin som indata
pinMode (AC_pin, OUTPUT); Ange PIN-koden Triac
attachInterrupt (0, zero_cross_detect, RISING); Bifoga en avbryta Pin 2 (avbryta 0) för noll Cross upptäckt
Timer1.Initialize(freqStep); Initiera TimerOne bibliotek för freq vi behöver
Timer1.attachInterrupt (dim_check, freqStep); Gå till dim_check procedur varje 75 oss (50Hz) eller 65 uS (60Hz)
Använda TimerOne biblioteket för att bifoga ett avbrott
}
void zero_cross_detect() {
zero_cross = sant; ange flaggan för dim_check funktion som ett noll kors har inträffat
Jag = 0; stegräknare till 0... När vi börjar en ny cykel
digitalWrite (AC_pin, låg);
}
Slå på TRIAC vid lämplig tidpunkt
Vi kommer hit varje 75 (65) oss
Kontrollera först om en flagga har ställts in
Kontrollera sedan om räknaren "i" har nått den ljusreglering
om så... slå på TRIAC och återställa räknaren
void dim_check() {
IF(zero_cross == true) {
om (jag > = dim) {
digitalWrite (AC_pin, hög); slå på ljus
Jag = 0; återställa tiden steg counter
zero_cross = false; återställa noll cross upptäckt flagga
}
annat {
i ++; öka tiden steg counter
}
}
}
void loop() {
digitalWrite (buton1, hög);
digitalWrite (buton2, hög);
om (digitalRead(buton1) == låg)
{
om (dim < 127)
{
Dim = dim + pas;
om (dim > 127)
{
Dim = 128;
}
}
}
om (digitalRead(buton2) == låg)
{
om (dim > 5)
{
Dim = dim - pas;
om (dim < 0)
{
Dim = 0;
}
}
}
medan (digitalRead(buton1) == låg) {}
Delay(10); väntar på lite...
medan (digitalRead(buton2) == låg) {}
Delay(10); väntar på lite...
dim2 = 255-2 * dim;
om (dim2 < 0)
{
dim2 = 0;
}
Serial.Print("Dim=");
Serial.Print(Dim);
Serial.Print ("dim2 =");
Serial.Print(dim2);
Serial.Print ("dim1 =");
Serial.Print(2*Dim);
Serial.Print('\n');
fördröjning (100);
}