Étape 3: Considérations de logiciel
Je ne fournira pas le plein esquisser dans ici parce que, tout d’abord, il a été développé pour le matériel personnalisé particulier et donc ne fonctionne pas avec votre appareil, et Deuxièmement, parce qu’il n’est pas sorcier là-dedans – l’horloge RGB base est assez simple à (s’il vous plaît n’hésitez pas à poser des questions si vous avez des problèmes, cependant). Il y a, cependant, quelques considérations à noter.
1. faire droit RGB
L’horloge de RVB affiche l’heure en mélangeant juste les couleurs de base – rouges, verts et bleus. Considérant que chaque couleur de base est entraînée par son propre canal de données, le moyen de programmer cela semble assez simple : il suffit de tourner sur rouges pendant des heures, puis vert et bleu pour les minutes correspondants. Mélange des couleurs se fera par LEDs elles-mêmes. Simple, droite ?
Faux !
Même si cette solution semble excellente du point de vue programmation, qu'il n’est pas que bon si visuel esthétique et consommation d’énergie sont considérés. Une LED RGB est essentiellement trois LEDs dans un seul paquet. Cela signifie que si il affiche rouge, qu’une seule LED fonctionne. Si elle passe au jaune, deux voyants sont allumés, et avec le blanc, tous les trois sont brillants. Ainsi, le jaune est deux fois plus brillante que n’importe quelle couleur de base et blanc est de trois fois plus lumineux. Cela ne semble vraiment pas bon (et c’est l’une des raisons pour lesquelles HSV modèle ne doit jamais être utilisé avec des LEDs, mais c’est une autre histoire pour un futur article) et il utilise trop de pouvoir – en fait, quand les 15 LEDs sont blancs (à 05:30) l’appareil consommera 900mA et même ne fonctionnera pas sur un port USB (500 mA).
L’autre raison que vous devrez « main-pick » les couleurs il le fait que les LEDs ne sont pas calibré en couleur et différentes grappes peut varier considérablement dans la façon dont ils sortis des mêmes couleurs. C’est une bonne idée de faire un étalonnage des couleurs à la main pour obtenir les teintes de la couleur exacte souhaitée, même lorsque vous faites affaire avec apparemment simples 7 couleurs.
En tout cas, il est préférable d’allumer chaque LED individuellement avec les valeurs soigneusement préparés. Dans mon croquis, que j’ai tout d’abord calculer quelles couleurs doivent être sur et écrire ceci dans un petit tableau d’octets (avec trois bits à droite utilisés), puis envoyer les valeurs préparés à LEDs en conséquence. Voici quelques extraits de code :
Préparation de l’octet :
pour (k = 0 ;
k < 15 ; disp15 k ++) [k] = 0 ; effacer tous les octets
pour (k = 1; k < 6; k ++)
{
Si ((hour%6) >(k-1)) {disp15 [k-1] = B100 ; disp15 [k + 4] = B100 ; disp15 [k + 9] = B100;} ;
}
Si (minute < 16) pour (k = 0; k
d’autre
Si (minute < 31)
{pour (k = 0; k < 16; k ++) disp15 [k] | = B010 ;
pour (k = 0; k <(minute-15); k ++) disp15 [k] | = B001;}
d’autre
Si (minute < 46)
{pour (k = 0; k < 16; k ++) disp15 [k] | = B001 ;
pour (k=(minute-30); k < 15; k ++) disp15 [k] | = B010;}
d’autre (k=(minute-45); k < 15; k ++) disp15 [k] | = B001 ;
Voyants allumer :
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. l’horloge
N’utilisez pas la bibliothèque Time.h. Alors qu’il peut obtenir le temps hors de la puce RTC externe, il est bourré avec des choses inutiles : il se transforme votre Arduino en une horloge aussi, manger des ressources et la mémoire (environ 5 Ko de celui-ci en fait!). Juste obtenir les fonctions nécessaires hors de lui et utiliser la bibliothèque de wire.h seulement.
Ce sont les fonctions récupérées, que vous aurez besoin :
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(); }
N’oubliez pas de #include et Wire.begin() ; dans setup() et déclarer en second lieu, les variables heures et minutes.
3. un bouton
Il est recommandé d’ajouter un bouton à l’horloge de RVB : il peut être utile pour les changements de mode d’installation ou de visualisation horloge si vous avez plus d’un. Dans mon projet, le bouton est utilisé pour le changement de modes (appui court), réglage de l’horloge (appui long, 1 seconde) et paramètres de luminosité (presse encore plus longue, 2 secondes). Il y a également une installation d’orientation (sélection de quel côté de l’horloge est sur le fond) – il est allumé par deux impulsions courtes, suivies d’un long. Pour faire des questions simples, que vous pouvez recourir à plus d’un bouton.
Cela conduit à une question de visualisation temps d’attente pour un bouton appuie sur la combinaison. Encore une fois, la bonne réponse de programmation (attribuant une interruption au bouton) n’est pas nécessairement juste dans notre cas. Que se passe-t-il si vous voulez lire quelques capteur – par exemple, une photorésistance – pour modifier le comportement de l’appareil ? Que se passe-t-il si vous souhaitez contrôler l’appareil avec une télécommande IR ?
Comme cela n’est pas strictement lié au projet d’horloge RVB simple particulier de cette instructable je serai bref. Les routines de visualisation dans mes projets ne sont pas transmises en eux-mêmes : ils vient de créer un affichage et puis retourner le contrôle au cycle loop() principal qui fait des trucs comme la vérification des boutons ou des capteurs ou autre chose, puis une boucle et appelle la visualisation à nouveau. J’utilise un modeCounter de variable globale pour garder une trace de la position actuelle de visualisation pour les modes d’animation (il est fondamentalement le même que for(,,,), mais sans la boucle confinée). Les détails sont vraiment l’affaire pour un autre article, espoir ce petit extrait aidera (et encore une fois, n’hésitez pas à poser des questions).