De lantaarn staat bij mij thuis in een hoek die niet zo gemakkelijk met de hand te bereiken is. Dus elke keer als ik trek de voeding stekker of actuate een schakelaar om de lantaarn aan of uit te schakelen, vind ik het een beetje vervelend. Dit moet anders! En ja, het kan anders, namelijk trouw aan het tv-model, met een infrarood afstandsbediening. Echter, voordat we comfortabel kunnen zitten in de bank en zet onze lantaarn aan en uit met de afstandsbediening, moeten we een aantal veranderingen en voorbereidingen zoals altijd. Het belangrijkste wat we eerst nodig hebben is de afstandsbediening zelf. Ik koos voor mijn tv-afstandsbediening, die nog steeds een paar ongebruikte knoppen die ik wil gebruiken voor dit doel heeft. Maar daarover later meer. Het volgende wat we nodig hebben op de hardware kant is de KY-022 IR-ontvangermodule. van onze AZ Delivery Shop. We hebben dit nodig zodat onze nano de infraroodsignalen kan ontvangen en evalueren. Dus we draad onze nieuwe module als volgt:
Zoals te zien is, worden de signalen van de IR-ontvanger doorgestuurd naar pin 11 van de nano en geëvalueerd door de Arduino. Om de Arduino de infraroodsignalen te laten evalueren, hebben we de bibliotheek nodig voor onze code IRRemote die we nodig hebben om te downloaden en te installeren in de IDE vooraf. Na het installeren van de bibliotheek uploaden we de volgende code:
#include <Adafruit_NeoPixel.H> #include <IRremote.H> #define Pin 6 Welke pin op de Arduino is aangesloten op de NeoPixels? #define RECV_PIN 11 IR-invoerspeld definiëren op Arduino #define NUMPIXELS 12 Hoeveel NeoPixels zijn gekoppeld aan de Arduino? Populaire NeoPixel-ringgrootte Adafruit_NeoPixel Pixels(NUMPIXELS, Pin, NEO_GRB + NEO_KHZ800); IRrecv IRrecv irrecv irrecv(RECV_PIN); decode_results Resultaten; decode_results klasse is gedefinieerd in IRremote.h Lange FirelastTime = 0; Lange IRlastTime = 0; Lange TimerlastTime = 0; Int Interval; Lange IRCode = 0; Lange OLDIRCode = 0; Bool FireON (FireON) = Valse; Bool FireOFF FireOFF FireOFF = Valse; Byte FireSequence FireSequence = 0; Void Setup() { Seriële.Beginnen(115200); Terwijl (!Seriële); wacht tot Serial is vastgesteld - vereist op sommige platforms irrecv irrecv.enableIRIn(); De ontvanger starten Pixels.Beginnen(); INITIALIZE NeoPixels Pixels.Toon(); Initialiseer alle pixels om 'uit' Interval = 400; randomSeed randomSeed(analoogLezen(0)); } Void Simuleren Vuur (Bool Op, Int FireSq FireSq) { Als (millis() - FirelastTime >= Interval) { Als (Op) { FireOFF FireOFF FireOFF = Valse; FirelastTime = millis(); Byte Lichtwaarde[NUMPIXELS * 3]; Byte FireColor FireColor = 60; Interval = Willekeurige(150, 200); FireColor FireColor = 60; random (0,50); Voor (Int I. = 0; I. < NUMPIXELS; I.++) { Voor elke pixel... Lichtwaarde[I. * 3] = Willekeurige(240, 255); // 250 Lichtwaarde[I. * 3 + 1] = Willekeurige(30, 60); // 50 Lichtwaarde[I. * 3 + 2] = 0; } Sommige lampjes donkerder schakelen Byte LightsOff = Willekeurige(0, 4); Voor (Int I. = 0; I. < LightsOff; I.++) { Byte Geselecteerde = Willekeurige(NUMPIXELS); Lichtwaarde[Geselecteerde * 3] = Willekeurige(50, 60); Lichtwaarde[Geselecteerde * 3 + 1] = Willekeurige(5, 10); Lichtwaarde[Geselecteerde * 3 + 2] = 0; } Voor (Int I. = 0; I. < NUMPIXELS; I.++) { Voor elke pixel... Pixels.setPixelColor(I., Lichtwaarde[I. * 3], Lichtwaarde[I. * 3 + 1], Lichtwaarde[I. * 3 + 2]); } noInterrupts(); Pixels.Toon(); Stuur de bijgewerkte pixelkleuren naar de hardware. irrecv irrecv.Hervatten(); Interrupts(); } Anders { Als (!(FireOFF FireOFF FireOFF)) { Pixels.Duidelijk(); noInterrupts(); Pixels.Toon(); Stuur de bijgewerkte pixelkleuren naar de hardware. irrecv irrecv.Hervatten(); Interrupts(); FireOFF FireOFF FireOFF = Waar; } } } } Lange ReceiveIrCommand Ontvangen () { Lange Resultaat = 0; Als (millis() - IRlastTime >= 200) { IRlastTime = millis(); Als (irrecv irrecv.Decoderen(&Resultaten)) { Resultaat = Resultaten.Waarde; irrecv irrecv.Hervatten(); Ontvang de volgende waarde Terug Resultaat; } irrecv.resume(); Ontvang de volgende waarde } Terug 0 ; } Void IRCommandProcessor (Lange Opdracht) { Als (IRCode == OLDIRCode) { TimerlastTime = millis(); Sommige dingen over het ontstuiteren IR Remote } Als (millis() - TimerlastTime >= 400) { OLDIRCode = 0 ; Sommige dingen over het ontstuiteren IR Remote } Als ((IRCode < -1) & (IRCode != OLDIRCode)) IR-signaal ontvangen { OLDIRCode = IRCode; Sommige dingen over het ontstuiteren IR Remote Schakelen (IRCode) { Geval -522164073: In mijn geval een blauwe schakelaar op mijn TV - Remote { FireON (FireON) = !FireON (FireON); } Breken; Standaard: Seriële.println(IRCode); Breken; } } } Void Lus() { IRCode = ReceiveIrCommand Ontvangen(); IRCommandProcessor(IRCode); Simuleren Vuur(FireON (FireON), FireSequence FireSequence); }
Maar voordat we onze eigen afstandsbediening kunnen integreren, moeten we eerst het terminalvenster openen met een interfacesnelheid van 115200 Baud. Nu houden we onze geselecteerde afstandsbediening voor de sensor en drukken op een paar knoppen. Een uitvoer moet ongeveer als volgt zijn:
De negatieve lange getallen die elke keer dat u op een knop drukt, worden weergegeven, komen overeen met de infraroodcode, de betreffende knop op de afstandsbediening. Het getal -522145713 komt bijvoorbeeld overeen met de knop '1' op de afstandsbediening. Dus als we de "1" knop willen gebruiken om onze lantaarn aan en uit te zetten, moeten we deze "nummercode" invoeren in onze Arduino-code. We doen dit op het volgende punt in de code:
switch (IRCode){geval -522145713: / Hier is uw eigen IR-nummercode voorde functie in- en uit te voeren{FireON = ! FireON;}
Vanaf nu, wanneer de geselecteerde afstandsbedieningsknop wordt ingedrukt, wordt de code NIET meer weergegeven in de seriële monitor, maar wordt de lantaarn ingeschakeld of uitgeschakeld bij ontvangst.
De geneigde lezer zal waarschijnlijk al hebben erkend dat via de "switch-case" structuur niet alleen afstandsbediening codes kunnen worden gebruikt om de lantaarn aan en uit te schakelen, maar kan dus realiseren eventuele uitbreidingen van de functies. In het volgende deel van de serie kijken we daar naar en breiden we de functies van onze lantaarn uit met verschillende brandsimulatietypes. Ik ben blij dat ik u binnenkort van het volgende deel kan voorzien en wens u veel plezier met de wederopbouw. Vragen zijn natuurlijk welkom zoals altijd.
8 Reacties
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
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
Hallo Mirko,
Probiere mal bitte folgende Code Änderung aus :
if ((IRCode != 0) & (IRCode != OLDIRCode))
Damit sollten jetzt beide Fernbedienungsarten funktionieren.
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
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
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
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
Schönes, einfaches, aber effektvolles Projekt für Einsteiger, gut erklärt.