Arduino EL wire controller (ljud aktiverad) (2 / 4 steg)
Steg 2: Arduino kod
Här är koden. Avbrottet sätter en flagga (pbPress) och counter (menuState) mellan 0 - 4. Använda medan (pbPress == 0) {}; Jag bo inom en av följande menyobjekt; Av, ljud, blixt snabbt, Flash långsam, och å. När växeln momentan trycks ett avbrott avfyras, menyn är avancerad ett steg och flaggan pbPress har angetts till 1 vilka raster rutin från de befintliga slingan och startar om programsatsen switch framflyttning till nästa fallet med nästa medan slinga. När menyn är på ljud, mikrokontroller prover ljudsignalen på stift A0 och beräknar om signalen är större än ett av tre värden i matrisen cutOff []. Dessa värden bestämdes empiriskt genom att prova med olika nivåer av omgivande ljud. Artikeln från cutOff [] som används beror på den S2_AUDIO_LEVEL switch position motsvarar 0 - lågt, 1 - MED, och 2 - hög. Förvirrande, motsvarar låga hög känslighet (låga ljud utlösa el tråd på) och så vidare.int triacGatePin = 5; köra el inverter thru optoisolator kontrollera triac
int monitorPin = 0; från mikrofon
för ljudbearbetning
int digInputA = 3; stift för att kontrollera för audio switch position
int digInputB = 4; stift för att kontrollera för audio switch position
int cutOff [] = {70, 110, 260}; värde att jämföra peaktopeak med
CONST int sampleWindow = 50; Provet fönsterbredd i mS (50 mS = 20 Hz)
unsigned int provet;
unsigned int signalMax, peakToPeak = 0;
unsigned int signalMin = 1024;
int menuState = 0; variabel uppdateras av avbrottet
int pbPress = 0;
int triacState = låg;
lång previousMillis = 0;
lång flashInterval = 0;
variabler att hålla reda på tidpunkten för senaste avbryter
volatile osignerade långa button_time = 0;
volatile osignerade långa last_button_time = 0;
void setup() {
pinMode (triacGatePin, produktionen);
pinMode (digInputA, ingång);
pinMode (digInputB, ingång);
Aktivera avbrott 0 (pin 2) som är ansluten till en knapp
hoppa till steg funktionen på fallande kant
attachInterrupt (0, mellanskillnad, faller); Aktivera avbrott för stift 2
}
void loop() {
om (pbPress == 1) {
pbPress = 0;
växel (menuState) {
fall 0: //off
While(pbPress == 0) {
vänta på nästa pbPress
Delay(10);
}
bryta;
fall 1: //audio
While(pbPress == 0) {
int audioLevel = getSwitchState();
samla in data för 50 mS
osignerade långa startMillis = millis(); Start av prov-fönstret
medan (millis() - startMillis < sampleWindow)
{
prov = analogRead(monitorPin);
om (prova < 1024) / / slänga ut falska avläsningar
{
om (prov > signalMax)
{
signalMax = provet; spara bara max nivåerna
}
annars om (prov < signalMin)
{
signalMin = provet; spara bara min nivåerna
}
}
}
peakToPeak = signalMax - signalMin; max - min = topp-topp amplitud
om (peakToPeak > cutOff[audioLevel]) {
slå på led
digitalWrite (triacGatePin, hög);
} annat {
digitalWrite (triacGatePin, låg);
}
resetValues();
}
bryta;
fall 2: //switch snabb bink
flashInterval = 120;
While(pbPress == 0) {
osignerade långa currentMillis = millis();
om (currentMillis - previousMillis > flashInterval) {
spara den senaste gången du blinkade lysdioden
previousMillis = currentMillis;
om lysdioden är stänger den på och vice versa:
om (triacState == låg) {
triacState = hög;
} annat {
triacState = låg;
}
Set LED med triacState av variabeln:
digitalWrite (triacGatePin, triacState);
}
}
bryta;
fall 3: //switch långsam blink
flashInterval = 700;
While(pbPress == 0) {
osignerade långa currentMillis = millis();
om (currentMillis - previousMillis > flashInterval) {
spara den senaste gången du blinkade lysdioden
previousMillis = currentMillis;
om lysdioden är stänger den på och vice versa:
om (triacState == låg) {
triacState = hög;
} annat {
triacState = låg;
}
Set LED med triacState av variabeln:
digitalWrite (triacGatePin, triacState);
}
}
bryta;
fall 4: //switch på
triacState = hög;
digitalWrite (triacGatePin, triacState);
While(pbPress == 0) {
vänta på pbPress
Delay(10);
}
triacState = låg;
digitalWrite (triacGatePin, triacState);
bryta;
}
}
Delay(100);
}
Avbrottstjänstens rutin för avbrott 0
void increment() {
button_time = millis();
Kontrollera om increment() kallades i de sista 250 millisekunder
om (button_time - last_button_time > 250)
{
pbPress = 1;
om (menuState == 4) {
menuState = 0;
} annat {
menuState + = 1;
}
last_button_time = button_time;
}
}
för ljudbearbetning
void resetValues() {
signalMax = 0;
signalMin = 1024;
peakToPeak = 0;
}
int getSwitchState() {
int pin2 = digitalRead(digInputA);
int pin3 = digitalRead(digInputB);
om (pin2 == 0) {
tillbaka 1. Medelhög volym
}
IF(PIN3 == 0) {
returnera 2. Hög volym;
} annat {
Return 0; Låg volym;
}
}