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

Aufbau einer IR-Brücke mit SmartThings ThingShield

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
SmartThings Shield für Arduino
× 1
IR-emittierende LED
× 1
IR-Empfängerdiode
× 1
100 Ohm Widerstand (optional)
× 1

Über dieses Projekt

Einführung

Eine einfache TV-Fernbedienung kann viel mehr als den Kanalwechsel, wenn sie mit der SmartThings-Cloud verbunden ist. Mit einer kleinen Anzahl von Teilen und einer sofortigen Auszahlung ist das Projekt eine gute Möglichkeit, die Plattform zu erkunden.

Hintergrund zu Arduino und dem ThingShield

Das SmartThings ThingShield macht es einfach, SmartThings-Prototypen mit Arduino zu erstellen. Die Abschirmung verbindet sich direkt mit der UNO, die über das Zigbee-Protokoll mit dem SmartThings-Hub verbunden ist. Ein Schalter auf dem Shield ermöglicht es, zwischen der Verwendung der Pins 0,1 oder 2,3 zu wählen, um mit dem Arduino zu kommunizieren. Das ThingShield behält sich bereits die Verwendung von Pin 6 vor.

Weitere Informationen zu den ersten Schritten mit Arudino:http://arduino.cc/en/Guide/Introduction

Schritt 1:Sie benötigen

  • (x1) SmartThings Arduino ThingShield
  • (x1) Arduino Uno
  • (x1) IR-Empfänger
  • (x1) IR-emittierende LED
  • (x1) 100 Ohm Widerstand (optional)


Schritt 2:Laden Sie die IR-Bibliothek herunter

Das Projekt hängt von einer wunderbaren Arduino-Bibliothek ab, die von Ken Shirriff entwickelt wurde. https://github.com/shirriff/Arduino-IRremote

Installieren Sie die Arduino-Bibliothek wie gewohnt.

http://arduino.cc/en/Guide/Libraries

Nach der Installation müssen wir IRRemoteInt.h ändern, um den Timer an Pin 9 zu verwenden. In diesem Beispiel verwenden wir Pin 3 für die Kommunikation mit dem ThingShield.


Schritt 3:Arduino-Skizze

Als nächstes laden Sie die Skizze auf Ihr Arduino-Board hoch (siehe Codeabschnitt).


Schritt 4:Der Build

Der Aufbau ist einfach und unkompliziert. Verbinden Sie zuerst das ThingShield oben auf dem Arduino. Obwohl in der Abbildung unten nur das Arduino gezeigt wird, sind die Pin-Platzierungen mit dem angebrachten Schild gleich.

Verbinden Sie für den IR-Empfänger die entsprechenden Pins mit Masse und 5V. Verbinden Sie dann den Daten-Pin mit dem Arduino-Pin 11. Verbinden Sie die IR-emittierende LED mit Pin 9 und Masse. Der 100-Ohm-Widerstand ist in diesem Design optional, da die LED wahrscheinlich den maximalen Strom vom Arduino verarbeiten kann, da sie schnell blinkt, um Signale zu senden. Dauerhaft eingeschaltet, würde der gleiche Strom wahrscheinlich die LED durchbrennen.


Schritt 5:Erstellen eines benutzerdefinierten SmartThings-Gerätetyps

In der SmartThings IDE erstellen wir als nächstes einen neuen Gerätetyp für unser ThingShield.

Gehen Sie zum Abschnitt „Meine Gerätetypen“ und klicken Sie rechts auf „Neues SmartDevice“.

Das Erstellen eines neuen SmartDevice erfordert zwei Schritte. Geben Sie dem neuen Gerätetyp zunächst oben einen Namen „Ir Bridge“. Beachten Sie, dass wir später in unserem SmartApp-Code auf den Namen unseres SmartDevice verweisen werden.

Wir müssen die Attribute (Variablen) und Befehle (Funktionen) des Geräts definieren. Für dieses Tutorial erstellen wir die Attribute und Befehle für zwei programmierbare Tasten und eine Aufnahmetaste. Fügen Sie alle angezeigten Attribute und Befehle hinzu. Wählen Sie „Erstellen“, um mit der Codierung des Geräts fortzufahren.

Als nächstes kopieren Sie die Gerätedefinition in das Codefenster der IDE (siehe Codeabschnitt). Klicken Sie oben auf die Schaltfläche „Speichern“ und dann auf „Veröffentlichen“, um Ihnen das Gerät zur Verfügung zu stellen.


Schritt 6:Aktualisieren des ThingShield auf Ihren neuen Gerätetyp

Stellen Sie sicher, dass Sie Ihr ThingShield zu Ihrem SmartThings-Hub hinzufügen, wenn es noch nicht eingerichtet ist. Um das Gerät zu koppeln, befestigen Sie das ThingShield an Ihrem Arudino und geben Sie ihm Strom. Halten Sie die Taste „Switch“ auf dem Schild 6 Sekunden lang gedrückt. Wählen Sie in der SmartThings-Smartphone-App die Schaltfläche Hinzufügen. Drücken Sie die physische „Schalter“-Taste noch einmal und Sie sollten sehen, dass der Hub das ThingShield erkennt.

Zurück in der IDE navigieren Sie zu Ihrem Arduino ThingShield, indem Sie auf dem Startbildschirm auf "Geräte" klicken. Wählen Sie Ihr Gerät aus der Liste aus und klicken Sie unten auf der Seite auf die Schaltfläche „Bearbeiten“. Wählen Sie aus dem Dropdown-Menü „Typ“ den neuen SmartDevice-Typ aus, den Sie erstellt haben. Es ist hilfreich, Geräten aussagekräftige Labelnamen zu geben, wenn Sie sie später auswählen müssen. Klicken Sie auf "Aktualisieren", um das Gerät auf Ihren neuen Gerätetyp einzustellen.

Beachten Sie, dass Sie bei der zukünftigen Veröffentlichung von Updates für Ihre benutzerdefinierten Gerätetypen zurückkehren möchten, um zu bestätigen, dass Ihre physischen Geräte nach einem veröffentlichten Update weiterhin mit dem richtigen Gerätetyp verbunden sind.


Schritt 7:Schreiben der SmartThings-App

Wir haben noch ein Stück Code im Projekt – die SmartApp selbst. Navigieren Sie zu „Meine SmartApps“ und starten Sie eine „Neue SmartApp“, indem Sie auf die Schaltfläche rechts klicken. Geben Sie ihm einen Namen, eine Beschreibung und eine Kategorie („Meine Apps“). Klicken Sie auf „Erstellen“, um mit der Codierung der App fortzufahren.

Kopieren Sie den smartApp-Code (siehe Code-Abschnitt). Wählen Sie „Speichern“ und klicken Sie dann auf „Veröffentlichen“, um die SmartApp auf Ihrer Smartthings iOS- oder Android-App (demnächst verfügbar) verfügbar zu machen.

Beachten Sie, dass wir den SmartDevice-Typ namentlich als „IrBridge“ bezeichnen, ohne das ursprüngliche Leerzeichen, das wir ursprünglich im Namen „Ir Bridge“ verwendet haben:

Geben Sie "irDevice", "device.IrBridge" ein

Die Zeile ermöglicht es uns, nur Geräte des Typs „Ir Bridge“ als Optionen zur Auswahl in der SmartApp anzuzeigen. Das verwendete camelCasing ist ein sehr spezifisches:Beim Verweisen auf Gerätetypen in Smart Apps werden Leerzeichen aus dem Namen entfernt. Das erste Zeichen und Zeichen, die ursprünglich auf ein Leerzeichen folgen, werden großgeschrieben. Alle anderen sind Kleinbuchstaben, unabhängig von der ursprünglichen Großschreibung.


Schritt 8:Aktivieren Sie die SmartApp

Verknüpfen Sie in der SmartThings-Smartphone-App die neue SmartApp mit unserem neuen IR-Gerät und wählen Sie die Schalter aus, die Sie steuern möchten. Klicken Sie dann auf „Installieren“.

Um jede der Tasten in der App zu programmieren, rufen Sie die Kacheldetails auf, indem Sie auf das Zahnrad in der Ecke der Kachel klicken. Wählen Sie die große Aufnahmetaste – sie wird rot, um anzuzeigen, dass Sie sich im Aufnahmemodus befinden. Klicken Sie dann auf die Kachel (Play/Pause oder B), die Sie steuern möchten – sie wird gelb. Richten Sie Ihre Fernbedienung auf das ThingShield und drücken Sie die Taste, die Sie lernen möchten. Das ThingShield sendet diesen Code nun an die SmartThings-Cloud und verknüpft ihn mit der Schaltfläche, die Sie in der SmartApp ausgewählt haben. Die neu programmierte Taste wird grün und die Aufnahmetaste wird wieder weiß.

Wenn Sie diese Taste das nächste Mal auf Ihrer Fernbedienung drücken, schalten Sie den Schalter um, den Sie der Taste in der SmartApp zugeordnet haben.

Code

  • Arduino-Skizze
  • Gerätedefinition
  • SmartApp-Code
Arduino-SkizzeC/C++
//************************************************ ****************************** /// @file/// @brief/// Arduino SmartThings IR-Schild/ /************************************************ ****************************#include //TODO muss wegen eines seltsamen Wire-Language-Linkers gesetzt werden, sollte wir absorbieren diese ganze Bibliothek in smartthings#include #include //**************************** ************************************************* // Pin-Definitionen | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVVVVVVVVVV//******************************************** *********************************#PIN_LED definieren 13#PIN_RECV definieren 11#PIN_THING_RX definieren 3#PIN_THING_TX definieren 2 //************************************************ **************************** // Globale Variablen | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVVVVVVVVVV//******************************************** *********************************SmartThingsCallout_t messageCallout; // Aufruf der Funktion forward decalarationSmartThings smartthing(PIN_THING_RX, PIN_THING_TX, messageCallout); // constructorbool isDebugEnabled; // Debug in diesem Beispiel aktivieren oder deaktivierenint stateLED; // Zustand um den letzten eingestellten Wert von LEDIRrecv zu verfolgen irrecv(PIN_RECV);IRsend irsend;decode_results Ergebnisse;//**************************** ************************************************* // API-Funktionen | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//******************************************** *********************************void setup () { // Standardzustand der globalen Variablen einrichten isDebugEnabled =true; stateLED =0; // stimmt mit dem Status des unten eingestellten Hardware-Pins überein // Setup-Hardware-Pins pinMode (PIN_LED, OUTPUT); // PIN_LED als Ausgang definieren digitalWrite (PIN_LED, LOW); // Wert auf LOW (aus) setzen, um stateLED =0 zu entsprechen, wenn (isDebugEnabled) { // Debug serielle Schnittstelle einrichten Serial.begin (9600); // seriell mit einer Baudrate von 9600 einrichten Serial.println ("setup.."); // 'setup..' beim Start ausgeben } irrecv.enableIRIn(); // Empfänger starten} //**************************************** **********************************void loop () { // Smartthing-Logik ausführen smartthing.run (); if (irrecv.decode(&results)) { blue(); irrecv.resume(); // Den nächsten Wert erhalten Serial.println (results.value, HEX); //dump(&Ergebnisse); //BEISPIEL:smartthing.send("HEX,XXXCODE"); Zeichenfolge irCmd; if (results.decode_type ==NEC) { irCmd =String(results.value, HEX) + "," + "NEC" + String(results.bits, DEC) + ":" + String(results.value, HEX); } else if (results.decode_type ==SONY) { irCmd =String(results.value, HEX) + "," + "SNY" + String(results.bits, DEC) + ":" + String(results.value, VERHEXEN); } else if (results.decode_type ==RC5) { irCmd =String(results.value, HEX) + "," + "RC5" + String(results.bits, DEC) + ":" + String(results.value, VERHEXEN); } else if (results.decode_type ==RC6) { irCmd =String(results.value, HEX) + "," + "RC6" + String(results.bits, DEC) + ":" + String(results.value, VERHEXEN); } else { irCmd =String(results.value, HEX) + "," + "RAW" + String(results.bits, DEC) + ":"; } Serial.println (irCmd); smartthing.send(irCmd); irCmd =""; }} //************************************************ ******************************void messageCallout (String-Nachricht) { smartthing.shieldSetLED (0, 0, 0); // Wenn Debug aktiviert ist, drucken Sie die empfangene Nachricht aus if (isDebugEnabled) { Serial.print ( "Rx:'"); Serial.print (Nachricht); Serial.println("'"); } String-Typ =message.substring(0,3); int startCode =message.indexOf(':'); String lenStr =message.substring(3,startCode); String codeStr =message.substring(startCode + 1); unsignierter langer Code; // wandle den Hex-String in einen langen vorzeichenlosen if(type !="RAW") code =stringToNum(codeStr,16); //funktioniert nicht für RAW int len ​​=stringToNum(lenStr,10); // Für jeden Typ - NEC, SON, PAN, JVC, RC5, RC6, etc ... die ersten 3 if (type =="NEC") { Serial.println ("NEC-SEND"); Serial.println (len); Serial.println (Code, HEX); irsend.sendNEC(code,len); irrecv.enableIRIn(); aufrechtzuerhalten. Sonst if(type =="SNY") {irsend.sendSony(code,len); irrecv.enableIRIn(); aufrechtzuerhalten. Sonst if(type =="RC5") {irsend.sendRC5(code,len); irrecv.enableIRIn(); aufrechtzuerhalten. Sonst if(type =="RC6") {irsend.sendRC6(code,len); irrecv.enableIRIn(); } }// Gibt die decode_results-Struktur aus.// Rufen Sie dies nach IRrecv::decode() auf// void * um das Compilerproblem zu umgehen//void dump(void *v) {// decode_results *results =(decode_results *) vvoid dump (decode_results *results) { int count =results->rawlen; if (results->decode_type ==UNKNOWN) { Serial.print ( "Unbekannte Kodierung:"); aufrechtzuerhalten. Sonst if (results->decode_type ==NEC) {Serial.print("Dekodierter NEC:"); aufrechtzuerhalten. Sonst if (results->decode_type ==SONY) {Serial.print("Dekodiert SONY:"); aufrechtzuerhalten. Sonst if (Ergebnisse-> decode_type ==RC5) { Serial.print ( "Dekodierter RC5:"); aufrechtzuerhalten. Sonst if (Ergebnisse-> decode_type ==RC6) { Serial.print ("Dekodierter RC6:"); aufrechtzuerhalten. Sonst if (results->decode_type ==PANASONIC) {Serial.print("Dekodierte PANASONIC - Adresse:"); Serial.print (Ergebnisse-> panasonicAddress, HEX); Serial.print("Wert:"); aufrechtzuerhalten. Sonst if (results->decode_type ==JVC) {Serial.print("Decoded JVC:"); } Serial.print (Ergebnisse -> Wert, HEX); Serial.print (""); Serial.print (Ergebnisse-> Bits, DEC); Serial.println ("Bits)"); Serial.print ( "Raw ("); Serial.print (count, DEC); Serial.print ("):"); for (int i =0; i Rawbuf [i] * USECPERTICK, DEC); aufrechtzuerhalten. Sonst {Serial.print (-(int) results-> rawbuf [i] * USECPERTICK, DEC); } Serial.print ( " "); } Serial.println("");} //**************************************** ************************************** // Lokale Funktionen | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//******************************************** *********************************unsigned long stringToNum(String s, int base) //10 für Dezimal, 16 für Hex{ unsigned long i =0; vorzeichenloser langer Wert =0; lange Stelle ohne Vorzeichen =s.length(); Zeichen c; langes Vorzeichen ohne Vorzeichen =1; for(i; i ='0' &&c <='9') //0 bis 9 {Wert +=(c - '0') * Exponent(Basis,Ort); } else if (c>='A' &&((c - 'A' + 10) ='a' &&(c - 'a' + 10)
GerätedefinitionGroovy
/** * Smart Ir * * Autor:[email protected] * Datum:2013-03-06 */metadata { // Simulator-Metadaten-Simulator {} // UI-Kacheldefinitionen tile { standardTile("recStatus", "device.recStatus", width:2, height:2, canChangeIcon:true, canChangeBackground:true) { state "off", label:'record', action:"record", backgroundColor:"#ffffff" state "on" , Label:'record', action:"record", backgroundColor:"#ff0000" } //Dies ist eine sekundäre Kachel //set, unset, prog - grün, weiß, gelb standardTile("buttonA", "device.buttonAStatus ", width:1, height:1, canChangeIcon:true, canChangeBackground:true) { state "unset", label:'', action:"buttonA", icon:"st.custom.buttons.play-pause", backgroundColor :"#cccccc" //grauer Zustand "prog", Label:'', Aktion:"buttonA", Symbol:"st.custom.buttons.play-pause", backgroundColor:"#FDE910" //gelber Zustand "set ." ", Label:'', Aktion:"buttonA", Symbol:"st.custom.buttons.play-pause", backgroundColor:"#79b821" //green } //set, unset, prog - green, white, y ellow standardTile("buttonB", "device.buttonBStatus", width:1, height:1, canChangeIcon:true, canChangeBackground:true) { state "unset", label:'', action:"buttonB", icon:"st .custom.buttons.b", backgroundColor:"#cccccc" //grauer Zustand "prog", Label:'', Aktion:"buttonB", Icon:"st.custom.buttons.b", backgroundColor:"#FDE910 " //gelber Zustand "set", Label:'', Aktion:"buttonB", Icon:"st.custom.buttons.b", backgroundColor:"#79b821" //green } //mögliche Hauptkacheln main ([ "buttonA","buttonB"]) //Dies ist ein Array für mehrere Kacheldetails (["recStatus","buttonA","buttonB"]) }} // Eingehende Gerätenachrichten analysieren, um eventsdef parse(String description) zu generieren { log.trace "parse:" def value =zigbee.parse(description)?.text def codeParts =value.split(/,/) log.trace "code:${codeParts[0]}" //[0] ist das Hex, [1] ist das erneute Senden //von [1], die ersten drei Zeichen sind der Typ, gefolgt von Code if(device.currentValue("recStatus") =="on") //im Aufnahmemodus { log .trace "Aufzeichnung aktiviert" if(device.cur rentValue("lastButton") !="") { log.trace "letzte Schaltfläche ist aktiv" def buttonStatus ="${device.currentValue("lastButton")}Status"; def buttonHex ="${device.currentValue("lastButton")}Hex"; def buttonCode ="${device.currentValue("lastButton")}Code"; def result =[ createEvent(name:buttonStatus, value:"set", isStateChange:true) //Schalte den Button grün ,createEvent(name:buttonHex, value:codeParts[0], isStateChange:true) //speichere den Code, createEvent(name:buttonCode, value:codeParts[1], isStateChange:true) //Speichere den Code ,createEvent(name:"recStatus", value:"off", isStateChange:true) ,createEvent(name:"lastButton", value:"", isStateChange:true) //Zurücksetzen der letzten Schaltfläche ] Ergebnis zurückgeben } else{ log.trace "keine Schaltfläche ausgewählt" } } else { //wenn nicht //überprüfe, ob sie mit irgendwelchen Schaltflächen übereinstimmt if(codeParts[ 0] ==device.currentValue("buttonAHex")) { //ein Ereignis in Bezug auf buttonA senden def result =createEvent(name:"button", value:"A",isStateChange:true) log.debug "Parse hat $ . zurückgegeben {result?.descriptionText}" return result } else if(codeParts[0] ==device.currentValue("buttonBHex")) { //sende ein Ereignis bezogen auf buttonB def result =createEvent(name:"button", value:"B", isStateChange:true ) log.debug "Parse hat ${result?.descriptionText} zurückgegeben" ret urn result } } def result =createEvent(name:null, value:"") return result}def record(){ //den Record-Modus aufrufen log.debug "RecordMode change from ${device.currentValue("recStatus")}" clearLast() // letzte Schaltfläche löschen // Attribut ein-/ausschalten if(device.currentValue("recStatus") =="on") { sendEvent(name:"recStatus", value:"off", isStateChange:true ) //Kachelfarbe wechselt zu Weiß } else { sendEvent(name:"recStatus", value:"on", isStateChange:true) //Kachelfarbe wechselt zu Rot }}def buttonA(){ log.debug "ButtonA gedrückt" if(device.currentValue("recStatus") =="on") //Wenn im Aufnahmemodus, setze die zu programmierende Taste { clearLast() log.debug "Schalte buttonA in den Programmiermodus" //setze das lastTile-Attribut auf tileA // mach es gelb sendEvent(name:"buttonAStatus", value:"prog", isStateChange:true) sendEvent(name:"lastButton", value:"buttonA", isStateChange:true) } else if(device.currentValue(" buttonAStatus") =="set") // wenn es gesetzt ist, sende den gespeicherten Code { log.debug "Send buttonA Code" // sende den Remotecode zum Blaster zigbee.smartShield(text:"${device.currentValue("buttonACode")}").format() } else { log.debug "button is aktuell ${device.currentValue("buttonAStatus")} "}}def buttonB(){ clearLast() log.debug "ButtonB gedrückt" if(device.currentValue("recStatus") =="on") //Wenn im Aufnahmemodus, setze die zu programmierende Taste {log.debug "Schaltfläche in den Programmiermodus versetzen" //setze das lastTile-Attribut auf tileA // schalte es gelb sendEvent(name:"buttonBStatus", value:"prog", isStateChange:true) sendEvent(name:"lastButton", value:"buttonB ", isStateChange:true) } else if(device.currentValue("buttonBStatus") =="set") // Wenn es gesetzt ist, sende den gespeicherten Code { log.debug "Send buttonB Code" // sende den Remote-Code an the Blaster zigbee.smartShield(text:"${device.currentValue("buttonBCode")}").format() } else if(device.currentValue("buttonBStatus") =="unset") { log.debug "button ist derzeit nicht gesetzt" }}def clearLast(){ if(device.currentValue("lastButton") !="") { sendEvent(name:"${device.current Value("lastButton")}", value:"unset", isStateChange:true) sendEvent(name:"lastButton", value:"", isStateChange:true) }}
SmartApp-CodeGroovy
/** * IR-Empfänger * * Autor:[email protected] * Datum:2013-03-31 */preferences { section("Wählen Sie ein IR-Gerät aus...") { input "irDevice", "device .IrBridge" } section("Button A schaltet sich ein oder aus..."){ input "switch1", "capability.switch", title:"This light", required:false } section("Button B schaltet sich ein oder aus ..."){ input "switch2", "capability.switch", title:"This light", erforderlich:false } }def installiert() { log.debug "Installiert mit Einstellungen:${settings}" Subscribe(irDevice , "button.B", handleB) Subscribe(irDevice, "button.A",handleA)}def updated() { log.debug "Aktualisiert mit Einstellungen:${settings}" unsubscribe() Subscribe(irDevice, "button. B", handleB) Subscribe(irDevice, "button.A",handleA)}def handleA(evt) { log.debug "Received button A" if (switch1.currentValue("switch") =="on") { switch1 .off() } else { switch1.on() }}def handleB(evt) { log.debug "Received button B" if (switch2.currentValue("switch") =="on") { switch2.off() } sonst { switch2.on() }}

Herstellungsprozess

  1. Roboter bauen mit Raspberry Pi und Python
  2. Einen Segway mit Raspberry Pi bauen
  3. Was mache ich mit den Daten?!
  4. Einfangen der Wassertropfen mit Arduino
  5. CO2-Überwachung mit K30-Sensor
  6. taubblinde Kommunikation mit 1Sheeld/Arduino
  7. Münzprüfer mit Arduino steuern
  8. Arduino mit Bluetooth zur Steuerung einer LED!
  9. Kennen Sie die Temperatur Ihres Zuhauses von überall mit der Arduino Cloud!
  10. Aufbau der Mitarbeitererfahrung der Zukunft mit intelligenter Automatisierung