3 kanal-Dimmer/fader för Arduino eller andra microcontroller (2 / 3 steg)
Steg 2: 3 kanals Dimmer/fader för Arduino eller andra mikrokontroller: programvara
Detta är bara för demonstration eller provande syfte.
Eftersom programmet är bara för att illustrera, cykler slingan mellan 0 och 127...
/*
AC ljus kontroll
Ryan McLaughlin < ryanjmclaughlin
med smärre ändringar
*/
#include < TimerOne.h > / / http://www.arduino.cc/playground/Code/Timer1
#define stift 3
flyktiga int pinCount [stift]; beständig göra tillgänglig i avbrott
flyktiga boolean zero_cross = 0; Boolean att lagra en "switch" berätta för oss om vi har korsat noll
int AC_pins [] = {3,4,5}. Stup pin-koder
int AC_dim [stift]; Innehar Dimming nivåer (0-128) 0 = på 128 = 0ff
int freqStep = 78. Ange fördröjning för frekvensen av makt (65 för 60Hz, 78 för 50Hz) per steg (med 128 steg)
freqStep kan behöva viss justering beroende på din makt formeln
du behöver till oss är (500000/AC_freq) / NumSteps = freqStep
void setup() {
för (int en = 0; en < stift; a ++) {//set stiften att produktionen
pinMode(AC_pins[a],OUTPUT);
pinCount [a] = 0; håller reda på tiden i cykeln
AC_dim [a] = 0; ljusreglering nivå anges till noll
}
attachInterrupt (0, zero_cross_detect, faller); Tillmäter Pin 2 (avbrott 0) avbrott för noll Cross upptäckt
Serial.BEGIN(9600);
Timer1.Initialize(freqStep); Initiera TimerOne bibliotek för freq vi behöver
Timer1.attachInterrupt (dim_check, freqStep); Använda TimerOne biblioteket för att bifoga ett avbrott
till funktionen använder vi för att kontrollera om det är
rätt tid att avfyra en triac. Denna funktion
kör nu varje freqStep i mikrosekunder.
}
void zero_cross_detect() {/ / funktion för att eldas på noll korsningen
zero_cross = 1; ange flaggan att berätta ljusreglering funktionen noll cross har inträffat
} / / End zero_cross_detect
void dim_check() {/ / funktion kommer brand triac vid rätt tidpunkt
IF(zero_cross == 1) {/ / första kontrollera att noll-korset har hänt annars händer ingenting
för (int en = 0; en < stift; a ++) {
om (pinCount [a] > = AC_dim[a]) {/ / kolla och se om jag har nått ljusreglering värdet vi vill
digitalWrite (AC_pins [a], hög); Brand på Triac
delayMicroseconds(5); Gör en kort paus för att säkerställa triac påslagen
digitalWrite (AC_pins [a], låg); Stänga av Triac grinden (Triac stängs av vid nästa noll cross)
pinCount [a] = 0; Återställa ackumulatorn
zero_cross = 0; Återställa zero_cross så att det kan slås på igen på nästa zero_cross_detect
} annat {
pinCount [a] ++; Om ljusreglering värdet inte har nåtts, incriment räknaren
}
}
}
}
void loop() {
Detta är helt enkelt att göra alla utgångar igenom ljus-mörk, tid med varandra.
för (int jag = 0; jag < 127; i ++) {
för (int en = 0; en < stift; a ++) {
int ii = i + 42. Detta är lite som sätter de blinkande lamporna i synk med varandra
om (ii > 127) ii-= 127;
AC_dim [a] = ii.
}
Delay(50);
}
}