Fjärrstyrda Arduino stämningsbelysning (3 / 6 steg)
Steg 3: Koden
I skrivande stund här, jag antar att byggaren vet hur att lägga till ett bibliotek i sin Arduino utvecklingsmiljö. Måste du lägga till två bibliotek. Här är en Instructable som hjälper dig komma igång med en IR-mottagare.
Koden gör användningen av två krävs bibliotek, och en tredje valfritt bibliotek som jag alltid använder när felsökning. Streaming biblioteket tillåter snabb en rad uttalanden som kan skickas till konsolen terminal.
Utmärkt IRLib biblioteket är en förbättring över flera andra IR bibliotek eftersom det kapslar in funktionalitet på ett sätt som endast kräver ett par rader att få IR funktionalitet. Den har också stöd för IR överföring, som jag inte använder i detta projekt. Det är mycket väl dokumenterat, och ett exempel på bra, snäva kod. Här är definitivt en att hålla i din väska tricks.
Det finns ett företag som gör ljuset remsor med samma chip används av Radio Shack (RIP) remsan. Deras bibliotek, PololuLedStrip, ger en lätt-till-använda gräns flat till någon remsa som använder TM1804 chip. Pololu biblioteket stöder också andra marker används av de flesta nuvarande LED strips.
Koden är kommenterade, men det finns vissa saker att påpeka:
- Array presetColor är en lista med färger som ska läsas när du trycker på en knapp på fjärrkontrollen. Jag programmerade detta till "Play"-knappen på min, men kan du tilldela det till vad du vill. Dessa betecknas som RGB-värden, {255, 255, 255} att vara ljusaste vita och {0, 64, 0} är en dimmer green, till exempel. Du kan skapa så många förinställningar som du vill. Observera att varje andra förinställda {0,0,0}, som i huvudsak gör av belysningen. Det är trevligt att snabbt stänga saker för sömnig-tid.
- I funktionen loop() ser du IR dekodern kallas. Det finns flera olika typer av infraröda fjärrkontroller ute och IRLib biblioteket kan hitta många av dem. Måste du spela med denna kod för att se exakt vad din fjärrkontroll skicka så att du kan isolera koderna och tilldela dem till funktionalitet i ditt program. Det finns utmärkta dokumentation i en PDF-fil i biblioteket för att hjälpa dig.
- Denna särskilda fjärrkontroll levererar ett unikt värde för varje knapp tryckte, men när knappen hålls, skickar värdet 0xFFFFFFFF. Allt vi behöver göra är att komma ihåg föregående kod skickas och när han såg alla F, bearbeta bara det sista värdet.
- Det finns en liten funktion, playTone, som skickar pulser ut till högtalaren. Arduino utvecklingsmiljön har en testton-funktionen, men den använder avbrott. Tyvärr används de samma avbrott av IRLib biblioteket, så vi inte kan använda tonen och IRLib i samma skiss utan betydande ändringar av biblioteken. Denna enkla funktion gör allt vi behöver för denna enkla applikation utan avbrott. Vet att ju högre siffra, desto lägre tonen.
- Jag har två fjärrkontroller som ser identiska, men de ger olika koder för varje knapp. Det är inget problem när vi använder magi C switch/fall struktur. Du kommer att märka två fall för varje block. Detta anger koderna skickas med varje remote. Jag kunde tänkas har ett dussin fjärrkontroller, var att ge en annan kod och fånga dem alla med denna metod.
- Den upp och ner för justera ljusstyrka och höger och vänster knapparna gå igenom färghjulet.
- På "Menu"-knappen startar hjulet färgläget. Tanken är att du Använd upp/ned/höger/vänster för att få startfärgen och tryck på knappen meny. Färgerna kommer att börja ändra, kör hela vägen runt färghjulet tills en annan tangent trycks. Detta ger en avkopplande stämningsbelysning om du gillar sådana saker.
- "Play"-knappen ger snabb tillgång till förinställda färgerna som nämndes tidigare.
- Programmet sveper upp med konverteringsfunktioner för att konvertera mellan RGB och HSV.
Stiften som jag använde var mest för bekvämlighet eller vana. Du kan ändra stiften som de olika delarna är ansluten så länge du gör lämpliga ändringar i koden.
HeadboardLight.h
TypeDef struct hsv_color
{
int h;
dubbel-s, v.
} hsv_color;
HeadboardLight.ino
HeadboardLight.ino
IRLib.h från IRLib – en Arduino bibliotek för IR kodning och avkodning < br > / / Version 1.5 juni 2014
Copyright 2014 av Chris Young < en href = "http://cyborg5.com" rel = "nofollow" > http://cyborg5.com</a>
#include < IRLib.h >
Streaming.h - Arduino bibliotek för att stödja den << streaming operatör
Copyright (c) 2010-2012 Mikal Hart. Alla rättigheter reserverade.
#include < Streaming.h > / / behändigt bibliotek för att underlätta felsökning uttalanden
Pololu LED strip bibliotek. Tillgänglig från < en href = "https://github.com/pololu/pololu-led-strip-arduino" rel = "nofollow" > http://cyborg5.com</a>
#include < PololuLedStrip.h > / / bibliotek för ljus remsa
#include "HeadboardLight.h" / / include-filen för detta projekt
#define DEBUG / / globala debug förklaring. avkommentera för att omfatta debug-kod
Skapa en mottagare objekt för att lyssna på stift 11
IRrecv My_Receiver(9);
IRdecode My_Decoder;
osignerade långa värde;
osignerade långa last_value;
int j;
Skapa en ledStrip objekt på stift 12.
PololuLedStrip < 12 > ledStrip;
int onboard_led = 13. bara för feedback så att får vi något
Skapa en buffert för att hålla 10 färger. Tar 30 byte.
#define LED_COUNT 10
rgb_color färger [LED_COUNT];
rgb_color färg;
Det finns två färg standard används här. RGB-enheter ljusa remsan,
men HSV är mer praktiskt för att göra färg hjul progressioner. Det
finns funktioner för att konvertera mellan två.
int hsv_h = 0;
Double hsv_s = 1;
Double hsv_v = 0,1;
bool colorWheel = false;
hsv_color hsv_current;
snabb förinställningar. Alla andra är för ett enkelt sätt att stänga av allt
rgb_color presetColor [] =
{
{0, 0, 0},
{255, 255, 255},
{0, 0, 0},
{16, 16, 16},
{0, 0, 0},
{64, 0, 0},
{0, 0, 0},
{0, 64, 0},
{0, 0, 0},
{0, 0, 64},
{0, 0, 0},
{64, 64, 0},
{0, 0, 0},
{64, 0, 64},
{0, 0, 0},
{0, 64, 64}
};
char presetColorSize = sizeof (presetColor) / 3;
char presetTracker = 0;
int buzzPin = 7.
void setup()
{
#ifdef DEBUG
Serial.BEGIN(9600);
#endif
My_Receiver.enableIRIn(); Starta IR-mottagaren
färg = hsvToRgb (hsv_h, hsv_s, hsv_v);
writeLeds(color);
Kontrollera att stiften pekar åt rätt håll
pinMode (onboard_led, produktionen);
pinMode (buzzPin, produktionen);
}
void loop()
{
Kontinuerligt leta efter resultat. När du har dem passera dem till dekoder
om (My_Receiver.GetResults (& My_Decoder))
{
My_Decoder.decode(); Avkoda data
#ifdef DEBUG
Seriella << "0 x" << _HEX(value) << oä;
#endif
om (My_Decoder.decode_type== NEC)
{
värde = My_Decoder.value;
#ifdef DEBUG
Seriella << "\t\tcase 0 x" << _HEX(value) << oä;
#endif
om (värde == 0xFFFFFFFF) / / hålla ned för upprepning
{
värde = last_value;
}
#ifdef DEBUG
Följetong << _HEX(value) << oä;
#endif
Switch(Value)
{
fall 0x77E1D074:
fall 0x77E15054:
#ifdef DEBUG
Seriella << "upp" << oä;
#endif
hsv_v += 0,05;
om (hsv_v > 0,95)
{
hsv_v = 0,95;
playTone(244);
}
annat
{
playTone(122);
}
färg = hsvToRgb (hsv_h, hsv_s, hsv_v);
bryta;
fall 0x77E1E074:
fall 0x77E16054:
#ifdef DEBUG
Seriella << "rätt" << oä;
#endif
hsv_h += 10.
om (hsv_h > 359)
{
hsv_h = 0;
playTone(244);
}
annat
{
playTone(200);
}
färg = hsvToRgb (hsv_h, hsv_s, hsv_v);
bryta;
fall 0x77E1B074:
fall 0x77E13054:
#ifdef DEBUG
Seriella << "down" << oä;
#endif
hsv_v-= 0,05;
om (hsv_v < 0,05)
{
hsv_v = 0,0;
playTone(244);
}
annat
{
playTone(122);
}
färg = hsvToRgb (hsv_h, hsv_s, hsv_v);
bryta;
fall 0x77E11074:
fall 0x77E19054:
#ifdef DEBUG
Seriella << "vänster" << oä;
#endif
hsv_h-= 10.
om (hsv_h < 1)
{
hsv_h = 359;
playTone(244);
}
annat
{
playTone(200);
}
färg = hsvToRgb (hsv_h, hsv_s, hsv_v);
bryta;
fall 0x77E12074:
fall 0x77E1A054:
#ifdef DEBUG
Seriella << "spela" << oä;
#endif
färg = presetColor [presetTracker];
++ presetTracker;
om (presetTracker > presetColorSize) presetTracker = 0;
för (j = 0; j < 2; j ++)
{
playTone(122);
Delay(20);
playTone(244);
Delay(20);
}
Ange nuvarande hsv värden till förinställningen
hsv_current = rgbToHsv (color.red, color.green, color.blue);
hsv_h = hsv_current.h;
hsv_s = hsv_current.s;
hsv_v = hsv_current.v;
#ifdef DEBUG
Seriella << "hsv(a):" << hsv_h << "," << hsv_s << "," << hsv_v << oä << "---" << oä;
#endif
bryta;
fall 0x77E14074:
fall 0x77E1C054:
#ifdef DEBUG
Seriella << "meny" << oä;
#endif
om (colorWheel)
{
colorWheel = false;
för (j = 1; j < = 5; j ++)
{
playTone(j * 20);
}
}
annat
{
colorWheel = sant;
för (j = 5; j > 0; j--)
{
playTone(j * 20);
}
}
bryta;
}
last_value = värde;
}
writeLeds(color);
My_Receiver.Resume(); Starta om mottagaren
}
Delay(30);
bryta sig in i hjulet färgläge med nuvarande s och v
om (colorWheel)
{
om (++ hsv_h > 359) hsv_h = 0;
färg = hsvToRgb (hsv_h, hsv_s, hsv_v);
writeLeds(color);
Delay(20);
}
}
void playTone(int value)
{
digitalWrite (onboard_led, hög); Aktivera LED (HIGH är spänningsnivån)
för (länge jag = 0; jag < 64 * 3; i ++)
{
1 / 2048 Hz = 488uS, eller 244uS hög och 244uS låg för att skapa 50% intermittens
digitalWrite (buzzPin, hög);
delayMicroseconds(value);
digitalWrite (buzzPin, låg);
delayMicroseconds(value);
}
digitalWrite (onboard_led, låg); Inaktivera LED genom att spänningen låg
}
void writeLeds(rgb_color c)
{
för (int jag = 0; jag < LED_COUNT; i ++)
{
.red färger [i] = c.red;
färger [i] .green = c.green;
.blue färger [i] = c.blue;
}
ledStrip.write (färger, LED_COUNT);
}
Konvertera HSV till motsvarande RGB
rgb_color hsvToRgb (int h, dubbel s, dubbla v)
{
rgb_color rgb;
Se till att våra argument bo i-range
h = max (0, min (360, h));
s = max (0, min (1.0, s));
v = max (0, min (1.0, v));
IF(s == 0)
{
Akromatisk (grå)
RGB.Red = rgb.green = rgb.blue = round(v * 255);
returnera rgb;
}
dubbel hs = h / 60,0; sektor 0 5
int jag = floor(hs);
dubbel f = hs - i. faktoriell del av h
Dubbelrum p = v * (1 - s);
dubbel q = v * (1 - s * f);
dubbel t = v * (1 - s * (1 - f));
r, g, b;
Switch(i)
{
fall 0:
r = v;
g = t;
b = p;
bryta;
fall 1:
r = q;
g = v;
b = p;
bryta;
fall 2:
r = p;
g = v;
b = t;
bryta;
fall 3:
r = p;
g = q;
b = v;
bryta;
fall 4:
r = t;
g = p;
b = v;
bryta;
standard: / / mål 5:
r = v;
g = p;
b = q;
}
RGB.Red = round(r * 255.0);
RGB.Green = round(g * 255.0);
RGB.Blue = round(b * 255.0);
returnera rgb;
}
konvertera RGB till motsvarande HSVEN
hsv_color rgbToHsv (unsigned char r, unsigned char g, unsigned char b)
{
dubbel rd = (dubbel) r/255;
dubbel gd = (dubbel) g/255;
dubbel bd = (dubbel) b/255;
dubbla d_h;
dubbla max = max (rd, max (gd, bd)), min = min (rd, min (gd, bd));
hsv_color hsv;
HSV.v = max;
dubbla d = max - min;
HSV.s = max == 0? 0: d / max;
om (max == min) {
d_h = 0;
} annat {
om (max == rd) {
d_h = (gd - bd) / d + (gd < bd? 6: 0);
} else om (max == gd) {
d_h = (bd - rd) / d + 2;
} else om (max == bd) {
d_h = (rd - gd) / d + 4;
}
d_h = 6.
}
HSV.h = d_h * 360;
returnera hsv;
}