Eine Fernsteuerung für unsere Stimmungslaterne - AZ-Delivery

La lanterna si trova a casa mia in un angolo che non è così facile da raggiungere a mano. Così ogni volta che tiro la spina di alimentazione o azionare un interruttore per accendere o spegnere la lanterna, lo trovo un po 'noioso. Questo deve essere fatto in modo diverso! E sì, può essere fatto in modo diverso, vale a dire, fedele al modello TV, con un telecomando a infrarossi. Tuttavia, prima di poter sedersi comodamente sul divano e accendere e spegnere la nostra lanterna con il telecomando, dobbiamo fare alcune modifiche e preparativi come sempre. La cosa più importante di cui abbiamo bisogno prima è il telecomando stesso. Ho scelto il mio telecomando TV, che ha ancora alcuni pulsanti inutilizzati che voglio usare per questo scopo. Ma più su che più tardi. La prossima cosa di cui abbiamo bisogno sul lato hardware è il Modulo ricevitore KY-022 IR. dal nostro negozio di consegna in A. Abbiamo bisogno di questo in modo che il nostro nano possa ricevere e valutare i segnali infrarossi. Quindi colleghiamo il nostro nuovo modulo come segue:

Schema Fritzing - Con ricevitore a iR

Come si può vedere, i segnali del ricevitore IR vengono instradati per pin 11 del nano e valutati dall'Arduino. Affinché l'Arduino per valutare i segnali a infrarossi, abbiamo bisogno della libreria per il nostro codice IRRemote (informazioni in remoto) che abbiamo bisogno di scaricare e installare nell'IDE in anticipo. Dopo aver installato la libreria, carichiamo il seguente codice:

 

#include <Adafruit_NeoPixel.H>
#include <IRremoto.H>

# define spilla        6  Quale pin di Arduino è connesso a NeoPixels?
# define RECV_PIN 11  definire il pin di ingresso A IR su Arduino 
# define NUMPIXEL 12 Quanti NeoPixel sono collegati all'Arduino? Popolari dimensioni anello NeoPixel

Adafruit_NeoPixel Pixel(NUMPIXEL, spilla, NEO_GRB + NEO_KHZ800);
IRrecv irrecv(RECV_PIN);
decode_results Risultati; decode_results classe è definita in IRremote.h

Lungo FirelastTime = 0;
Lungo IRlastTime (Ora di iRlast) = 0;
Lungo TimerlastTime = 0;
Int Intervallo;
Lungo Codice IR = 0;
Lungo Codice OLDIR = 0;
Bool Fireon = False;
Bool FireOFF = False;
Byte FireSequence (Sequenza di incendio) = 0;

Vuoto Installazione()
{   Seriale.Iniziare(115200);   Mentre (!Seriale);   attendere fino a quando Serial è stabilito - richiesto su alcune piattaforme   irrecv.enableIRIn (abilitazioneIri(); Avviare il ricevitore   Pixel.Iniziare(); INITIALIZE NeoPixels   Pixel.Visualizza(); Inizializzare tutti i pixel su 'off'   Intervallo = 400;   randomSeed (Seed randomse)(analogicOLettura(0));
}

Vuoto SimulateFire (Bool Attivato, Int FireSq)
{   Se (millis() - FirelastTime >= Intervallo)   {     Se (Attivato)     {       FireOFF = False;       FirelastTime = millis();       Byte Valore leggero[NUMPIXEL * 3];       Byte Colore di fuoco = 60;       Intervallo = Casuale(150, 200);       Colore di fuoco = 60; casuale (0,50);       Per (Int Ho. = 0; Ho. < NUMPIXEL; Ho.++)       { Per ogni pixel...         Valore leggero[Ho. * 3] = Casuale(240, 255); // 250         Valore leggero[Ho. * 3 + 1] = Casuale(30, 60); // 50         Valore leggero[Ho. * 3 + 2] = 0;       }       Cambiare alcune luci più scure       Byte Luci spente  = Casuale(0, 4);       Per (Int Ho. = 0; Ho. < Luci spente; Ho.++)       {         Byte Selezionato = Casuale(NUMPIXEL);         Valore leggero[Selezionato * 3] = Casuale(50, 60);         Valore leggero[Selezionato * 3 + 1] = Casuale(5, 10);         Valore leggero[Selezionato * 3 + 2] = 0;       }       Per (Int Ho. = 0; Ho. < NUMPIXEL; Ho.++)       { Per ogni pixel...         Pixel.setPixelColor(Ho., Valore leggero[Ho. * 3], Valore leggero[Ho. * 3 + 1], Valore leggero[Ho. * 3 + 2]);       }       noInterruzioni();       Pixel.Visualizza();   Inviare i colori pixel aggiornati all'hardware.       irrecv.riassumere();       Interrompe();     }     Altro     {       Se (!(FireOFF))       {         Pixel.Chiaro();         noInterruzioni();         Pixel.Visualizza();   Inviare i colori pixel aggiornati all'hardware.         irrecv.riassumere();         Interrompe();         FireOFF = Vero;       }     }   }
}

Lungo ReceiveIrComando ()
{   Lungo Risultato = 0;   Se (millis() - IRlastTime (Ora di iRlast) >= 200)   {     IRlastTime (Ora di iRlast) = millis();     Se (irrecv.Decodificare(&Risultati))     {       Risultato = Risultati.Valore;       irrecv.riassumere(); Ricevere il valore successivo       Ritorno Risultato;     }     irrecv.resume(); Ricevere il valore successivo   }   Ritorno 0 ;
}

Vuoto Processore IRCommand (Lungo Comando IrComando)
{   Se (Codice IR == Codice OLDIR) {     TimerlastTime = millis(); Alcune cose su debouncing IR Remote   }   Se (millis() - TimerlastTime >= 400) {     Codice OLDIR = 0 ; Alcune cose su debouncing IR Remote   }   Se ((Codice IR < -1) & (Codice IR != Codice OLDIR))   Segnale A iR ricevuto   {     Codice OLDIR = Codice IR;                                           Alcune cose su debouncing IR Remote     Interruttore (Codice IR)     {       Caso -522164073:        Nel mio caso un interruttore blu sul mio televisore - Telecomando         {           Fireon = !Fireon;         }         Pausa;       Predefinito:         Seriale.println(Codice IR);         Pausa;     }   }
}

Vuoto Ciclo()
{   Codice IR = ReceiveIrComando();   Processore IRCommand(Codice IR);   SimulateFire(Fireon, FireSequence (Sequenza di incendio));
}

Ma prima di poter integrare il nostro telecomando, dobbiamo prima aprire la finestra del terminale ad una velocità di interfaccia di 115200 Baud. Ora teniamo il nostro telecomando selezionato davanti al sensore e premiamo alcuni pulsanti. Un output dovrebbe essere approssimativamente il seguente:

Finestra del terminale di output: numeri lunghi con segno negativo

I numeri lunghi negativi visualizzati sul telecomando ogni volta che si preme un pulsante corrispondono al codice a infrarossi, il rispettivo pulsante sul telecomando. Ad esempio, il numero -522145713 corrisponde al pulsante "1" sul telecomando. Quindi, se vogliamo usare il pulsante "1" per accendere e spegnere la nostra lanterna, dobbiamo inserire questo "codice numerico" nel nostro codice Arduino. Questa operazione viene eseguito nel punto seguente del codice:We do this at the following point in the code:

interruttore (IRCode)
{
caso -522145713: / Ecco il proprio codice numero IR per
inserire la funzione on/off
{
FireON ! FireON;
}

D'ora in poi, quando si preme il pulsante del telecomando selezionato, il codice NON viene visualizzato nel monitor seriale, ma la lanterna viene accesa o spenta durante la ricezione.
Il lettore inclinato avrà probabilmente già riconosciuto che attraverso la struttura "switch-case" non solo i codici di controllo remoto possono essere utilizzati per accendere e spegnere la lanterna, ma può quindi realizzare eventuali estensioni delle funzioni. Nella prossima parte della serie, vedremo solo che ed espandere le funzioni della nostra lanterna per includere diversi tipi di simulazione del fuoco. Sono felice di potervi fornire la prossima parte presto e vi auguro un sacco di divertimento con la ricostruzione. Le domande sono, ovviamente, benvenute come sempre.

 

 

Für arduinoProjekte für fortgeschrittene

8 commenti

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.

Lascia un commento

Tutti i commenti vengono moderati prima della pubblicazione