En 15-LED RGB klocka med Arduino kärna (3 / 5 steg)
Steg 3: Programvara överväganden
Jag kommer inte ge fullt skissa här eftersom, för det första, den utvecklades för särskilt anpassad maskinvara och så fungerar inte med din enhet och för det andra, eftersom det finns ingen rocket science där – grundläggande RGB klockan är ganska enkel att (är du välkommen att ställa några frågor om du har problem, dock). Det finns dock några överväganden nämnvärt.
1. gör RGB rätt
RGB klockan visar tiden genom att bara blanda grundläggande färger-röd, grön och blå. Med tanke på att varje grundfärg drivs av sin egen datakanal sätt att programmera detta verkar ganska enkelt-aktivera bara röda för timmar, sedan grönt och blått för protokollet. Färgblandning kommer att ske av lysdioder för sig själva. Enkel, rätt?
Fel!
Medan denna lösning ser utmärkt från programmering synvinkel inte är det att bra om visuella estetik och strömförbrukningen är ansedda. En RGB-LED är i huvudsak tre lysdioder i ett paket. Detta innebär att om det visar rött, fungerar endast en LED. Om det växlar till gul, två lysdioder är påslagna och med vita lyser i alla tre. Gul är alltså två gånger ljusare än någon grundläggande färg och vit är tre gånger ljusare. Detta verkligen inte ser bra ut (och det är en av anledningarna till att HSV modellen aldrig användas med lysdioder, men det är en annan historia för en framtida artikel) och den använder för mycket makt – i själva verket, när alla 15 lysdioder är vita (vid 5:30) enheten förbrukar 900mA och kommer inte ens arbeta bort en USB-port (500 mA).
Det andra skälet du måste "handplocka" färgerna det att lysdioderna inte är färg-kalibrerad och olika klasar kan variera kraftigt på det sätt de utgång samma färger. Det är en bra idé att göra vissa färgkalibrering för hand för att få exakt färgnyanser du vill, även när du arbetar med till synes enkla 7 färger.
Hur som helst, det är bättre att vända på varje LED individuellt med vällagad värden. I min skiss jag först beräkna vilka färger måste vara på och skriva det i en liten mängd byte (med tre längst till höger bitar som används), sedan skicka beredda värdena till lysdioderna därmed. Här är kodstycken:
Byte förberedelser:
för (k = 0;
k < 15; k ++) disp15 [k] = 0; Rensa alla byte
för (k = 1; k < 6; k ++)
{
om ((hour%6) >(k-1)) {disp15 [k-1] = B100; disp15 [k + 4] = B100; disp15 [k + 9] = B100;};
}
om (minut < 16) för (k = 0; k
annat
om (minut < 31)
{för (k = 0; k < 16; k ++) disp15 [k] | = B010;
för (k = 0; k <(minute-15); k ++) disp15 [k] | = B001;}
annat
om (minut < 46)
{för (k = 0; k < 16; k ++) disp15 [k] | = B001;
för (k=(minute-30); k < 15; k ++) disp15 [k] | = B010;}
annat för (k=(minute-45); k < 15; k ++) disp15 [k] | = B001;
LED-lampor tända:
för (k = 0; k < 15; k ++)
{
Switch (disp15[k])
{
fall B000: setRGBpoint (k, 0, 0, 0); bryta;
fall B100: setRGBpoint (k, 3600, 0, 0); bryta;
fall B010: setRGBpoint (k, 0, 3000, 0); bryta;
fall B001: setRGBpoint (k, 0, 0, 3600); bryta;
fall B110: setRGBpoint (k, 1800, 1200, 0); bryta;
fall B011: setRGBpoint (k, 0, 2000, 1500); bryta;
fall B101: setRGBpoint (k, 1900, 0, 1700); bryta;
fall B111: setRGBpoint (k, 1200, 1000, 1000); bryta;
}
}
2. klocka
Använd inte Time.h biblioteket. Medan det kan få tid ur den externa RTC chipet, det är overstuffed med onödiga saker: det förvandlar din Arduino till en klocka, äta resurser och minne (ca 5 Kb av det i faktum!). Bara få de nödvändiga funktionerna ur det och använda wire.h biblioteket bara.
Dessa är de bärgade funktioner behöver du:
byte bcdToDec(byte val)
{
tillbaka ((val/16 * 10) + (val % 16));
}
byte decToBcd(byte val)
{
tillbaka ((val/10 * 16) + (val % 10));
}
void getTime)
{
Wire.beginTransmission(0x68);
Wire.write(byte(0));
Wire.endTransmission();
Wire.requestFrom(0x68, 3);
för det andra = bcdToDec (Wire.read());
minuter = bcdToDec (Wire.read());
timme = bcdToDec(Wire.read()) % 12. 12 timmars tid
}
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();
}
Glöm inte att #include och Wire.begin(); i setup() och förklara det andra minut och timme variabler.
3. en knapp
Det rekommenderas att lägga till en knapp i RGB klockan: det kan vara användbart för clock setup eller visualisering läget ändras om du har mer än en. I mitt projekt används knappen för lägen förändring (kort tryck), installation (långt tryck, 1 sekund) och ljusstyrka setup (ännu längre press, 2 sekunder). Det finns också en orientering setup (att välja vilken sida av klockan är på botten)-det slås av två kort pressar följt av en lång en. För att göra frågor enklare du använder mer än en knapp.
Detta leder till en fråga om kombinera tid visualisering med väntar en knapptryckningar. Igen, korrekt programmering svar (tilldela ett avbrott till knappen) är inte nödvändigtvis rätt i vårt fall. Vad händer om du vill läsa några sensor – till exempel ett fotomotstånd – för att ändra enhet? Vad händer om du vill styra enheten med en IR-fjärr?
Eftersom detta inte är strikt relaterade till viss enkel RGB klocka projektet detta instructable jag ska vara kort. Visualisering rutinerna i mina projekt är inte loopas i själva: de bara sätta upp en skärm och sedan tillbaka kontrollen till den viktigaste loop() cykel som gör sånt kontroll knappar eller sensorer eller något annat, då loopar och kallar visualisering igen. Jag använder en global variabel modeCounter att hålla reda på den aktuella visualisering positionen för animerade lägen (i princip är det samma som for(,,,) men utan innesluten slingan). Detaljerna är verkligen frågan för en annan artikel, hoppas denna lilla snutt hjälper (och igen, Välkommen att ställa frågor).