Étape 3: Le Code
En écrivant cela, je suppose que le constructeur sait comment faire pour ajouter une bibliothèque à leur environnement de développement Arduino. Vous aurez besoin d’ajouter deux bibliothèques. Voici une Instructable qui vous aidera à commencer à l’aide d’un récepteur IR.
Le code utilise deux bibliothèques requises et une troisième bibliothèque facultatif que j’ai toujours utiliser lors du débogage. La bibliothèque de Streaming permet des déclarations une ligne rapides qui peuvent être envoyées à la console terminales.
L’excellente bibliothèque IRLib est une amélioration de plusieurs autres bibliothèques de l’IR en ce qu’il encapsule les fonctionnalités d’une manière qui ne nécessite que quelques lignes pour obtenir des fonctionnalités de IR. Il a également le soutien pour la transmission d’IR, dont je n’utilise pas dans ce projet. Il est très bien documenté et un exemple de code bon, serré. Celui-ci est certainement l’un à garder dans votre sac à malices.
Il y a une société qui fait des bandes de lumière à l’aide de la même puce utilisée par la bande de Radio Shack (RIP). Leur bibliothèque, PololuLedStrip, fournit une interface facile à utiliser dans toute la bande qui utilise la puce TM1804. La bibliothèque de Pololu prend également en charge les autres jetons utilisés par les bandes de LED plus récentes.
Le code est commenté, mais il y a certaines choses à signaler :
- Le tableau presetColor est une liste de couleurs qui seront chargés lorsque vous appuyez sur un bouton sur la télécommande. J’ai programmé ce au bouton « Play » sur le mien, mais vous pouvez l’affecter à ce que vous voulez. Ceux-ci sont désignés comme valeurs RVB, {255, 255, 255} étant plus brillante blanc et {0, 64, 0} étant un gradateur vert, par exemple. Vous pouvez créer des préconfigurations autant que vous le souhaitez. Notez que tous les autre préréglé sont {0,0,0}, qui essentiellement éteint les lumières. C’est gentil d’éteindre rapidement choses pour sleepy time.
- Dans la fonction loop(), vous verrez le décodeur IR judiciairement. Il existe plusieurs types de télécommandes infrarouges là-bas, et la bibliothèque de IRLib pouvez trouver bon nombre d'entre eux. Vous aurez besoin de jouer avec ce code pour voir exactement ce que votre télécommande est l’envoi afin que vous pouvez isoler les codes et assignez-les aux fonctionnalités dans votre programme. Il y a une excellente documentation dans un fichier PDF dans la bibliothèque pour vous aider.
- Cette télécommande particulière offre une valeur unique pour chaque bouton poussé, mais lorsque la touche est enfoncée, il envoie une valeur de 0xFFFFFFFF. Tout ce que nous devons faire est de se rappeler le précédent code envoyé et, en voyant toutes les F, traiter seulement la dernière valeur.
- Il y a une petite fonction, playTone, qui envoie des impulsions à l’orateur. L’environnement de développement Arduino a une fonction de la tonalité, mais il utilise des interruptions. Malheureusement, ces mêmes interruptions sont utilisées par la bibliothèque de IRLib, donc nous ne pouvons pas utiliser ton et IRLib dans l’esquisse même sans modifications importantes aux bibliothèques. Cette fonction simple fait tout ce que nous avons besoin pour cette application simple, sans utiliser les interruptions. Savoir que plus le nombre est élevé, plus le ton.
- J’ai deux télécommandes qui semblent identiques, mais ils fournissent des codes différents pour chaque bouton. Ce n’est aucun un problème quand on utilise la magie de la structure de switch/case C. Vous remarquerez deux cas pour chaque bloc. Cela indique les codes envoyés par chaque télécommande. Je pourrais éventuellement avoir une douzaine de télécommandes, chacun donnant un code différent et piéger en utilisant cette méthode.
- Les touches haut et bas, ajuster la luminosité et les touches droite et gauche à travers la roue chromatique.
- La touche « Menu » commence le mode roue de couleur. L’idée est que vous utilisez les touches haut/bas/droite/gauche pour obtenir la couleur de départ et appuyez sur la touche Menu. Les couleurs vont commencer à changer, en cours d’exécution tout autour de la roue chromatique jusqu'à ce que l’autre touche. Ceci fournit un éclairage d’ambiance relaxante si vous êtes dans ces choses.
- Le bouton « Play » permet d’accéder rapidement aux couleurs prédéfinis qui ont été mentionnés plus tôt.
- Le programme se termine avec les fonctions de conversion pour convertir entre RGB et HSV.
Les broches que j’ai utilisé étaient principalement pour la commodité ou habitude. Vous pouvez modifier les broches à laquelle les différentes parties sont connectés aussi longtemps que vous apportez les modifications appropriées dans le code.
HeadboardLight.h
HeadboardLight.ino
HeadboardLight.ino / / IRLib.h de IRLib-une bibliothèque d’Arduino pour infrarouge, codage et décodage < br > / / Version 1.5 juin 2014 / / Copyright 2014 par Chris Young < a href = « http://cyborg5.com » rel = « nofollow » > http://cyborg5.com</a> #include < IRLib.h > / / Streaming.h - Bibliothèque de l’Arduino pour soutenir la << en streaming opérateur / / Copyright (c) 2010-2012 Mikal Hart. Tous droits réservés. #include < Streaming.h > / / pratique bibliothèque pour faciliter le débogage des déclarations / / Pololu LED strip bibliothèque. Disponible de < a href = « https://github.com/pololu/pololu-led-strip-arduino » rel = « nofollow » > http://cyborg5.com</a> #include < PololuLedStrip.h > / / Bibliothèque pour lumière strip #include « HeadboardLight.h » / / fichier include pour ce projet //#define DEBUG / / global déclaration de débogage. Décommentez afin d’inclure le code de débogage / / créer un objet de récepteur pour écouter sur la broche 11 IRrecv My_Receiver(9) ; IRdecode My_Decoder ; valeur de type long non signé ; unsigned long last_value ; int j ; Créez un objet ledStrip sur la broche 12. PololuLedStrip < 12 > ledStrip ; int onboard_led = 13 ; juste pour la rétroaction pour s’assurer que nous recevons quelque chose / / créer un tampon pour la tenue de 10 couleurs. Prend 30 octets. #define LED_COUNT 10 rgb_color couleurs [LED_COUNT] ; couleur rgb_color ; Il y a deux normes de couleur utilisées ici. RGB conduit la bande lumineuse, / / mais le HSV est plus commode pour faire des progressions de roue de couleur. Il / / sont des fonctions pour convertir entre les deux. int hsv_h = 0 ; double hsv_s = 1 ; double hsv_v = 0,1 ; bool prédéfinies = false ; hsv_color hsv_current ; réglages rapides. Tout autre est hors d’un moyen facile de transformer tout sur rgb_color presetColor [] = {{0, 0, 0}, {255, 255, 255}, {0, 0, 0}, {16, 16, 16}, {0, 0, 0}, {64, 0, 0}, {0, 0, 0}, {0, 64, 0}, {0, 0, 0}, {0, 0, 64}, {0, 0, 0}, {64, 64, 0}, {0, 0, 0}, {0, 64, 64}, {0, 0, 0} {0, 64, 64}} ; char presetColorSize = sizeof (presetColor) / 3 ; char presetTracker = 0 ; int buzzPin = 7 ; void setup() {#ifdef DEBUG Serial.begin(9600) ; #endif My_Receiver.enableIRIn(); / / Start la couleur du récepteur IR = hsvToRgb (hsv_h, hsv_s, hsv_v); writeLeds(color); / / Assurez-vous d’épingles pointent la direction correcte pinMode (onboard_led, sortie); pinMode (buzzPin, sortie);} void loop() {//Continuously recherchez les résultats. Quand vous les avez passez-les au décodeur si (My_Receiver.GetResults (& My_Decoder)) {My_Decoder.decode() ; //Decode les données #ifdef DEBUG Serial << « 0 x » << _HEX(value) << endl ; #endif si (NEC My_Decoder.decode_type==) {valeur = My_Decoder.value ; #ifdef DEBUG Serial << "\t\tcase 0 x" << _HEX(value) << endl ; #endif si (valeur == 0xFFFFFFFF) / / immobilise pendant la répétition {valeur = last_value;} #ifdef DEBUG Serial << _HEX(value) << endl ; #endif switch () valeur) {affaire 0x77E1D074 : affaire 0x77E15054 : #ifdef DEBUG Serial << "up" << endl ; #endif hsv_v += 0,05 ; if (hsv_v > 0,95) {hsv_v = 0,95 ; playTone(244);} else {playTone(122);} couleur = hsvToRgb (hsv_h, hsv_s, hsv_v); break ; case 0x77E1E074 : affaire 0x77E16054 : #ifdef DEBUG Serial << « droit » << endl ; #endif hsv_h += 10 ; if (hsv_h > 359) {hsv_h = 0; playTone(244);} else {playTone(200);} couleur = hsvToRgb (hsv_h hsv_s, hsv_v) ; rupture ; affaire 0x77E1B074 : affaire 0x77E13054 : #ifdef DEBUG Serial << « bas » << endl ; #endif hsv_v-= 0,05 ; Si (hsv_v < 0,05) {hsv_v = 0,0 ; playTone(244);} else {playTone(122);} couleur = hsvToRgb (hsv_h, hsv_s, hsv_v) ; rupture ; affaire 0x77E11074 : affaire 0x77E19054 : #ifdef DEBUG Serial << « gauche » << endl ; #endif hsv_h-= 10 ; Si (hsv_h < 1) {hsv_h = 359 ; playTone(244);} else {playTone(200);} couleur = hsvToRgb (hsv_h, hsv_s, hsv_v) ; rupture ; affaire 0x77E12074 : affaire 0x77E1A054 : #ifdef DEBUG Serial << « jouer » << endl ; #endif couleur = presetColor [presetTracker] ; ++ presetTracker ; Si (presetTracker > presetColorSize) presetTracker = 0 ; pour (j = 0; j < 2; j ++) {playTone(122) ; delay(20) ; playTone(244) ; delay(20);} / / définir les valeurs actuelles de hsv pour le préréglage hsv_current = rgbToHsv (color.red, color.green, color.blue) ; hsv_h = hsv_current.h ; hsv_s = hsv_current.s ; hsv_v = hsv_current.v ; #ifdef DEBUG Serial << "hsv(a):" << hsv_h << «, » << hsv_s << «, » << hsv_v << endl << "---" << endl ; #endif pause ; affaire 0x77E14074 : affaire 0x77E1C054 : #ifdef DEBUG Serial << « menu » << endl ; #endif si (prédéfinies) {prédéfinies = false ; pour (j = 1; j < = 5; j ++) {playTone(j * 20);}} else {prédéfinies = true ; pour (j = 5; j > 0; j--) {playTone(j * 20);}} break ; } last_value = value ; } writeLeds(color) ; My_Receiver.Resume() ; Redémarrage du récepteur} delay(30) ; diviser en mode roue couleur actuelle s et v si (prédéfinies) {si (++ hsv_h > 359) hsv_h = 0; couleur = hsvToRgb (hsv_h, hsv_s, hsv_v); writeLeds(color) ; delay(20);}} void playTone (int valeur) {digitalWrite (onboard_led, HIGH); / / allumer la LED (HIGH est le niveau de tension) pour (long j’ai = 0; j’ai < 64 * 3; i ++) {/ / 1 / 2048 Hz = 488uS, ou 244uS haute et 244uS faible à créer 50 % duty cycle digitalWrite (buzzPin, HIGH); delayMicroseconds(value) ; delayMicroseconds(value) ; digitalWrite (buzzPin, basse)} digitalWrite (onboard_led, basse); / / éteindre la LED en rendant la tension basse} void writeLeds (rgb_color c) {pour (int j’ai = 0; j’ai < LED_COUNT; i ++) {.red couleurs [i] = c.Red ; .green couleurs [i] = c.green ; .blue couleurs [i] = c.blue ; } ledStrip.write (couleurs, LED_COUNT) ; } / / Convertir VHS correspondante RGB rgb_color hsvToRgb (int, double s, double v h) {rgb_color RVB; / / Assurez-vous que nos arguments restent dans l’échelle h = max (0, min (360, h)); s = max (0, min (1,0, s)); v = max (0, min (1,0, v)); if(s == 0) {/ / achromatiques (gris) rgb.red = rgb.green = rgb.blue = round(v * 255) ; retour RVB;} double hs = h / 60,0; / / secteur int 0 à 5 j’ai = floor(hs) ; double f = hs - i; / / factorielle partie de h double p = v * (1 - s); double q = v * (1 - s * f) ; double t = v * (1 - s * (1 - f)) ; double r, g, b ; Switch(i) {case 0: r = v; g = t; b = p; break ; case 1: r = q; g = v; b = p; break ; case 2: r = p; g = v; b = t; break ; case 3: r = p; g = q; b = v; break ; case 4: r = t; g = p; b = v; break ; default: / / case 5: r = v; g = p; b = q;} rgb.red = round(r * 255.0) ; RGB.Green = round(g * 255.0) ; RGB.Blue = round(b * 255.0) ; retour RVB ; } / / convert RVB à la correspondante HSV hsv_color rgbToHsv (unsigned char r, g unsigned char, unsigned char b) {double rd = r/255 (double); double gd = g/255 (double); double bd = b/255 (double), double d_h ; double max = max (rd, max (gd, bd)), min = min (rd, min (gd, bd)); hsv_color hsv ; hsv.v = max ; double d = max - min; hsv.s = max == 0? 0 : d / max ; Si (max == min) {d_h = 0;} else {si (max == e) {d_h = (gd - bd) / d + (gd < bd? 6: 0);} ElseIf (max == gd) {d_h = (bd - rd) / d + 2;} ElseIf (max == bd) {d_h = (rd - gd) / d + 4;} d_h / = 6;} hsv.h = d_h * 360 ; retourner le hsv ; }