EL Wire hatt: Sekvenserade och ljud aktiverat med fjärrkontroll - drivs med Arduino och Sparkfun (7 / 8 steg)
Steg 7: Funktionalitet och koden
FunktionalitetKoden är ganska självförklarande och (tror jag för att vara) relativt väl kommenterade. Det finns också en följetong println kommando på varje steg på vägen för felsökning speciellt om du behöver justera koden för kalibrering av potentiometern.
När du slår upp enheten, kommer att EL kabeln "initiera." Med andra ord, blinkar de varje en gång i ordningsföljd, från stift 2 till stift 9.
Vi är nu i ett vänteläge tills på mode-knappen trycks. Varje tryck på knappen mode växlar genom en annan sekvens och blinkar Mode-LED (röd) en gång, så att operatören kan bekräfta en lägesändring (som operatören bär hatten).
Det finns 7 sekvenser som loopas kontinuerligt mellan läget ändras. Under dessa lägen, om operatören justerar potentiometern, ändras hastigheten på sekvensen.
Sekvenserade lägen
Läge 1 - steg igenom alla
Läge 2 - fylla upp från botten sedan tom från botten
Läge 3 - upp och ner
Läge 4 - svep i botten till toppen, sopa ut uppifrån och ned
Läge 5 - Stack och unstack
Läge 6 - suppleant blinkande
Läge 7 - Criss cross
Sund Sensor läge
Läge 8 - när du når detta läge läget ledde med flash 10 gånger snabbt för att låta dig veta att du är i detta speciella läge.
Potentiometern blir nu din ljudkänslighet kontroll.
Alla sekvenser
Läge 9 - Detta avslutar ljudläge och går kontinuerligt igenom flera slingor för varje steg från 1 till 7 (kontrollera på potentiometern är nu aktiv). När du trycker på knappen Mode, återvänder vi till läge 1.
KODEN
All kod som Arduino är både nedan och bifogade.
Instructables gör det glöda 2012 hatt Sequencer
ARDUINO UNO Rev. 3 + SPARKFUN EL Escudo Dos
//
=== DELAR och CONFIG ===
EL Escudo Dos: Shield monterad på Arduino UNO Rev. 3
EL Wire: Ansluten till El Escudo Dos på digitala ut Digital stift 2 -> 9(OUTPUT)
LED-indikator: anger lägesändring och sund upptäckt Pin-13(OUTPUT)
Momentan switch: läge switcher (normalt öppen) ansluten till Digital Pin 11(INPUT)
Potentiometer: Hastighet/ljud kontroll som är kopplad till Analog 0
DFRobot ljud Sensor: Mikrofonljudet Sensor kopplad till Analog 2
Skrivet av: Dovadil
DISCAIMER: Jag är mycket amatör programmerare, så snälla Döm inte förmodligen onödigt komplicerat koden.
Jag hade en idé och gjort det hända. Jag hoppas du kan använda delar av detta för ditt eget projekt.
DELA DEN!
konstanter för tryck på knapp ingång och 1 ledde produktion
CONST int buttonPin = 11; numrera av tryckknapp PIN-koden
CONST int ledPin = 13. antal LED stift
const_variable för kruka och ljud Sensor
CONST int analogInPin = A0; Analog ingång pin som potentiometern är kopplad till
CONST int analogInPinSound = A2; Analog ingång ljud Sensor
int potValue = 0; värdet läsa från potten
int tid = 100; tidsintervall
varibales
Boolean initiera = sant;
int buttonState = 0; variabel för att läsa tryckknapp status
int läge = 0;
int soundVal = 0;
int soundPotThresholdValue = 0;
int soundSensitivityLimit = 0;
int x;
int y;
int z;
void setup()
{
initiera seriell kommunikation på 9600 bps:
Serial.BEGIN(9600);
EL-kanaler är på stift 2 till 9
Initiera stiften som utgångar
pinMode (2, utgång); kanal A
pinMode (3, OUTPUT); kanal B
pinMode (4, OUTPUT); kanal C
pinMode (5, OUTPUT); kanal D
pinMode (6, OUTPUT); kanalen E
pinMode (7, OUTPUT); Channel F
pinMode (8, OUTPUT); kanalen G
pinMode (9, OUTPUT); Channel H
Vi har också två status lysdioder, stift 10 på Escudo,
pinMode (10, OUTPUT);
och ledPin (stift 13) på Arduino sig
pinMode (ledPin, produktionen);
pinMode (buttonPin, ingång);
}
void loop()
{
Starta program med en enda körning av LED-belysning
om (initiera == true)
{
Delay(10);
Serial.println("");
Serial.println("");
Serial.println("Initialising...");
Serial.println("");
int status;
Gå igenom alla åtta EL kanaler (stift 2 till 9)
för (x = 2; x < = 9; x ++)
{
digitalWrite (ledPin, hög); Aktivera LED
digitalWrite (x, hög); Aktivera kanalen EL
Delay(100); vänta för 1/10 sekund
digitalWrite (ledPin, låg); Inaktivera LED
digitalWrite (x, låg); Inaktivera EL kanalen
Delay(50); vänta för 1/10 sekund
digitalWrite (ledPin, hög); Aktivera LED
digitalWrite (x, hög); Aktivera kanalen EL
Delay(100); vänta för 1/10 sekund
digitalWrite (ledPin, låg); Inaktivera LED
digitalWrite (x, låg); Inaktivera EL kanalen
Delay(50);
avbryts körningen av initiering efter en iteration
initialisera = false;
}
Serial.println("");
Serial.println ("initiering gjort!");
Serial.println ("väntar läge trigger");
}
detail();
=== LÄGE 1 (steg igenom alla åtta EL kanaler) ===
om (läge == 1)
{
Gå igenom alla åtta EL kanaler (stift 2 till 9)
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, hög); Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
digitalWrite (x, låg); Inaktivera EL kanalen
}
}
=== LÄGE 2 (fyll upp från botten då tom från botten) ===
om (läge == 2)
{
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, hög); Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
}
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, låg); Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
}
}
=== LÄGE 3 (upp ner upp ner) ===
om (läge == 3)
{
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, hög); Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
digitalWrite (x, låg); Inaktivera EL kanalen
}
för (x = 2; x < = 9; x ++)
{
detail();
y = 11-x;
digitalWrite (y, hög) Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
digitalWrite (y, låg) Inaktivera EL kanalen
}
}
=== LEVERANSSÄTT 4 (sopa i botten till toppen, sopa ut uppifrån och ned) ===
om (läge == 4)
{
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, hög);
Delay(Time);
}
för (x = 9; x > = 2; x--)
{
detail();
digitalWrite (x, låg);
Delay(Time);
}
}
=== LÄGE 5 (stapla och unstack) ===
om (läge == 5)
{
för (x = 2; x < = 9; x ++)
{
för (y = 9; y > = x; y--)
{
digitalWrite (y, hög)
Delay(Time);
digitalWrite (y, låg)
detail();
}
digitalWrite (x, hög);
}
för (x = 9; x > = 2; x--)
{
för (y = x; y < = 9; y ++)
{
digitalWrite (y, hög)
Delay(Time);
digitalWrite (y, låg)
detail();
}
}
digitalWrite (y, låg)
Delay(Time+20);
}
=== LÄGE 6 (alternativa blinkar) ===
om (läge == 6)
{
detail();
digitalWrite (2, hög).
digitalWrite (4, hög).
digitalWrite (6, hög).
digitalWrite 8, hög.
Delay(Time+75);
detail();
digitalWrite (2, låg).
digitalWrite (4, låg).
digitalWrite (6, låg).
digitalWrite 8, låg.
digitalWrite (3, hög).
digitalWrite 5, hög,
digitalWrite (7, hög).
digitalWrite (9, hög).
Delay(Time+75);
detail();
digitalWrite (3, låg).
digitalWrite (5, låg).
digitalWrite (7, låg).
digitalWrite (9, låg).
}
=== LÄGE 7 (criss cross) ===
om (läge == 7)
{
för (x = 2; x < = 9; x ++)
{
y = 11-x;
digitalWrite (x, hög); Aktivera LED (HIGH är spänningsnivån)
digitalWrite (y, hög) Aktivera LED (HIGH är spänningsnivån)
om (x == 5)
{
Delay(Time/2);
}
annat
{
Delay(Time);
}
digitalWrite (x, låg);
digitalWrite (y, låg)
detail();
}
}
=== LÄGE 8 (ljudläge) ===
om (läge == 8)
{
Ljudtest
detailSound();
om ((soundVal,DEC) == 512)
{
ljud flash upp
för (x = 2; x < = 9; x ++)
{
digitalWrite (x, hög);
Delay(40);
}
för (x = 9; x > = 2; x--)
{
digitalWrite (x, låg);
Delay(40);
}
}
}
//=================MODE 9 ==================
om (läge == 9)
{
runAllSequences();
}
//=================MODE 10 ==================
om (läge == 10)
{
}
}
// =========================================
=== FUNGERAR ===
// =========================================
void detail()
{
läsa analogt värde och karta den till intervallet för tiden
om ((mode == 8) || (mode == 0)) om inte i ljudläge, eller om programmet inte har bara börjat
{
gör ingenting
}
annat
{
om ((potValue! = analogRead(analogInPin))) //pot ändras inte
{
tid = karta (potValue, 0, 1024, 40, 200);
skriva ut resultatet till seriell bildskärmen:
Serial.Print ("\n Potentiometer =");
Serial.Print(potValue);
Serial.Print ("\t tidsfördröjning =");
Serial.Print(Time);
Serial.Print ("MS");
vänta 2 millisekunder innan nästa slingan
för analog till digital omvandlare att bosätta sig
efter den sista behandlingen:
Delay(2);
potValue = analogRead(analogInPin);
}
}
Läs statligt av tryckknapp värdet:
buttonState = digitalRead(buttonPin);
om (buttonState == hög)
{
buttonPressed();
digitalWrite (ledPin, låg);
}
}
void detailSound()
{
soundPotThresholdValue = analogRead(analogInPin); tröskel
soundSensitivityLimit = karta (soundPotThresholdValue, 0, 1024, 0, 512);
soundVal=analogRead(analogInPinSound); faktiska ljud värdet
om (soundVal > soundSensitivityLimit)
{
Serial.Print ("\n tröskelvärdet =");
Serial.println(soundSensitivityLimit);
Serial.Print ("\n ljud ingång nivå =");
Serial.println(soundVal);
digitalWrite (ledPin, hög);
för (x = 2; x < = 9; x ++)
{
digitalWrite (x, hög);
Delay(15);
}
för (x = 2; x < = 9; x ++)
{
digitalWrite (x, låg);
Delay(15);
}
}
digitalWrite (ledPin, låg);
Delay(10);
}
void buttonPressed()
{
digitalWrite (ledPin, hög);
Delay(300); paus för att styra programmet. att säkerställa enda lägesändring
läge = läge + 1. Increment läge
om (läge > 9) / / om läget är större än 9, starta från läge 1
{
läge = 1;
Serial.println("");
Serial.println ("återställa läget sekvens");
Serial.println("");
för (x = 0; x < = 3; x ++)
{
digitalWrite (ledPin, låg);
Delay(100);
digitalWrite (ledPin, hög);
Delay(100);
digitalWrite (ledPin, låg);
}
}
Serial.println("");
Serial.println("");
Serial.println ("knappen");
Serial.Print ("läge:");
Serial.Print(mode);
Serial.println("");
för (x = 2; x < = 9; x ++) //turn alla kanaler-reset för nästa slinga
{
digitalWrite (x, låg);
}
om läget är ljudläge, blink ledde 10 gånger snabbt
om (läge == 8) //sound
{
för (x = 0; x < = 10; x ++) //turn alla kanaler-reset för nästa slinga
{
digitalWrite (ledPin, hög);
Delay(50);
digitalWrite (ledPin, låg);
Delay(25);
}
}
}
void runAllSequences()
{
=== LÄGE 1 (steg igenom alla 8 kanaler) ===
för (z = 0; z < = 7; z ++) //because detta är relativt kort sekvens, gör det några gånger gånger
{
Gå igenom alla åtta EL kanaler (stift 2 till 9)
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, hög); Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
digitalWrite (x, låg); Inaktivera EL kanalen
}
}
för (x = 2; x < = 9; x ++) //turn alla kanaler-reset för nästa slinga
{
digitalWrite (x, låg);
}
=== LÄGE 2 (fyll upp från botten då tom från botten) ===
för (z = 0; z < = 3; z ++) //because detta är relativt kort sekvens, gör det några gånger gånger
{
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, hög); Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
}
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, låg); Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
}
}
för (x = 2; x < = 9; x ++) //turn alla kanaler-reset för nästa slinga
{
digitalWrite (x, låg);
}
=== LÄGE 3 (upp ner upp ner) ===
för (z = 0; z < = 3; z ++) //because detta är relativt kort sekvens, gör det några gånger gånger
{
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, hög); Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
digitalWrite (x, låg); Inaktivera EL kanalen
}
för (x = 2; x < = 9; x ++)
{
detail();
y = 11-x;
digitalWrite (y, hög) Aktivera kanalen EL
Delay(Time); vänta för 1/10 sekund
digitalWrite (y, låg) Inaktivera EL kanalen
}
}
för (x = 2; x < = 9; x ++) //turn alla kanaler-reset för nästa slinga
{
digitalWrite (x, låg);
}
=== LEVERANSSÄTT 4 (sopa i botten till toppen, sopa ut uppifrån och ned) ===
för (z = 0; z < = 3; z ++) //because detta är relativt kort sekvens, gör det några gånger gånger
{
för (x = 2; x < = 9; x ++)
{
detail();
digitalWrite (x, hög);
Delay(Time);
}
för (x = 9; x > = 2; x--)
{
detail();
digitalWrite (x, låg);
Delay(Time);
}
}
för (x = 2; x < = 9; x ++) //turn alla kanaler-reset för nästa slinga
{
digitalWrite (x, låg);
}
=== LÄGE 5 (stapla och unstack) ===
för (z = 0; z < = 3; z ++) //because detta är relativt kort sekvens, gör det några gånger gånger
{
för (x = 2; x < = 9; x ++)
{
för (y = 9; y > = x; y--)
{
digitalWrite (y, hög)
Delay(Time);
digitalWrite (y, låg)
detail();
}
digitalWrite (x, hög);
}
för (x = 9; x > = 2; x--)
{
för (y = x; y < = 9; y ++)
{
digitalWrite (y, hög)
Delay(Time);
digitalWrite (y, låg)
detail();
}
}
digitalWrite (y, låg)
Delay(Time+20);
}
för (x = 2; x < = 9; x ++) //turn alla kanaler-reset för nästa slinga
{
digitalWrite (x, låg);
}
=== LÄGE 6 (alternativa blinkar) ===
för (z = 0; z < = 10; z ++) //because detta är en kort sekvens, gör det kanske gånger
{
detail();
digitalWrite (2, hög).
digitalWrite (4, hög).
digitalWrite (6, hög).
digitalWrite 8, hög.
Delay(Time+75);
detail();
digitalWrite (2, låg).
digitalWrite (4, låg).
digitalWrite (6, låg).
digitalWrite 8, låg.
digitalWrite (3, hög).
digitalWrite 5, hög,
digitalWrite (7, hög).
digitalWrite (9, hög).
Delay(Time+75);
detail();
digitalWrite (3, låg).
digitalWrite (5, låg).
digitalWrite (7, låg).
digitalWrite (9, låg).
}
för (x = 2; x < = 9; x ++) //turn alla kanaler-reset för nästa slinga
{
digitalWrite (x, låg);
}
=== LÄGE 7 (criss cross) ===
för (z = 0; z < = 10; z ++) //because detta är en kort sekvens, gör det kanske gånger
{
för (x = 2; x < = 9; x ++)
{
y = 11-x;
digitalWrite (x, hög); Aktivera LED (HIGH är spänningsnivån)
digitalWrite (y, hög) Aktivera LED (HIGH är spänningsnivån)
om (x == 5)
{
Delay(Time/2);
}
annat
{
Delay(Time);
}
digitalWrite (x, låg);
digitalWrite (y, låg)
detail();
}
}
för (x = 2; x < = 9; x ++) //turn alla kanaler-reset för nästa slinga
{
digitalWrite (x, låg);
}
}