Stap 3: OnePixel Thermometer
Opmerking: Ik gebruik Celsius temperaturen in mijn projecten. Ik ben niet bekend met de Fahrenheit systeem.
De tweede informatieve functie van mijn garland was de thermometer. In feite, de thermometer zelf was mijn eerste Arduino project, en het is nog steeds werken in de buurt, tonen de buitentemperatuur op een binaire 'display'. De krans moest het de gegevens aanvraagt via I2C interface en weer te geven in RGB.
Het is mogelijk om dezelfde aanpak te gebruiken zoals hierboven beschreven met betrekking tot de notulen, dat wil zeggen, een digitale tonen tientallen en degenen. Deze benadering wordt echter niet zo intuïtief als de temperatuur kan gaan in negatieve. Ook moest ik op een verschillende manier om te laten zien van temperatuur om te voorkomen dat verwarring, zoals zowel de klok als de thermometer moesten werken op hetzelfde moment. Dus gebruikte ik een 'analoge' aanpak hier.
De 'analoge' aanpak betekent dat je niet gezien kleuren omzetten in cijfers, je kan gewoon koppelen aan kleuren hoe het weer voelt. Als dit (van koud naar warm, voor de winter):
Rood: alarm, erg koud, de auto start niet vandaag
Groen: echt koud, jurk dienovereenkomstig
Blauw: koud, vergeet dan niet handschoenen
Rood: rond bevriezing temp, slush verwachten, ijzel mogelijk
Groen: winter modus uit
Enzovoort. Deze basiskleuren zijn gebonden aan Celsius graden (-30 -20 -10, 0, + 10, zie de grafiek) en soepel wijzigen. Dus als u ziet, laten we zeggen, een cyaan-is tussen groen en blauw, ongeveer-15 ° C; een paarse tint betekent iets rond de-5 ° C. Het bereik van het volledige spectrum van rood voor rood heeft betrekking op 30 graden en dan rolt over, dat is genoeg niet te verwarren lezingen (een 30° C nachtelijke temperatuurdaling of opkomst is vrij zeldzaam, en in ieder geval kun je uit het raam om de fundamentele idee van wat er gaande is).
Terwijl dit systeem erg netjes, is wanneer de vrouw om een temperatuur vraagt die je moet beantwoorden in exacte graden C, niet in kleuren. Dus ik 'rasteren' de grafiek moest en specifieke kleuren kunt aan specifieke waarden toewijzen. Dit resulteerde in een nauwkeurigheid van 2° C, die OK voor een casual project is. Zie de tweede grafiek hierboven. Echter zoals eerder besproken, deze kleuren zijn zeker niet definitief en kunnen worden gemakkelijk verknald, die op zijn beurt geleid tot een 'slinger' visualisatie-systeem.
In de 'slinger' modus de RGB LED toont niet alleen de huidige waarde, maar het is buren ook schakelen tussen de kleuren op deze manier: huidige-vorige-huidige-volgende-huidige-vorige, enz. Dit biedt de verwijzing nodig te nagel naar beneden de exacte huidige kleur als, zeg, de rood-oranje omdat haar buren rood zijn en oranje. Het maakt ook een krans doordat sommige animatie er beter uitzien.
De tonen van een 'slinger-analoge' methode schets is hieronder. Opmerking: in deze schets ik krijg de temperatuur van de thermometer Arduino apparaat via I2C; verandering van de functie van de getTemp() volgens uw setup. De sinusgolf algoritme voor de verandering van de kleur is van mijn vorige instructable.
#include <Wire.h> #define RED 3 // pins the RGB LED is connected to #define GREEN 5 #define BLUE 6int temperature; byte temperPos, prevPos, nextPos;// sine wave array const uint8_t lights[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}; // an array of pre-arranged RGB values // for 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(){ temperature = getReadings(); // request temperature // calculate the position of temperature meter // considering 2 degree accuracy temperPos = ((temperature + 60)/2)%15; // set values for previous and next positions // just to make the code clearer prevPos = (temperPos+14)%15; nextPos = (temperPos+1)%15; // print out RGBready position - for debugging //Serial.println(temperPos); // shift colors in the most obvious way shiftColors(temperPos, prevPos, 10); shiftColors(prevPos, temperPos, 10); shiftColors(temperPos, nextPos, 10); shiftColors(nextPos, temperPos, 10);}// request temperature: I use a second Arduino with a thermometer on it. // Change this function according to your setup (1-wire, I2C, whatever). // the result must end up in the form of an integer. int getReadings() { int temper; Wire.requestFrom(15, 1); // request one byte from device 15 while(Wire.available()) temper = Wire.read() - 60; // to avoid negatives the sending device Serial.println(temper); // adds 60 to its reading return temper; }// function for color shifting between // positions in the RGBready array. This one uses the // sine wave algorithm and lights[] pre-arranged array above // delayVal sets the speed of transition void shiftColors(byte cur, byte next, byte delayVal) { uint16_t color[3], nextColor[3]; long colorStep[3]; showRGBcolor(cur); // start with clear first color // calculate steps in unsigned int format to avoid using floats for (byte k=0; k<3; k++) { color[k] = RGBready[cur][k]<<8; nextColor[k] = RGBready[next][k]<<8; colorStep[k]=((long)nextColor[k] - color[k])/255; } // set colors in 120 (360/3) steps, converting back to bytes for (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); // finish with clear second color }// two legacy functions to turn LEDs on. // I use them here to maintain consistency between sketches // both codes are for common anode LEDs. If you use common cathode ones, // remove the '255-' bits. void setRGBpoint(uint8_t LED, uint8_t red, uint8_t green, uint8_t blue) { analogWrite(RED, 255-red); analogWrite(GREEN, 255-green); analogWrite(BLUE, 255-blue); }void showRGBcolor(byte curLED) { analogWrite(RED, 255-RGBready[curLED][0]); analogWrite(GREEN, 255-RGBready[curLED][1]); analogWrite(BLUE, 255-RGBready[curLED][2]); }