Handgjorda Arduino-powered RGB Moodlamp (5 / 7 steg)
Steg 5: Kod:
Jag började med "Spooky projekt" och "BionicArduino" av TodEKurt för några månader sedan.
http://todbot.com/blog/spookyarduino/
Min kod är bara en knepig kombination av hans projektkod.
"RGBMoodlight", "RGBPotMixer"
och vissa tillägg.
Tre analog-i och.
en digital-i som mode-omkopplaren (tack vare Ju. för avbrott-rutin :).
Lysdioderna är anslutna till D9, D10 och D11 som stöder PulseWithModulation.
Om du vill, jag kan publicera skissen, men det är en riktigt kalt kombination av dessa två stora koder.
Här är min ursprungliga koden av lampan.
Det ser lite rörigt, eftersom det var min mycket tidigt stadium i programmering...
Men om du kopierar det, bör det fungera bra.
Det finns fina peaces, som "PotColorMixer", "RGBfadingFunction" och avbryta-rutin för mode-reglaget.
/ * nejo June2008
- Koden för min "Moodlamp", baserad på "dimmingLEDs" av Clay Shirky < clay.shirky
* nejo Sep2008
- Slutliga kod för moodlamp med avbrott-läge-switch, analog kortnummer för RGB-fading och RGB-färg ändras.
- Mörkläggning-funktionen fungerar bara för den vita färgen
* nejo October2008
- Ljud-förlängning för moodlamp:
- En Kondensor mikrofon med en liten LM368 Amp, en recifier och ett RC-low-pass-filter
- med en annan analogInput använder jag RGBPotMixer-funktionen för att ändra färg genom att få mic-signalen.
*
*
-Koden för toning 3 lysdioder, röd, grön och blå eller en tri-color LED, med PWM
- Programmet cross-fades långsamt från rött till grönt, grönt till blått och blått till rött
- Felsökning koden förutsätter Arduino 0004, eftersom den använder den nya Serial.begin ()-stil funktioner
- Ursprungligen "dimmingLEDs" av Clay Shirky < clay.shirky
*
- AnalogRead är aktiverad på Pin A0 att variera RGB blekning hastigheten
- AnalogRead är aktiverad på Pin A2 att variera hueRGB färg
*
*
*/
#include < avr/interrupt.h >
Utgång
int ledPin = 13. controlPin för felsökning
int redPin = 9; Röd lysdiod, ansluten till digital pin 9
int greenPin = 10; Grön LED, ansluten till digital stift 10
int bluePin = 11; Blå LED, ansluten till digital stift 11
int dimredPin = 3; Stift för analog ljusreglering värde, ansluten till transistorn föraren
int dimgreenPin = 5;
int dimbluePin = 6;
Ingång
int switchPin = 2; Switch är ansluten till stift D2
int val = 0; variabel för att läsa pin status
int buttonState; variabel att hålla knappen staten
int buttonPresses = 0; 3 pressar att gå!
int potPin0 = 0; Potten för att justera fördröjningen mellan blekning i Moodlamp;
int potPin2 = 2; Potentiometer utgång ändra hueRGB färg
int potVal = 0; Variabel att lagra input från potentiometern
int maxVal = 0; värdet att spara ljusreglering faktor standard är 255, om ingen potten är ansluten
int dimPin = 4; Potten ansluten till A4 till dim ljusstyrkan
Programmet variabler
int redVal = 255; Variabler för att lagra värden att skicka till stiften
int greenVal = 1; Startvärdena är röda full, gröna och blå av
int blueVal = 1;
int jag = 0; Loop counter
int vänta; / / = 15. 50 ms (.05 sekund) försening. förkorta för snabbare bleknar
int k = 0; värde för den kontrollerade i blink-funktionen
int DEBUG = 0; FELSÖKA counter; om satt till 1, kommer skriva värden tillbaka via seriell
int LCD = 0; LCD counter; om satt till 1, kommer skriva värden tillbaka via seriell
void setup()
{
pinMode (ledPin, produktionen);
pinMode (redPin, produktionen); ställer in stiften som utgång
pinMode (greenPin, produktionen);
pinMode (bluePin, produktionen);
pinMode(dimredPin,OUTPUT);
pinMode(dimgreenPin,OUTPUT); ställer in stiften som utgång
pinMode(dimbluePin,OUTPUT);
pinMode (potPin2, ingång); //
pinMode (potPin0, ingång); //
pinMode (dimPin, ingång); //
pinMode (switchPin, ingång); Ställ switch stiftet som indata
attachInterrupt(0,isr0,RISING);
om (DEBUG) {/ / om vi vill se pin värden för felsökning...
Serial.BEGIN(9600); .. .set upp den seriella ouput på 0004 stil
}
}
Huvudprogrammet
void loop()
{
om (buttonPresses == 0) {
Moodlamp(); anropar funktionen Moodlight
}
om (buttonPresses == 1) {
RGBPotMixer(); anropar funktionen manuel mix
}
om (buttonPresses == 2) {
White(); Det är helt vitt här
}
om (buttonPresses == 3) {
}
Moodlamp();
RGBPotMixer();
White();
Monitor();
Dim();
}
void Monitor() {/ / skicka staten till bildskärmen
om (DEBUG) {/ / om vi vill läsa utdata
DEBUG + = 1; Ökar värdet för räknaren DEBUG
om (FELSÖKA > 10) {/ / Skriv ut varje 10 varv
FELSÖKA = 1; Nollställa räknaren
Serial.Print(i); Seriella kommandon i 0004 stil
Serial.Print("\t"); Skriva ut en flik
Serial.Print("R:"); Ange att utdata är röd värde
Serial.Print(redVal); Skriva ut röd värde
Serial.Print("\t"); Skriva ut en flik
Serial.Print("G:"); Upprepa för grönt och blått...
Serial.Print(greenVal);
Serial.Print("\t");
Serial.Print("B:");
Serial.Print(blueVal); println, att avslutas med en radmatning
Serial.Print("\t");
Serial.Print("dimValue:");
Serial.Print(maxVal); println, att avslutas med en radmatning
Serial.Print("\t");
Serial.Print("Wait:");
Serial.Print(Wait); skriver värdet av potPin0 till bildskärmen
Serial.Print("\t");
Serial.Print("hueRGBvalue");
Serial.Print(potVal); skriver värdet av potPin0 till bildskärmen
Serial.Print("\t");
Serial.Print("buttonState:");
Serial.Print(buttonState); skriver värdet av potPin0 till bildskärmen
Serial.Print("\t");
Serial.Print("buttonPresses:");
Serial.println(buttonPresses); skriver värdet av buttonPresses till bildskärmen
}
}
}
void dim() / / funktion för ljusreglering vit / / kanske senare för alla lägen
{
maxVal = analogRead(dimPin);
maxVal = 4. Analoga utbud från 0..1024--> för mycket för ljusreglering 0..255 värdet
analogWrite(dimredPin,maxVal);
analogWrite(dimgreenPin,maxVal);
analogWrite(dimbluePin,maxVal);
}
void Moodlamp()
{
vänta = analogRead(potPin0); Leta efter värdet från potPin0;
om ingen potten är ansluten: vänta 255
Jag + = 1; Increment counter
jag = i - maxVal;
om (jag < 255) / / första fasen av bleknar
{
redVal-= 1; Red ner
greenVal + = 1; Grön upp
blueVal = 1; Blå låg
}
annars om (jag < 509) / / andra fasen av bleknar
{
redVal = 1; Röd låg
greenVal-= 1; Grön ner
blueVal + = 1; Blå upp
}
annars om (jag < 763) / / tredje fasen av bleknar
{
redVal + = 1; Red upp
greenVal = 1; Gröna lo2
blueVal-= 1; Blå ner
}
annat / / åter-ställa räknaren, och starta bleknar igen
{
Jag = 1;
}
Vi gör "255-redVal" i stället för bara "redVal" eftersom den
Lysdioder är hooked upp till + 5V istället för Gnd
analogWrite (redPin, 255 - redVal); Skriv aktuella värden till LED stift
analogWrite (greenPin, 255 - greenVal);
analogWrite (bluePin, 255 - blueVal);
/ * dimredVal = min (redVal - maxVal, 255); ljusreglering
dimredVal = max (redVal - maxVal, 0);
dimgreenVal = min (greenVal - maxVal, 255);
dimgreenVal = max (greenVal - maxVal, 0);
dimblueVal = min (blueVal - maxVal, 255);
dimblueVal = max (blueVal - maxVal, 0);
analogWrite (redPin, 255 - dimredVal); Skriv aktuella värden till LED stift
analogWrite (greenPin, 255 - dimgreenVal);
analogWrite (bluePin, 255 - dimblueVal);
*/
vänta / = 4.
Delay(Wait); Paus för "vänta" millisekunder innan återuppta slingan
}
void RGBPotMixer()
{
potVal = analogRead(potPin2); Läs potentiometer värdet vid ingångsstiftet
potVal = potVal / 4; konvertera från 0-1023 till 0-255
hue_to_rgb (potVal); behandla potVal som nyans och konvertera till rgb vals
"255-" är att vi har gemensamma-anod lysdioder, inte common-katod
analogWrite (redPin, 255-redVal); Skriva värden till LED stift
analogWrite (greenPin, 255-greenVal);
analogWrite (bluePin, 255-blueVal);
}
void White() {
analogWrite (redPin, maxVal); Skriva värden till LED stift
analogWrite (greenPin, maxVal);
analogWrite (bluePin, maxVal);
}
/*
- Med tanke på en variabel nyans "h", som sträcker sig från 0-252,
- rätt inställda RGB-färgvärde.
- Utgår från maxValimum mättnad & högsta värde (ljusstyrka)
- Utför rent heltal matte, ingen flyttal.
*/
void hue_to_rgb(byte hue)
{
om (nyans > 252) nyans = 252; stetback till 252! nejo
byte hd = hue / 42; 36 == 252/7, 252 == H_MAX
byte Hej = hd % 6. ger 0-5
byte f = hue % 42.
byte fs = f * 6.
Växla (Hej) {
fall 0:
redVal = 252; greenVal = fs; blueVal = 0;
bryta;
fall 1:
redVal = 252-fs; greenVal = 252; blueVal = 0;
bryta;
fall 2:
redVal = 0; greenVal = 252; blueVal = fs;
bryta;
fall 3:
redVal = 0; greenVal = 252-fs; blueVal = 252;
bryta;
fall 4:
redVal = fs; greenVal = 0; blueVal = 252;
bryta;
fall 5:
redVal = 252; greenVal = 0; blueVal = 252-fs;
bryta;
}
}
void isr0() {
Serial.println ("\n \n inerrupt \n");
buttonState = digitalRead(switchPin); Läs det ursprungliga tillståndet
delayMicroseconds(100000);
om (val! = buttonState) {/ / knappen staten har förändrats!
om (buttonState == hög) {/ / kolla om knappen trycks nu
buttonPresses ++;
// }
Val = buttonState; spara den nya staten i våra variabel
om (buttonPresses == 3) {/ / zur cksetzen
buttonPresses = 0;
}
}
// }
Nästa steg var transistor-drivrutinerna. Jag använde 3 PNP transistorer med en maximal ström på 3 Ampere. Efter framåt-ström och spänning reglerades, fungerade LEDemitter bra med full intensitet.