Arduino kontrollerade blinkande Fairy julbelysningen med Jingle Bells (10 / 12 steg)
Steg 10: Testa reläet
Du behöver:- USB-kabel
Vi kan lägga till i ett mellanliggande steg för att kontrollera att Relay sköld fungerar.
- Koppla högtalare anslutning till sköld (detta är bara tillfälligt så att vi kan höra reläet växlar)
- Ladda upp koden till din Arduino
- Tryck på knappen på din skärbräda.
- Du bör höra reläer klicka på och av (visas i videon). Du kan behöva wiggle stiften koppla relä skölden till Arduino lite tills båda kavlarna är att klicka på och av alternativt.
- När vi vet detta är arbetar vi kan koppla in högtalarna igen.
#define C 2100
#define D 1870
#define E 1670
#define f 1580 / / verkar inte gillar versalt F
#define G 1400
Definiera en särskild anmärkning, "R", som representerar en vila
#define R 0
// SETUP ============================================
Ställ in högtalare på en PWM stift (digital 9, 10 eller 11)
int speakerOut = 9;
int grön = 4;
int rött = 7.
int buttonPin = 2;
void setup() {
pinMode (speakerOut, produktionen);
pinMode (grön, utgång);
pinMode (röd, produktionen);
pinMode (buttonPin, ingång);
digitalWrite (grön, låg);
}
KNAPPEN
Variabler som ändras:
int å = låg; det aktuella läget för utgångsstiftet
int buttonState; den nuvarande behandlingen från ingångsstiftet
int lastButtonState = låg; den föregående behandlingen från ingångsstiftet
följande variabler är lång eftersom tiden, i millisekunder,
kommer snabbt att bli ett större antal än kan lagras i en int.
lång lastDebounceTime = 0; sista gången utgångsstiftet var växlas
lång debounceDelay = 50; debounce tiden; öka om utdata flimrar
MELODI och TIMING ===
Melody [] är en matris av anteckningar, tillsammans med beats [],
som sätter varje ton relativa längd (högre #, längre anteckning)
int melodi [] = {E, E, E, R,
E, E, E, R,
E, G, C, D, E, R,
f, f, f, f, f, E, E, E, E, D, D, E, D, R, G, R,
E, E, E, R,
E, E, E, R,
E, G, C, D, E, R,
f, f, f, f, f, E, E, E, G, G, f, D, C, R};
int MAX_COUNT = sizeof(melody) / 2; Melody längd, för looping.
Ange övergripande tempo
långa tempo = 10000;
Ange längden på paus mellan anteckningar
int paus = 1000;
Loop variabel att öka resten längd
int rest_count = 30.
Initiera core variabler
int tone_ = 0;
int slå = 0;
lång varaktighet = 0;
// PLAY TONE ==============================================
Puls talaren att spela en ton för en viss varaktighet
Annullera playTone (int färg) {
lång elapsed_time = 0;
om (tone_ > 0) {/ / om detta inte är en resten beat, medan tonen har
digitalWrite (färg, hög).
spelat mindre långt än "varaktighet", puls högtalare hög och låg
medan (elapsed_time < varaktighet) {
digitalWrite(speakerOut,HIGH);
delayMicroseconds(tone_ / 2);
NED
digitalWrite (speakerOut, låg);
delayMicroseconds(tone_ / 2);
Hålla reda på hur länge vi pulsade
elapsed_time += (tone_);
}
digitalWrite (färg, låg).
}
annat {/ / resten slå, loop gånger försenar
digitalWrite (färg, hög).
för (int j = 0; j < rest_count; j ++) {/ / se anmärkning på rest_count
delayMicroseconds(duration);
}
digitalWrite (färg, låg).
}
}
int färg = grön,
void jingleBells(int i) {
Ställ in en räknare för att dra från melody [] och [slag]
tone_ = melodi [i];
slå = 50;
längd = beat * tempo; Ställ in timing
IF(Colour == Green) {
färg = röd;
playTone(red);
} annat {
färg = grön,
playTone(green);
}
En paus mellan anteckningar...
delayMicroseconds(pause);
}
void checkOn (int läsning) {
Kontrollera om du bara tryckt på knappen
(dvs. indata gick från låg till hög), och du har väntat
tillräckligt länge sedan den senaste pressen att ignorera något buller:
Om växeln ändras, på grund av buller eller trycka:
om (läsa! = lastButtonState) {
nollställa debouncing timern
lastDebounceTime = millis();
växlar mellan variabeln ledState varje gång knappen trycks
om (buttonState == hög) {
on =!.
}
}
om ((millis()-lastDebounceTime) > debounceDelay) {
oavsett läsning är på, har det varit där för längre
än debounce förseningen, så ta det som det faktiska nuvarande läget:
buttonState = behandlingen.
}
}
LÅT VILDA BRÅK BÖRJA ===
void loop() {
Läs statligt av växeln till en lokal variabel:
int läsa = digitalRead(buttonPin);
checkOn(reading);
IF(on) {
för (int jag = 0; jag < MAX_COUNT; i ++) {
int loopReading = digitalRead(buttonPin);
jingleBells(i);
om (loopReading! = läsning) {
on =!.
bryta;
}
}
}
Spara behandlingen. Nästa gång genom öglan,
det blir lastButtonState:
lastButtonState = behandlingen.
}