Med en enda RGB LED (eller en LED strip) för att visa information: klocka, termometer och en konstig kommunikatör (3 / 7 steg)
Steg 3: OnePixel termometer
Obs: Jag använder Celsius temperaturer i mina projekt. Jag är inte bekant med Fahrenheit system.
Den andra informativa funktionen av min krans var termometern. I själva verket termometern själv var min första Arduino projekt, och det är fortfarande arbetar i närheten, visar utomhustemperaturen på en binär "display". Garland var att begära data från det via I2C gränssnitt och Visa den i RGB.
Det är möjligt att använda samma tillvägagångssätt som beskrivs ovan om minuter, det vill säga en digital en visar tior och sådana. Detta tillvägagångssätt blir dock inte så intuitiv som temperaturen kan gå i negativa. Jag behövde också ett annat sätt att Visa temperaturen för att undvika förvirring, som både klocka och termometer var att arbeta på samma gång. Så använde jag en "analog" strategi här.
"Analog" tillvägagångssätt betyder du inte behöver konvertera sett färgerna i siffrorna, du kan bara koppla färger till hur vädret känns. Så här (från kallt till varmt, för vintern):
Röd: larm, väldigt kallt, bilen startar inte idag
Grön: riktigt kallt, klä följaktligen
Blå: kall, glöm inte handskar
Röd: runt frysning temp, räkna med slush, snöslask möjligt
Grön: vinter mode off
Och så vidare. Dessa basfärger är knutna till Celsius grader (-30 -20, -10, 0, + 10, se diagrammet) och ändra smidigt. Så om du ser, säg, en cyan – är det mellan grönt och blått, omkring 15 ° C; en lila nyans betyder något runt-5 ° C. Hela spektrumet spänner från rött till rött täcker 30 grader och sedan rullar över, det räcker inte att förvirra läsningar (en 30° C över natten temperatursänkning eller upphov är ganska sällsynta, och i vilket fall du kan titta ut genom fönstret att få den grundläggande idén om vad som pågår).
Även detta system är ganska snygg, när hustrun frågar för en temperatur måste du svara i exakta grader C, inte i färger. Så jag var tvungen att "rastrera" diagrammet och tilldela specifika värden specifika färger. Detta resulterade i en 2° C noggrannhet, vilket är OK för en casual projekt. Finns det andra diagrammet ovan. Men som diskuterats tidigare, dessa färger är verkligen inte slutgiltig och kan bli lätt förstörd, som i sin tur ledde till ett 'pendulum' visualiseringssystem.
I "pendeln" läge RGB LED visar inte bara det aktuella värdet, men det är grannar, växling mellan färgerna detta sätt: nuvarande – tidigare – nuvarande – nästa – aktuell-föregående, etc. Detta ger den hänvisning som behövs för att spika ner exakt nuvarande färg som, säg, röd-orange eftersom det är grannar är röd och orange. Det gör också en krans ser bättre genom att ge vissa animering.
Skissen visar en 'pendel-analog' metod är nedan. Obs: i denna skiss jag får temperaturen på termometern Arduino enheten via I2C; ändra getTemp() funktion enligt dina inställningar. Sinus-våg färg förändring algoritmen är från min tidigare instructable.
#include < Wire.h >
#define RED 3 / / pins RGB LED är ansluten till
#define grön 5
#define blå 6
int temperatur;
byte temperPos, prevPos, nextPos;
sinusvåg array
CONST uint8_t lyser [360] = {
0, 0, 0, 0, 0, 1, 1, 2,
2, 3, 4, 5, 6, 7, 8, 9,
11, 12, 13, 15, 17, 18, 20, 22,
24, 26, 28, 30, 32, 35, 37, 39,
42, 44, 47, 49, 52, 55, 58, 60,
63, 66, 69, 72, 75, 78, 81, 85,
88, 91, 94, 97, 101, 104, 107, 111,
114, 117, 121, 124, 127, 131, 134, 137,
141, 144, 147, 150, 154, 157, 160, 163,
167, 170, 173, 176, 179, 182, 185, 188,
191, 194, 197, 200, 202, 205, 208, 210,
213, 215, 217, 220, 222, 224, 226, 229,
231, 232, 234, 236, 238, 239, 241, 242,
244, 245, 246, 248, 249, 250, 251, 251,
252, 253, 253, 254, 254, 255, 255, 255,
255, 255, 255, 255, 254, 254, 253, 253,
252 251, 251, 250, 249, 248, 246, 245,
244 242, 241, 239, 238, 236, 234, 232,
231, 229, 226, 224, 222, 220, 217, 215,
213, 210, 208, 205, 202, 200, 197, 194,
191, 188, 185, 182, 179, 176, 173, 170,
167, 163, 160, 157, 154, 150, 147, 144,
141, 137, 134, 131, 127, 124, 121, 117,
114 111, 107, 104, 101, 97, 94, 91,
88, 85, 81, 78, 75, 72, 69, 66,
63 60, 58, 55, 52, 49, 47, 44,
42, 39, 37, 35, 32, 30, 28, 26,
24, 22, 20, 18, 17, 15, 13, 12,
11, 9, 8, 7, 6, 5, 4, 3,
2, 2, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0};
en matris med förväg ordnad RGB värden
för 10mm RGB LED.
byte RGBready [15] [3] = {
{255, 0, 0}, / / R0
{208, 47, 0}, / / R1
{169, 86, 0}, / / R2
{130, 125, 0}, / / R3
{103, 151, 0}, / / R4
{0, 255, 0}, / / G0
{0, 248, 7}, / / G1
{0, 217, 37}, / / G2
{0, 171, 84}, / / G3
{0, 67, 188}, / / G4
{0, 0, 255}, / / B0
{103, 0, 152}, / / B1
{127, 0, 127}, / / B2
{169, 0, 86}, / / B3
{224, 0, 31}, / / B4
};
void setup() {
Wire.BEGIN();
Serial.BEGIN(9600);
}
void loop() {
temperatur = getReadings(); begäran temperatur
beräkna positionen för temperatur mätare
med tanke på 2 grad noggrannhet
temperPos = ((temperature + 60)/2) % 15.
Ange värden för föregående och nästa positioner
bara för att göra koden tydligare
prevPos = (temperPos + 14) % 15.
nextPos = (temperPos + 1) % 15.
skriva ut RGBready ståndpunkt - för felsökning
Serial.println(temperPos);
Shift färger i det mest uppenbara sättet
shiftColors (temperPos, prevPos, 10);
shiftColors (prevPos, temperPos, 10);
shiftColors (temperPos, nextPos, 10);
shiftColors (nextPos, temperPos, 10);
}
begära temperatur: Jag använder en andra Arduino med en termometer på den.
Ändra denna funktion enligt din setup (1-wire, I2C, oavsett).
resultatet får hamna i form av ett heltal.
int getReadings()
{
int humör;
Wire.requestFrom (15, 1); begära en byte från enhet 15
While(Wire.available())
humör = Wire.read() - 60. för att undvika negativ den sändande enheten
Serial.println(Temper); lägger till 60 i sin behandling
returnera humör;
}
funktion för färgskiftning mellan
positioner i matrisen RGBready. Här en använder den
sinusvåg algoritm och ljus [] förväg ordnad matrisen ovan
delayVal anger hastigheten för övergång
void shiftColors (byte cur, byte nästa, byte delayVal)
{
uint16_t färg [3], nextColor [3].
lång colorStep [3].
showRGBcolor(cur); med tydlig första färgen
beräkna steg i unsigned int format att undvika att använda flöten
för (byte k = 0; k < 3; k ++) {
färg [k] = RGBready [cur] [k] << 8;
nextColor [k] = RGBready [Nästa] [k] << 8;
colorStep [k] = ((långa) nextColor [k] - färg [k]) / 255;
}
Ange färger i 120 (360/3) steg, konvertera tillbaka till byte
för (byte k = 0; k < 120; k ++)
{
setRGBpoint (0, (color[0]+colorStep[0]*lights[k]) >> 8,
(color[1]+colorStep[1]*lights[k]) >> 8,
(color[2]+colorStep[2]*lights[k]) >> 8);
Delay(delayVal);
}
showRGBcolor(next); avsluta med tydlig andra färgen
}
två äldre funktioner aktivera lysdioder.
Jag använder dem här att behålla överensstämmelsen mellan skisser
båda är för gemensam anod lysdioder. Om du använder gemensam katod sådana,
ta bort den "255-" bitar.
void setRGBpoint (uint8_t LED uint8_t röd, uint8_t grön, uint8_t blå)
{
analogWrite (röd, 255-röd);
analogWrite (grön, 255-grön);
analogWrite (blå, 255-blå);
}
void showRGBcolor(byte curLED)
{
analogWrite (röd, 255-RGBready[curLED][0]);
analogWrite (gröna, 255-RGBready[curLED][1]);
analogWrite (blå, 255-RGBready[curLED][2]);
}