Une télécommande pour notre lanterne d’humeur

La lanterne est dans mon coin chez moi, ce qui n'est pas si facile à atteindre à la main. Donc, chaque fois que je tire la fiche d'alimentation ou que j'appuie sur un interrupteur pour allumer ou éteindre la lanterne, je trouve cela un peu fastidieux. Cela doit être fait différemment! Et oui, il existe une autre façon, fidèle au modèle TV, avec une télécommande infrarouge. Avant de pouvoir nous asseoir confortablement sur le canapé et allumer et éteindre notre lanterne avec la télécommande, comme toujours, nous devons faire quelques changements et préparatifs. La chose la plus importante dont nous avons besoin en premier est la télécommande elle-même.J'ai choisi ma télécommande TV, qui a encore quelques boutons inutilisés que je veux utiliser. Plus sur cela plus tard. La prochaine chose dont nous avons besoin du côté matériel est que Module récepteur IR KY-022. de notre magasin de livraison AZ. Nous en avons besoin pour que notre nano puisse recevoir et évaluer les signaux infrarouges. Nous câblons donc notre nouveau module comme suit:

Schéma du circuit Fritzing - avec récepteur IR

Comme on peut le voir, les signaux du récepteur IR sont acheminés vers la broche 11 du Nanos et évalués par l'Arduino. Pour que l'Arduino puisse évaluer les signaux infrarouges, nous avons besoin de la bibliothèque de notre code IRRemote  que nous devons télécharger et installer au préalable dans l'IDE. Après avoir installé la bibliothèque, nous téléchargeons le code suivant:

 

#include <Adafruit_NeoPixel.h>
#include <IRrote.h>

#define PIN        6  // Quelle broche de l'Arduino est connectée aux NeoPixels?
#define RECV_PIN 11  // définir la broche d'entrée IR sur Arduino 
#define NUMPIXELS 12 // Combien de NeoPixels sont attachés à l'Arduino? // Taille de bague NeoPixel populaire

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
IRrecv irrecv(RECV_PIN);
decode_results résultats; // La classe decode_results est définie dans IRremote.h

longue FirelastTime = 0;
longue IRlastTime = 0;
longue TimerlastTime = 0;
int intervalle;
longue IRCode = 0;
longue Code OLDIR = 0;
bool FireON = faux;
bool FireOFF = faux;
octet FireSequence = 0;

nul configuration()
{   Série.commencer(115200);   tout (!Série);   // attendre que Serial soit établi - requis sur certaines plateformes   irrecv.enableIRIn(); // Démarrer le récepteur   pixels.commencer(); // INITIALISEZ NeoPixels   pixels.montrer(); // Initialise tous les pixels sur 'off'   intervalle = 400;   randomSeed(analogRead(0));
}

nul SimulateFire (bool Sur, int FireSq)
{   si (millis() - FirelastTime >= intervalle)   {     si (Sur)     {       FireOFF = faux;       FirelastTime = millis();       octet LightValue[NUMPIXELS * 3];       octet FireColor = 60;       intervalle = aléatoire(150, 200);       FireColor = 60; // aléatoire (0,50);       pour (int je = 0; je < NUMPIXELS; je++)       { // Pour chaque pixel ...         LightValue[je * 3] = aléatoire(240, 255); // 250         LightValue[je * 3 + 1] = aléatoire(30, 60); // 50         LightValue[je * 3 + 2] = 0;       }       // Allume certaines lumières plus sombres       octet LightsOff  = aléatoire(0, 4);       pour (int je = 0; je < LightsOff; je++)       {         octet Sélectionnés = aléatoire(NUMPIXELS);         LightValue[Sélectionnés * 3] = aléatoire(50, 60);         LightValue[Sélectionnés * 3 + 1] = aléatoire(5, 10);         LightValue[Sélectionnés * 3 + 2] = 0;       }       pour (int je = 0; je < NUMPIXELS; je++)       { // Pour chaque pixel ...         pixels.setPixelColor(je, LightValue[je * 3], LightValue[je * 3 + 1], LightValue[je * 3 + 2]);       }       noInterrupts();       pixels.montrer();   // Envoie les couleurs de pixels mises à jour au matériel.       irrecv.reprendre();       interrompt();     }     d'autre     {       si (!(FireOFF))       {         pixels.clair();         noInterrupts();         pixels.montrer();   // Envoie les couleurs de pixels mises à jour au matériel.         irrecv.reprendre();         interrompt();         FireOFF = vrai;       }     }   }
}

longue ReceiveIrCommand ()
{   longue résultat = 0;   si (millis() - IRlastTime >= 200)   {     IRlastTime = millis();     si (irrecv.décoder(&résultats))     {       résultat = résultats.valeur;       irrecv.reprendre(); // Recevez la valeur suivante       retour résultat;     }     // irrecv.resume (); // Recevez la valeur suivante   }   retour 0 ;
}

nul IRCommandProcessor (longue IrCommand)
{   si (IRCode == Code OLDIR) {     TimerlastTime = millis(); // Quelques trucs sur le rebouncing IR Remote   }   si (millis() - TimerlastTime >= 400) {     Code OLDIR = 0 ; // Quelques trucs sur le rebouncing IR Remote   }   si ((IRCode < -1) & (IRCode != Code OLDIR))   // Signal IR reçu   {     Code OLDIR = IRCode;                                           // Quelques trucs sur le rebouncing IR Remote     interrupteur (IRCode)     {       cas -522164073:        // Dans mon cas, un interrupteur bleu sur mon téléviseur - Télécommande         {           FireON = !FireON;         }         casser;       défaut:         Série.println(IRCode);         casser;     }   }
}

nul boucle()
{   IRCode = ReceiveIrCommand();   IRCommandProcessor(IRCode);   SimulateFire(FireON, FireSequence);
}

Avant d'intégrer notre propre télécommande, nous devons d'abord ouvrir la fenêtre du terminal à une vitesse d'interface de 115200 bauds. Maintenant, nous tenons notre télécommande sélectionnée devant le capteur et appuyez sur quelques boutons. Une sortie devrait ressembler à ceci:

Fenêtre du terminal de sortie: nombres longs avec signe négatif

Les nombres longs négatifs qui apparaissent sur la télécommande chaque fois qu'un bouton est enfoncé correspondent au code infrarouge, le bouton respectif sur la télécommande. Par exemple, le numéro -522145713 correspond au bouton "1" de la télécommande. Donc, si nous voulons utiliser la touche "1" pour allumer et éteindre notre lanterne, nous devons entrer ce "code numérique" dans notre code Arduino. Nous le faisons au point suivant dans le code:

commutateur (IRCode)
{
case -522145713: // Voici votre propre code de numéro IR déterminé pour
// entrez la fonction on / off
{
FireON =! FireON;
}

Désormais, lorsque vous appuyez sur le bouton de la télécommande sélectionné, le code n'est plus affiché sur le moniteur série, mais la lanterne s'allume ou s'éteint lorsqu'elle est reçue.
Le lecteur incliné aura probablement déjà reconnu que la structure de "boîtier de commutation" permet non seulement d'utiliser des codes de télécommande pour allumer et éteindre la lanterne, mais permet également d'étendre toutes les fonctions. Dans la prochaine partie de la série, nous allons jeter un œil à cela et développer les fonctions de notre lanterne pour inclure différents types de simulation d'incendie. J'ai hâte de mettre la prochaine pièce à votre disposition bientôt et j'espère que vous apprécierez la reconstruction. Les questions sont bien sûr toujours les bienvenues.

 

 

Pour arduinoProjets pour avancé

8 commentaires

Randolf

Randolf

Ich habe das gleich Problem , jedesmal wenn ich eine Taste drücke kommt ein anderer Code raus.
Schaltung funktioniert aber eben nur wenn man die Taste mehrfach drückt kommt das Programm welches dahinter steht .
sieht so aus im Monitor , immer die gleiche Taste gedrückt .
3:53:14.848 → -1821391323
23:53:14.915 → -1
23:53:15.418 → -1
23:53:16.627 → -1
23:53:18.351 → 280931138
23:53:18.385 → -1
23:53:19.457 → -1124551177
23:53:20.157 → -781353116
23:53:20.192 → -1
23:53:20.937 → 1744117259
23:53:21.003 → -1

Dirk, der olle brummbaer

Dirk, der olle brummbaer

Moin Tobias!
Der Tip mit der geänderten Codezeile war Klasse; jetzt funzen alle in meiner Reichweite befindlichen Fernbedienungen… :D
Leider habe ich noch ein anderes Problem: obwohl die Schaltung wie gezeichnet aufgebaut wurde, bekomme ich bei mehreren Impulsen (aus der mechanisch identischen Position) entweder gar keine oder unterschiedliche Werte zurück gemeldet. Somit ist das Ein- und Ausschalten des Ringes ein reines Glücksspiel (ausprobiert habe ich es mit drei verschiedenen Folientastaturen und der von meinem Fernseher – identische Ergebnisse).

Langer Rede kurzer Sinn: Hiiiiiilfe!!

Lass’ mal von Dir lesen.

Dirk

Tobias Kuch

Tobias Kuch

Hallo Mirko,
Probiere mal bitte folgende Code Änderung aus :

if ((IRCode != 0) & (IRCode != OLDIRCode))

Damit sollten jetzt beide Fernbedienungsarten funktionieren.

Mirko Voigtländer

Mirko Voigtländer

Der verwendete Code “(IRCode < -1)” verhindert die Benutzung der Folienfernbedienungen, die in vielen Lern- und Experimentierbausätzen mit geliefert werden.
Ich habe den Code wie folgt abgeändert “(IRCode > 0)”.
Jetzt funktionieren allerdings alle anderen Fernbedienungen nicht mehr.

Markus Neumann

Markus Neumann

Hallo Bert,

das gezeigte Netzteil trägt die Bezeichnung “MB102”. Im Shop ist es zu finden unter: https://www.az-delivery.de/products/mb102-breadboard

Viele Grüße und ein schönes Wochenende!
Markus

Bert

Bert

Unter welcher Bestellnummer ist das 5 v Netzteil erhältlich ?
=> https://cdn.shopify.com/s/files/1/1509/1638/files/Teil2-Fritzing_grande.jpg?v=1566908403

Georg

Georg

Hallo Hr Frey, das ich auch ein Einsteiger bin und mit Programmieren nichts zu tun gehabt habe bin gezwungen solchen Beispielen folgen. Schritt für Schritt habe alles aufgebaut, kopiert und doch ist mir irgendwo ein Fehler unterlaufen denn ich nicht finden kann. Zu Zeit bin in der Lage denn WS2812b Ring mit Hilfe einer Fernbedienung einschalten aber das ausschalten will nicht funktionieren. Über Ratschläge möchte ich mich sehr freuen.
Es grüßt, Georg

Stefan Frey

Stefan Frey

Schönes, einfaches, aber effektvolles Projekt für Einsteiger, gut erklärt.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi