Stap 3: Software overwegingen
Ik zal niet bieden de volledige sketch in hier omdat, in de eerste plaats werd ontwikkeld voor de specifieke aangepaste hardware en dus niet zal werken met uw apparaat en ten tweede omdat er geen rocket science daar is – de fundamentele RGB klok is vrij eenvoudig te (aarzel niet om te vragen of u problemen, hoewel hebt). Er zijn echter enkele punten waarmee waard het vermelden.
1. het doen van RGB-recht
De RGB-klok geeft tijd door het enkel mengen basiskleuren – rood, groen en blauw. Gezien het feit dat elke basiskleur wordt gedreven door zijn eigen gegevenskanaal lijkt de weg naar dit programma vrij eenvoudig-gewoon weer op rood voor uren, dan groen en blauw voor de notulen. Kleur mengen zal worden gedaan door de LEDs zelf. Eenvoudig, juist?
Verkeerd!
Hoewel deze oplossing ziet er uitstekend uit programmering oogpunt, die het is niet dat goed als visuele esthetiek en stroomverbruik worden beschouwd. Een RGB-LED is in wezen drie LEDs in één pakket. Dit betekent dat als rood wordt weergegeven, is slechts één LED werken. Als er wordt overgeschakeld naar geel, twee LED's zijn ingeschakeld, en met wit alle drie zijn glanzend. Geel is dus twee keer helderder dan elke basiskleur en wit is drie keer helderder. Dit echt niet mooi (en dat is een van de redenen HSV model mag nooit worden gebruikt met LEDs, maar dat is een ander verhaal voor een toekomstig artikel) en het maakt gebruik van te veel macht-in feite, wanneer alle 15 LEDs zijn wit (op 5:30) het apparaat zal verbruiken 900mA en zelfs uit een USB-poort werkt niet (500 mA).
De andere reden die je moet 'hand-pick' de kleuren het het feit dat de LEDs niet kleur-gekalibreerd en verschillende zijn trossen kan verschillen in de manier waarop die ze uitgang dezelfde kleuren. Het is een goed idee om te doen sommige kleurkalibratie met de hand om de exacte kleur tinten die je wilt, zelfs wanneer u te met schijnbaar eenvoudige 7 kleuren maken.
Hoe dan ook, het is beter om elke LED individueel met zorgvuldig voorbereide waarden inschakelen. In mijn schets die ik eerst berekenen welke kleuren moeten worden op en schrijf het in een kleine matrix van bytes (met de drie meest rechtse bits gebruikt), en vervolgens de bereid waarden verzenden de LEDs dienovereenkomstig. Hier zijn codefragmenten:
Byte voorbereiding:
voor (k = 0;
k < 15; k ++) disp15 [k] = 0; Schakel alle bytes
voor (k = 1; k < 6; k ++)
{
Als ((hour%6) >(k-1)) {disp15 [k-1] = B100; disp15 [k + 4] = B100; disp15 [k + 9] = B100;};
}
Als (minuut < 16) voor (k = 0; k
anders
Als (minuut < 31)
{voor (k = 0; k < 16; k ++) disp15 [k] | = B010;
voor (k = 0; k <(minute-15); k ++) disp15 [k] | = B001;}
anders
Als (minuut < 46)
{voor (k = 0; k < 16; k ++) disp15 [k] | = B001;
voor (k=(minute-30); k < 15; k ++) disp15 [k] | = B010;}
anders (k=(minute-45); k < 15; k ++) disp15 [k] | = B001;
LED's inschakelen:
for ( k=0; k<15; k++){ switch (disp15[k]) { case B000: setRGBpoint(k, 0, 0, 0); break; case B100: setRGBpoint(k, 3600, 0, 0); break; case B010: setRGBpoint(k, 0, 3000, 0); break; case B001: setRGBpoint(k, 0, 0, 3600); break; case B110: setRGBpoint(k, 1800, 1200, 0); break; case B011: setRGBpoint(k, 0, 2000, 1500); break; case B101: setRGBpoint(k, 1900, 0, 1700); break; case B111: setRGBpoint(k, 1200, 1000, 1000); break; } }
2. de klok
Gebruik niet de Time.h bibliotheek. Terwijl de tijd uit de externe RTC-chip krijgen kan, het is overstuffed met overbodige dingen: het draait je Arduino in een klok ook eten van middelen en geheugen (ongeveer 5 Kb van het in feite!). Gewoon de benodigde functies eruit en wire.h bibliotheek alleen gebruiken.
Dit zijn de geborgen functies die je nodig hebt:
byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); }
byte decToBcd(byte val) { return ((val/10*16) + (val%10)); }
void getTime () { Wire.beginTransmission(0x68); Wire.write(byte(0)); Wire.endTransmission(); Wire.requestFrom(0x68, 3); second = bcdToDec (Wire.read()); minute = bcdToDec (Wire.read()); hour = bcdToDec(Wire.read())%12; //12 hour time }
void setTime() { Wire.beginTransmission(0x68); Wire.write(byte(0)); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(byte(0)); Wire.endTransmission(); }
Vergeet niet om #include en Wire.begin(); in Setup en ten tweede, minuut en uur variabelen declareren.
3. een knop
Het is aanbevolen om een knop toevoegen aan de RGB-klok: op annuleerteken zitten nuttig voor klok setup of visualisatie modus wijzigingen hebt u meer dan één. In mijn project wordt de knop gebruikt voor modi wijzigen (kort indrukken), tijd setup (lang indrukken, 1 seconde) en helderheid setup (zelfs langer press, 2 seconden). Er is ook een opstelling van de richting (te selecteren welke kant van de klok aan de onderkant is)-het is ingeschakeld door twee korte persen, gevolgd door een lange. Zaken eenvoudiger dat kunt u overwegen met behulp van meer dan één knop om te maken.
Dit leidt tot een vraag van het combineren van tijd visualisatie met wachten op een knop drukt. Nogmaals, de juiste programmering antwoord (een interrupt toewijzen aan de knop) is niet noodzakelijkerwijs goed in ons geval. Wat als u wilt lezen enkele sensor – bijvoorbeeld een fotoweerstand – als het gedrag van het apparaat wilt wijzigen? Wat als u wilt om het apparaat met een externe IR te controleren?
Als dit is niet strikt gerelateerd aan het bijzonder eenvoudige RGB klok project van dit instructable zal ik kort. De routines van de visualisatie in mijn projecten zijn niet een lus op zichzelf: zij enkel opstelling een weergave en vervolgens de besturing wordt teruggegeven aan de belangrijkste loop cyclus die spullen zoals het controleren van de knoppen of sensoren of iets anders, dan loops en roept de visualisatie opnieuw. Ik gebruik een globale variabele modeCounter om de huidige positie van de visualisatie voor geanimeerde modi (het fundamenteel is het zelfde als for(,,,) maar dan zonder de ingeperkte lus) bij te houden. De details zijn echt de zaak voor een ander artikel, hoop dit kleine fragment zal helpen (en nogmaals, voel je vrij om vragen te stellen).