Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Alte Fernbedienungen wiederverwenden

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
5 mm LED:Rot
Eine rote für die Status-LED, danach ist die Farbe nicht wirklich wichtig - muss nur noch erkennen können, welche aktiv ist.
× 3
5 mm LED:Grün
Farbe ist nicht wirklich wichtig - man muss nur erkennen können, welche aktiv ist
× 1
5 mm LED:Gelb
Farbe ist nicht wirklich wichtig - man muss nur erkennen können, welche aktiv ist
× 1
Blaue LED
Farbe ist nicht wirklich wichtig - man muss nur erkennen können, welche aktiv ist
× 2
Lötfreies Steckbrett in voller Größe
× 1
Jumper (generisch)
× 1
Kippschalter (Aus)-Ein
Jeder SPST-Kippschalter funktioniert
× 1
SparkFun Breadboard Netzteil Stick 5V/3,3V
Optional, wenn Sie 5 Volt von einer anderen Quelle liefern können oder wenn Sie es über den USB-Anschluss Ihres Computers verwenden ,
× 1
IR-Empfänger (generisch)
Ich habe einen KY-022 37,9-KHz-Infrarot-IR-Sensorempfänger verwendet, den ich von Amazon bezogen habe
× 1

Über dieses Projekt

Dieses Projekt ermöglicht es Ihnen, überschüssige Fernbedienungen von alten Videorecordern, Fernsehern, DVD-Playern usw. wiederzuverwenden.

Sie können die Fernbedienungen verwenden, um Geräte wie Lampen, Heizungen usw. mit Relais, Leistungstransistoren oder allem anderen einzuschalten, das ein 5-Volt-Signal steuern kann. Wie hier gezeigt, schaltet es nur bis zu 6 LEDs um. Die Idee ist, die Skizze und das Steckbrett-Layout bereitzustellen, damit die an die LEDs gesendeten Signale parallel gesendet werden können, was der Benutzer sich vorstellt!

Wie konzipiert, liest es 6 IR-Codes von jeder Fernbedienung und "speichert" sie. Ich verwende gerne die Ziffern 1, 2, 3, 4, 5, 6 - aber alle sechs Tasten funktionieren. Beachten Sie, dass jede andere Taste mit einem anderen IR-Code als den 6 bekannten Codes als Reset fungiert und alle Ausgänge ausschaltet. Ich erreiche dies, indem ich die Codes als lange Ganzzahlen in den EEPROM-Speicher auf der Ardunio-Platine schreibe. Jeder benötigt 4 Byte, aber da die UNO und NANO jeweils 1024 Byte EEPROM-Speicher haben, gibt es viel Platz. Dieser Speicher hält erwartungsgemäß durch Resets und Power-Offs. Das Ganze würde bis auf den Kippschalter auf ein einziges Steckbrett passen. An diesen Schalter können Pins angelötet werden, um ihn auf dem Steckbrett aufzunehmen. Ich war faul und benutzte Klebeband, um es während der Entwicklung auf meinem Schreibtisch zu halten.

Ich habe es mit fünf verschiedenen alten überzähligen ausprobiert, und sie funktionieren alle gleich. Das "Problem", mit dem ich zu kämpfen hatte, war Streulicht oder schwächere Signale von einigen Fernbedienungen. Um dies zu lösen, habe ich den Empfänger "LED" vorsichtig auf etwa 45 Grad nach unten gebogen und eine kleine selbstgemachte Karton- und Klebebox darüber gelegt, mit einem Ende offen. Es scheint die Codes konsistent und aus einer Entfernung von 5 bis 8 Fuß oder mehr zu erfassen. Ich habe seit über fünf Tagen des Testens und Optimierens des Programms nichts verpasst.

Verwenden Sie zum Programmieren die Position "Lernen". Sie wechseln vom "Run"-Modus in den "Learn"-Modus, indem Sie einen Kippschalter umlegen. Dieser Schalter schaltet eine rote Modusanzeige-LED ein und zeigt damit an, dass er hörbereit ist. Es blinkt LED 1 und Sie drücken eine Taste auf Ihrer Fernbedienung. Die blinkende LED 1 ist so programmiert, dass sie auf diesen Code reagiert. Sobald er den Code erkennt, blinkt die Modusanzeige-LED für ein oder zwei Sekunden schnell (so schnell, dass es aussieht, als würde sie vibrieren!) und geht zur nächsten LED über. Dies wird fortgesetzt, bis alle sechs programmiert sind. Dann blinkt die Modusanzeige-LED langsam in Intervallen von einer Sekunde, um anzuzeigen, dass das System in den Betriebsmodus umgeschaltet werden sollte.

Beim Programmieren stellte ich fest, dass der häufigste Fehler darin bestand, zu vergessen, den Finger zur nächsten Ziffer auf der Fernbedienung zu bewegen. Somit ist es einfach, zwei Ausgänge mit dem gleichen Code zu programmieren. Bei jedem Start sucht es nach solchen Duplikaten. Wenn es sie findet, blinken die "beleidigenden" LEDs einige Male auf, um darauf hinzuweisen, dass eine Neuprogrammierung erforderlich sein könnte. Eine Person möchte jedoch möglicherweise, dass mehrere Schlüssel dasselbe tun, sodass eine Neuprogrammierung nicht erzwungen wird.

Modusstatus, Fehler etc. werden durch die Blinkfrequenz der ROTEN Status-LED angezeigt. Alle durch die blinkenden LEDs usw. angezeigten Informationen werden an den seriellen Monitor gesendet. Ich habe es so eingerichtet, dass es LED-Blitzfolgen verwendet, damit ein Benutzer es ohne Computer einrichten kann. Die an den seriellen Monitor gesendeten Nachrichten sind einfacher zu verfolgen, als sich zu merken, was blinkende LEDs mit verschiedenen Geschwindigkeiten bedeuten. Da dies normalerweise nur wenige Male programmiert wird, ist es wahrscheinlich natürlicher, es an Ihren PC anzuschließen und den Text auf dem seriellen Monitor anzusehen.

Es gibt viele Checks and Balances im Sketch-Code. Sie sind gut dokumentiert (hoffe ich!), daher werde ich hier keine Details nennen. Benutzer, die mit C, C++ und der Arduino-IDE vertraut sind, sollten in der Lage sein, dem Code leicht zu folgen und bei Bedarf Änderungen vorzunehmen.

Nachtrag: Ich habe dies mit 5 Relais parallel zu den LEDs 1 bis 5 getestet und es funktioniert wie erwartet. Sie alle schalten eine 120-VAC-Tischlampe um, sodass die Schaltung wie erwartet funktioniert. Mir sind die Relais ausgegangen, also muss man davon ausgehen, dass das 6. Signal auch funktioniert. Beachten Sie, dass dies nur ein Proof of Concept ist. Ich musste die Signale der ersten vier Ausgänge mit einem CD4011 Quad-NAND-Gatter invertieren, da sie bei 0 Volt im Gegensatz zu 5 Volt schließen. Das einzelne Relais arbeitet mit einem +5-Volt-Signal, sodass keine Signalumkehrung erforderlich war. Bitte seien Sie beim Schalten der Netzspannungen vorsichtig. Sie stehen unter Hochspannung und haben das Potenzial, einen schlimmen Schlag zu verursachen oder sogar zu töten!

Denken Sie daran, dies ist nur ein Beispiel. Lassen Sie Ihrer Fantasie freien Lauf, welche Geräte Sie an die 6 Ausgänge anschließen möchten. Viel Spaß!

Code

  • Umnutzungsskizze mit IR-Fernbedienung
Umnutzungsskizze der IR-FernbedienungArduino
/* Schalten Sie 6 LEDs mit einer IR-Fernbedienung um, um zu veranschaulichen, wie Sie Surpulus-Fernbedienungen wiederverwenden können, damit sie zur Steuerung fast jedes Geräts verwendet werden können. Diese Skizze lernt die Herstellercodes für die Tasten 1,2,3,4,5,6 und 0 auf jeder IR-Fernbedienung, wenn sich der Kippschalter in der Position "Lernen" oder Programmieren befindet. Diese Werte werden im EEPROM des Arduino Nano gespeichert. Wenn der Kippschalter in den "Run"-Modus gebracht wird, werden diese Werte verwendet, um zu bestimmen, welche Taste gedrückt wird. 6 zugehörige LEDs werden dann von der Fernbedienung ein- und ausgeschaltet. Dies soll demonstrieren, wie die Codes unabhängig von der Art der IR-Fernbedienung gelernt und erkannt werden. Neben LEDs können die Ausgänge zum Ein- oder Ausschalten von Geräten mit Relais, Hochleistungstransistoren usw. erweitert werden. Paul M. Dunphy VE1DX März 2020 */ // Von Ken Shirriff entwickelte IR Remote Library einschließen#include // Ermöglichen Sie das Lesen/Schreiben der 1024 Bytes des EEPROM#include long unsigned int intIRCode;long unsigned int savedIRCodes[6];long unsigned int dupeCheck[6]; // Pin für den IR-Sensor definieren const int Recv_Pin =2; // Definieren Sie Pin-Konstanten zum Umschalten der LEDsconst int PinOne =12; const int PinTwo =11;const int PinThree =10; const int PinFour =9;const int PinFive =8; const int PinSix =7; // Definiere Pin-Konstanten zum Lesen und // Status von Run/Learn Toggle switch.const int switchPin =4; const int statusPin =5; const unsigned long int repeatKeyPress =0xFFFFFFFF;boolean learnMode; // Wird verwendet, um zu verfolgen, in welchem ​​// Modus wir uns gemäß dem Toggle switch befinden.boolean first_iteration; // Definiere ganze Zahlen, um sich die Umschaltzustände jeder LED zu merkenint togglestate1;int togglestate2;int togglestate3;int togglestate4;int togglestate5;int togglestate6;int current_remote_code;int remote_code_1;int remote_code_2;int remote_code_3;int remote_code_4;int remote_code_5;int remote_code_6; // IR-Empfänger und Ergebnisobjekte definierenIRrecv irrecv(Recv_Pin);decode_results results;void EEPROMWritelong(int address, long value)// Schreibe eine 4 Byte (32 Bit) lange ganze Zahl in das EEPROM // Da sie 4 Byte lang sind, sind sie gespeichert bei // Adresse zu Adresse + 3 { // Zerlege einen langen Integer in 4 Byte mit Bitshift. // Eins =Höchstwertiges -> Vier =Niederwertigstes Byte Byte vier =(Wert &0xFF); Byte drei =((Wert>> 8) &0xFF); Byte zwei =((Wert>> 16) &0xFF); Byte eins =((Wert>> 24) &0xFF); EEPROM.write (Adresse, vier); EEPROM.write (Adresse + 1, drei); EEPROM.write (Adresse + 2, zwei); EEPROM.write (Adresse + 3, eins); }long EEPROMReadlong(lange Adresse)// Lesen Sie eine 4 Byte (32 Bit) lange Ganzzahl aus dem EEPROM.// Da sie 4 Byte lang sind, wurden sie an // Adresse an Adresse + 3 gespeichert { Long four =EEPROM.read( die Anschrift); lange drei =EEPROM.read (Adresse + 1); lange zwei =EEPROM.read (Adresse + 2); lange =EEPROM.read (Adresse + 3); // Die Bytes zu einer langen Ganzzahl zusammenfügen und zurückgeben ((vier <<0) &0xFF) + ((drei <<8) &0xFFFF) + ((zwei <<16) &0xFFFFFF) + ((eins <<24) &Tastendruck wiederholen); }int Flip_LED (int led, int toggle_state) { if (toggle_state==0) { digitalWrite (led, HIGH); toggle_state=1; aufrechtzuerhalten. Sonst { DigitalWrite (led, LOW); toggle_state=0; } toggle_state zurückgeben; }void Reset() {// Schalten Sie alle LEDs aus und setzen Sie die Toggle // Flags auf off (0) digitalWrite (PinOne, LOW); digitalWrite (PinTwo, LOW); digitalWrite (PinThree, NIEDRIG); digitalWrite (PinFour, NIEDRIG); digitalWrite (PinFive, LOW); digitalWrite (PinSix, LOW); togglestate1 =0; togglestate2 =0; togglestate3 =0; togglestate4 =0; togglestate5 =0; togglestate6 =0; aufrechtzuerhalten. Void rateType () { Serial.print ( "Remote scheint eine zu sein"); Schalter (results.decode_type) {Fall NEC:Serial.println("NEC"); brechen; Fall SONY:Serial.println("SONY"); brechen; Fall RC5:Serial.println("RC5"); brechen; Fall RC6:Serial.println("RC6"); brechen; Fall DISH:Serial.println("DISH"); brechen; Fall SHARP:Serial.println("SHARP"); brechen; Fall JVC:Serial.println("JVC"); brechen; Fall SANYO:Serial.println("SANYO"); brechen; Fall MITSUBISHI:Serial.println ("MITSUBISHI"); brechen; Fall SAMSUNG:Serial.println("SAMSUNG"); brechen; Fall LG:Serial.println("LG"); brechen; Fall WARUM:Serial.println ("WHYNTER"); brechen; Fall AIWA_RC_T501:Serial.println("AIWA_RC_T501"); brechen; Fall PANASONIC:Serial.println("PANASONIC"); brechen; Fall DENON:Serial.println("DENON"); brechen; Standardwert:Groß-/Kleinschreibung UNBEKANNT:Serial.println("UNBEKANNT"); brechen; } } int learnCodeRead (int pinCode) { if (irrecv.decode (&results)) { pinCode =results.value; } PinCode zurückgeben; aufrechtzuerhalten. Void Confirm() {int i; for(i=0; i<=20; i++) { digitalWrite (statusPin, HIGH); Verzögerung (50); digitalWrite (statusPin, LOW); Verzögerung (50); } digitalWrite (statusPin, HIGH); // "Learn" LED hoch lassen} void learn_Mode() { Boolean goodCode; int i, j; int-Position; int-Pins[6] ={12,11,10,9,8,7}; // Beginnen Sie, nacheinander zu hören if (first_iteration) { Serial.println (); Serial.println ( "Eintritt in den Lernmodus"); Serial.println(); } intIRCode =0; Ort =0; guterCode =wahr; j =0; während ((goodCode=true) und (j<=5)) { for(i=0; i<=25; i++) { digitalWrite (pins[j], HIGH); Verzögerung (200); intIRCode =learnCodeRead(intIRCode); digitalWrite (Pins [j], LOW); Verzögerung (200); intIRCode =learnCodeRead(intIRCode); goodCode =((intIRCode !=repeatKeyPress) und (intIRCode !=0)); wenn (guter Code) { i =30; // Trick, um die Schleife zu verlassen, weil 'break' // bei Schleifen nicht funktioniert } irrecv.resume(); // Beginnen Sie erneut mit dem Hören } goodCode =(intIRCode !=repeatKeyPress and intIRCode !=0); if (goodCode) { if (j==0) { rateType(); } Serial.print ("Schreiben in den EEPROM-Speicherort"); Serial.print (Speicherort); Serial.print ( "IR-Code ="); Serial.println (intIRCode, HEX); EEPROMWritelong(Ort, intIRCode); Standort =Standort + 4; j++; Bestätigen Sie(); intIRCode =0; irrecv.resume(); // Beginnen Sie erneut mit dem Hören}} Serial.println (); Serial.println ("Versetzen Sie Arduino wieder in den Ausführungsmodus."); Während (digitalRead (switchPin) ==HIGH) { digitalWrite (statusPin, HIGH); Verzögerung (1000); digitalWrite (statusPin, LOW); Verzögerung (1000); } Serial.println(); Serial.println ( "Zurück in den Ausführungsmodus."); // Muss hier wahrscheinlich nicht so drastisch sein, aber // Dies ist ein "Reset", um sicherzustellen, dass wir den Lernmodus // verlassen und richtig neu starten. Es ist *wahrscheinlich* in Ordnung, // die folgenden 4 Zeilen zu entfernen. Verzögerung (50); Serial.flush(); Verzögerung (50); asm flüchtig (" jmp 0"); aufrechtzuerhalten. Void run_Mode () { if (first_iteration) { Serial.println ( "Eintritt in den Laufmodus"); } if (irrecv.decode(&results)) { if (results.value!=repeatKeyPress) { current_remote_code =results.value; Serial.print ("Tastendruck erkannt, IR-Code ="); Serial.println (current_remote_code, HEX); if (current_remote_code ==remote_code_1) { togglestate1 =Flip_LED (PinOne, togglestate1); aufrechtzuerhalten. Sonst if (current_remote_code ==remote_code_2) { togglestate2 =Flip_LED (PinTwo, togglestate2); aufrechtzuerhalten. Sonst if (current_remote_code ==remote_code_3) { togglestate3 =Flip_LED (PinThree, togglestate3); aufrechtzuerhalten. Sonst if (current_remote_code ==remote_code_4) { togglestate4 =Flip_LED (PinFour, togglestate4); aufrechtzuerhalten. Sonst if (current_remote_code ==remote_code_5) { togglestate5 =Flip_LED (PinFive, togglestate5); aufrechtzuerhalten. Sonst if (current_remote_code ==remote_code_6) { togglestate6 =Flip_LED (PinSix, togglestate6); aufrechtzuerhalten. Sonst { Zurücksetzen (); } } Verzögerung (500); // Wird verwendet, um den schnellen Datenstring zu umgehen, // wenn eine Taste gedrückt gehalten wird. Verlangsamt die Reaktionszeit // durch Einführung einer Verzögerung in der Schleife. irrecv.resume(); // Beginnen Sie erneut mit dem Hören} aufrechtzuerhalten. Void setup () { first_iteration =true; int i,j,k; int-Position; int dupeFlash[6] ={12,11,10,9,8,7}; // Pin-Nummern blinken // wenn Duplikate gefunden wurden Serial.begin (9600); irrecv.enableIRIn(); // Aktivieren Sie den IR-Empfänger /* Der folgende Codeabschnitt sollte niemals das EEPROM zurücksetzen müssen. * Allerdings erscheinen einige neue NANOs "von der Stange", deren EEPROMs * auf FFFFFFFFs eingestellt sind. Dies ist der Code, der von vielen IR-Fernbedienungen gesendet wird, wenn * eine Taste gedrückt gehalten wird. Diese Skizze prüft an mehreren Stellen auf diesen Code * und funktioniert nicht richtig, wenn einem "Schlüssel" ein Hex-FFFFFFFF zugewiesen wird. Um * dieses Problem zu vermeiden, prüfen wir nach FFFFFFFFs und wenn wir eines finden, setzen wir * die 6 Schlüsselpositionen auf Sony RM-YD104-Codes. Wenn dies passiert, müssen Sie den Sketch im Modus "Lernen" * ausführen, um ihn zu initialisieren, es sei denn, Sie * verwenden diese bestimmte Fernbedienung. */// =============Neues Arduino beginnen ==================Boolean defaultToSony =false; long unsigned int IRCode =0; Ort =0; for(i=0; i<=5; i++) { IRCode =EEPROMReadlong(location); if (IRCode==repeatKeyPress) { defaultToSony =true; } Standort =Standort + 4; } if (defaultToSony) { Serial.println ( "HEX FFFFFFFF im EEPROM-Speicher gefunden. Einstellungscodes"); Serial.println ( "für eine Sony RM-YD104-Fernbedienung. Jetzt den Lernmodus ausführen"); Serial.println ( "wird empfohlen, es sei denn, dies ist die Fernbedienung, die Sie haben."); EEPROMWritelong(0, 0x10); Verzögerung (50); EEPROMWritelong(4, 0x810); Verzögerung (50); EEPROMWritelong(8, 0x410); Verzögerung (50); EEPROMWritelong(12, 0xC10); Verzögerung (50); EEPROMWritelong(16, 0x210); Verzögerung (50); EEPROMWritelong(20, 0xA10); Verzögerung (50); } // =============End New Arduino ==================// LED-Pins als Ausgänge einstellen PinMode (PinOne, OUTPUT); pinMode (PinTwo, AUSGANG); pinMode (PinThree, AUSGANG); pinMode (PinFour, AUSGANG); pinMode (PinFive, AUSGANG); pinMode (PinSix, AUSGANG); Zurücksetzen(); // Beginnen Sie mit allen aus pinMode (statusPin, OUTPUT); pinMode (switchPin, INPUT); // Codes von der zuletzt verwendeten Remote Serial.println () abrufen; Serial.println ( "Gespeicherte IR-Fernbedienungscodes lesen . . . "); Ort =0; for(j=0; j<=5; j++) { savedIRCodes[j] =EEPROMReadlong(location); Serial.print ("Lesen vom EEPROM-Speicherort"); Serial.print (Speicherort); Serial.print("IR-Code =");Serial.println(savedIRCodes[j],HEX); Standort =Standort + 4; dupeCheck[j]=gespeicherteIRCodes[j]; // Kopie zur Duplikatsprüfung speichern } // Nach aufeinanderfolgenden Duplikatcodes suchen, die den // Ausgängen zugewiesen sind. Wir suchen nicht nach Gesamtduplikaten, da // sie wahrscheinlich nicht vorkommen. Die Erfahrung hat gezeigt, dass // während der Programmierung der wahrscheinlichste Fehler darin besteht, // dieselbe Taste zweimal auf Back-to-Back-LEDs zu drücken. Wenn Duplikate // gefunden werden, zeigen Sie dies durch Blinken der verdächtigen LEDs an. // Es gibt nur 6 LEDs, daher sind nur 21 Vergleiche // erforderlich, um Duplikate zu finden (6 + 5 + 4 + 3 + 2 + 1 =21). Dieser // Abschnitt könnte erweitert werden, um nach Duplikaten zu suchen, indem // zuerst das Array sortiert wird usw. for (i =0; i <5 - 1; i++) { for (j =i + 1; j <6; j++ ) { if (dupeCheck[i] ==dupeCheck[j]) { Serial.println ( "Doppelte Codes gefunden. Schlagen Sie vor, den Lernmodus erneut auszuführen"); for(k=0; k<=5; k++) {digitalWrite(dupeFlash[i],HIGH); digitalWrite(dupeFlash[j],HIGH); Verzögerung (1000); digitalWrite(dupeFlash[i],LOW); digitalWrite(dupeFlash[j],LOW); Verzögerung (1000); } } } } remote_code_1 =savedIRCodes[0]; remote_code_2 =gespeicherteIRCodes[1]; remote_code_3 =gespeicherteIRCodes[2]; remote_code_4 =gespeicherteIRCodes[3]; remote_code_5 =gespeicherteIRCodes[4]; remote_code_6 =gespeicherteIRCodes[5]; Verzögerung (1000); Serial.println ( "Gespeicherte Codes gelesen."); Serial.println(); aufrechtzuerhalten. Void loop () { // Überprüfen Sie, ob der Schalter ein- oder ausgeschaltet ist. Wenn es eingeschaltet ist (im Lernmodus) // ist der switchPin HIGH:learnMode =(digitalRead (switchPin) ==HIGH); if (learnMode) { first_iteration =true; Zurücksetzen(); digitalWrite (statusPin, HIGH); // Lernmodus-LED einschalten:learn_Mode (); Zurücksetzen(); first_iteration =false; aufrechtzuerhalten. Sonst { DigitalWrite (statusPin, LOW); // Lernmodus-LED ausschalten:run_Mode(); first_iteration =false; } }

Schaltpläne


Herstellungsprozess

  1. Leuchtdiode (LED)
  2. Wetterfernüberwachung mit Raspberry Pi
  3. Raspberry Pi Universal-Fernbedienung
  4. Ferngesteuerter Herzfrequenzmesser
  5. Sargtanzmelodie
  6. Konvertieren Sie Ihr altes Telefon in einen Fernschalter
  7. Erstellen von Bildern mit einer LED
  8. 8x LED-Beleuchtung mit Ton
  9. Die 5 wichtigsten Faktoren für die Auswahl einer Steuerungsplattform
  10. So entsorgen Sie alte Maschinen sicher