Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Een IR-brug bouwen met de SmartThings ThingShield

Componenten en benodigdheden

Arduino UNO
× 1
SmartThings Shield voor Arduino
× 1
IR-emitterende LED
× 1
IR-ontvangerdiode
× 1
100 Ohm Weerstand (optioneel)
× 1

Over dit project

Inleiding

Een eenvoudige afstandsbediening van een tv kan veel meer van kanaal veranderen wanneer hij is aangesloten op de SmartThings-cloud. Met een klein aantal onderdelen en een onmiddellijke uitbetaling is het project een goede manier om het platform te verkennen.

Achtergrond op Arduino en het ThingShield

De SmartThings ThingShield maakt het eenvoudig om SmartThings-prototypes te bouwen met Arduino. Het schild maakt rechtstreeks verbinding met de UNO en verbindt via het Zigbee-protocol met de SmartThings-hub. Een schakelaar op het schild maakt het mogelijk om te kiezen tussen het gebruik van pinnen 0,1 of 2,3 om met de Arduino te communiceren. Het ThingShield behoudt zich al het gebruik van pin 6 voor.

Voor meer informatie over aan de slag gaan met Arudino:http://arduino.cc/en/Guide/Introduction

Stap 1:u heeft . nodig

  • (x1) SmartThings Arduino ThingShield
  • (x1) Arduino Uno
  • (x1) IR-ontvanger
  • (x1) IR-emitterende LED
  • (x1) 100 Ohm Weerstand (optioneel)


Stap 2:Download de IR-bibliotheek

Het project is afhankelijk van een prachtige Arduino-bibliotheek die is ontwikkeld door Ken Shirriff. https://github.com/shirriff/Arduino-IRremote

Installeer de bibliotheek Arduino-bibliotheek op de gebruikelijke manier.

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

Eenmaal geïnstalleerd, moeten we IRRemoteInt.h aanpassen om de timer op pin 9 te gebruiken. In dit voorbeeld gebruiken we pin 3 voor communicatie met het ThingShield.


Stap 3:Arduino-schets

Upload vervolgens de schets naar uw Arduino-bord (zie codesectie).


Stap 4:Het bouwen

De opbouw is eenvoudig en duidelijk. Sluit eerst het ThingShield bovenop de Arduino aan. Hoewel alleen de Arduino in het onderstaande diagram wordt getoond, zijn de pinplaatsingen hetzelfde als het schild is bevestigd.

Sluit voor de IR-ontvanger de bijbehorende pinnen aan op aarde en 5V. Bevestig vervolgens de datapin op Arduino pin 11. Sluit de IR-emitterende LED aan op pin 9 en aarde. De weerstand van 100 ohm is optioneel in dit ontwerp, omdat de LED waarschijnlijk de maximale stroom van de Arduino aankan omdat deze snel knippert om signalen te verzenden. Als de stroom continu aan blijft staan, zal de LED waarschijnlijk doorbranden.


Stap 5:Een aangepast SmartThings-apparaattype maken

In de SmartThings IDE maken we vervolgens een nieuw apparaattype voor ons ThingShield.

Ga naar het gedeelte 'Mijn apparaattypen' en klik op 'Nieuw smartapparaat' aan de rechterkant.

Het maken van een nieuw SmartDevice vereist twee stappen. Geef het nieuwe apparaattype eerst een naam bovenaan 'Ir Bridge'. Let op:we zullen later verwijzen naar de naam van ons SmartDevice in onze SmartApp-code.

We moeten de attributen (variabelen) en commando's (functies) van het apparaat definiëren. Voor deze zelfstudie maken we de attributen en opdrachten voor twee programmeerbare knoppen en een opnameknop. Voeg elk van de getoonde attributen en commando's toe. Selecteer "Maken" om door te gaan met het coderen van het apparaat.

Kopieer vervolgens de apparaatdefinitie naar het codevenster in de IDE (zie codesectie). Klik bovenaan op de knop 'Opslaan' en klik vervolgens op 'Publiceren' om het apparaat voor u beschikbaar te maken.


Stap 6:de ThingShield bijwerken naar uw nieuwe apparaattype

Zorg ervoor dat u uw ThingShield toevoegt aan uw SmartThings-hub als deze nog niet is ingesteld. Om het apparaat te koppelen, bevestigt u het ThingShield aan uw Arudino en geeft u het stroom. Houd de knop "Switch" op het schild 6 seconden ingedrukt. Selecteer met de SmartThings-smartphone-app de knop Toevoegen. Druk nog een keer op de fysieke "switch"-knop en je zou moeten zien dat de hub het ThingShield identificeert.

Terug, in de IDE, navigeer je naar je Arduino ThingShield door op "apparaten" op het startscherm te klikken. Selecteer uw apparaat in de lijst en klik op de knop "Bewerken" onderaan de pagina. Kies in het vervolgkeuzemenu "Type" het nieuwe type SmartDevice dat u hebt gemaakt. Het is handig om apparaten betekenisvolle labelnamen te geven wanneer u ze later moet selecteren. Druk op update om het apparaat in te stellen op uw nieuwe apparaattype.

Let op:als u in de toekomst updates voor uw aangepaste apparaattypen publiceert, moet u terugkomen om te bevestigen dat uw fysieke apparaten na een gepubliceerde update aan het juiste apparaattype zijn gekoppeld.


Stap 7:de SmartThings-app schrijven

We hebben nog een stukje code in het project - de SmartApp zelf. Navigeer naar “Mijn SmartApps” en start een “Nieuwe SmartApp” door op de knop rechts te klikken. Geef het een naam, een beschrijving en een categorie (“Mijn apps”). Klik op "Maken" om door te gaan met het coderen van de app.

Kopieer de smartApp-code (zie codesectie). Selecteer "Opslaan" en klik vervolgens op "Publiceren" om de SmartApp beschikbaar te maken op uw Smartthings iOS- of Android-app (binnenkort beschikbaar).

Merk op dat we naar het type SmartDevice verwijzen met de naam "IrBridge" zonder de originele spatie die we oorspronkelijk in de naam "Ir Bridge" gebruikten:

voer "irDevice", "device.IrBridge" in

Met de lijn kunnen we alleen apparaten van het type "Ir Bridge" weergeven als opties om te selecteren in de SmartApp. De gebruikte camelCasing is heel specifiek:bij het verwijzen naar apparaattypen in slimme apps worden spaties uit de naam verwijderd. Het eerste teken en de tekens die oorspronkelijk op een spatie volgen, krijgen een hoofdletter. Alle andere zijn kleine letters, ongeacht het oorspronkelijke hoofdlettergebruik.


Stap 8:de SmartApp inschakelen

Koppel binnen de SmartThings-smartphone-app de nieuwe SmartApp aan ons nieuwe IR-apparaat en selecteer de schakelaars die u wilt bedienen. Klik vervolgens op "installeren".

Om elk van de knoppen in de app te programmeren, ga je naar de tegeldetails door op het tandwiel in de hoek van de tegel te klikken. Selecteer de grote opnameknop - deze wordt rood om aan te geven dat u zich in de opnamemodus bevindt. Klik vervolgens op de tegel (Play/Pause of B) die u wilt bedienen – deze wordt geel. Richt je afstandsbediening op het ThingShield en druk op de knop die je wilt leren. De ThingShield stuurt die code nu naar de SmartThings-cloud en koppelt deze aan de knop die je in de SmartApp hebt gekozen. De nieuw geprogrammeerde knop wordt groen en de opnameknop wordt weer wit.

De volgende keer dat u op die knop op uw afstandsbediening drukt, schakelt u de schakelaar om die u aan de knop in de SmartApp hebt gekoppeld.

Code

  • Arduino-schets
  • Apparaatdefinitie
  • smartApp-code
Arduino schetsC/C++
//********************************************* ***********************************/// @file/// @brief/// Arduino SmartThings IR Shield/ /************************************************** **************************#include  //TODO moet worden ingesteld vanwege een vreemde draadtaallinker, zou moeten we absorberen deze hele bibliotheek in smartthings#include #include //****************************** ********************************************** // Pindefinities | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVV VVVVVVVV//********************************************* ***********************************#define PIN_LED 13#define PIN_RECV 11#define PIN_THING_RX 3#define PIN_THING_TX 2 //************************************************** **************************// Globale variabelen | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVV VVVVVVVV//********************************************* ***********************************SmartThingsCallout_t messageCallout; // call out functie forward decalationSmartThings smartthing (PIN_THING_RX, PIN_THING_TX, messageCallout); // constructorbool isDebugEnabled; // schakel debug in of uit in dit voorbeeldint stateLED; // staat om de laatste ingestelde waarde van LEDIRrecv irrecv (PIN_RECV) te volgen; IRsend irsend; decode_results resultaten;//*************************** ********************************************** // API-functies | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVV VVVVVVVVV//********************************************* ************************************ void setup () { // setup standaardstatus van globale variabelen isDebugEnabled =true; statusLED =0; // komt overeen met de status van de hardwarepin die hieronder is ingesteld // setup hardwarepinnen pinMode (PIN_LED, OUTPUT); // definieer PIN_LED als een output digitalWrite (PIN_LED, LOW); // stel de waarde in op LAAG (uit) om overeen te komen met stateLED =0 if (isDebugEnabled) {// setup debug seriële poort Serial.begin (9600); // serieel instellen met een baudrate van 9600 Serial.println ("setup.."); // print 'setup..' uit bij het starten } irrecv.enableIRIn(); // Start de ontvanger}//********************************************* ************************************ void loop () { // run smartthing logica smartthing.run (); if (irrecv.decode(&results)) { blue(); irrev.resume(); // Ontvang de volgende waarde Serial.println (results.value, HEX); //dump(&resultaten); //VOORBEELD:smartthing.send("HEX,XXXCODE"); Tekenreeks 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, HEX); } else if (results.decode_type ==RC5) { irCmd =String(results.value, HEX) + "," + "RC5" + String(results.bits, DEC) + ":" + String(results.value, HEX); } else if (results.decode_type ==RC6) { irCmd =String(results.value, HEX) + "," + "RC6" + String(results.bits, DEC) + ":" + String(results.value, HEX); } else { irCmd =String(results.value, HEX) + "," + "RAW" + String(results.bits, DEC) + ":"; } Serieel.println(irCmd); smartthing.send(irCmd); irCmd =""; }}//************************************************** ****************************** ongeldig berichtCallout (tekenreeksbericht) { smartthing.shieldSetLED (0, 0, 0); // als foutopsporing is ingeschakeld, drukt u het ontvangen bericht af if (isDebugEnabled) { Serial.print ("Rx:'"); Serial.print(bericht); Serieel.println("' "); } Stringtype =bericht.substring(0,3); int startCode =bericht.indexOf(':'); String lenStr =bericht.substring (3, startCode); String codeStr =bericht.substring (startCode + 1); niet-ondertekende lange code; // verander de hexadecimale tekenreeks in een lange niet-ondertekende if(type!="RAW") code =stringToNum(codeStr,16); // werkt niet voor RAW int len ​​=stringToNum(lenStr,10); // Voor elk type - NEC,SON,PAN,JVC,RC5,RC6,etc...de eerste 3 if(type =="NEC") {Serial.println("NEC-SEND"); Serial.println(len); Serial.println(code,HEX); irsend.sendNEC(code,len); onrecv.enableIRIn(); } else if(type =="SNY") { irsend.sendSony(code,len); onrecv.enableIRIn(); } else if(type =="RC5") { irsend.sendRC5(code,len); onrecv.enableIRIn(); } else if(type =="RC6") { irsend.sendRC6(code,len); onrecv.enableIRIn(); } }// Dumpt de decode_results-structuur.// Roep dit op na IRrecv::decode()// void * om het compilerprobleem te omzeilen//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("Onbekende codering:"); } else if (results->decode_type ==NEC) { Serial.print("Gedecodeerde NEC:"); } else if (results->decode_type ==SONY) { Serial.print("Gedecodeerde SONY:"); } else if (results->decode_type ==RC5) { Serial.print("Decoded RC5:"); } else if (results->decode_type ==RC6) { Serial.print("Decoded RC6:"); } else if (results->decode_type ==PANASONIC) { Serial.print("Gedecodeerd PANASONIC - Adres:"); Serial.print(resultaten->panasonicAddress,HEX); Serial.print(" Waarde:"); } else if (results->decode_type ==JVC) { Serial.print("Gedecodeerde JVC:"); } Serial.print(resultaten->waarde, HEX); Serial.print(" ("); Serial.print(resultaten->bits, DEC); Serial.println("bits)"); Serial.print("Raw ("); Serial.print(count, DEC); Serial.print("):"); for (int i =0; i rawbuf[i]*USECPERTICK, DEC); } else { Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); } Serie.print(" "); } Serial.println("");}//************************************** ************************************// Lokale functies | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVV VVVVVVVVV//********************************************* *********************************** unsigned long stringToNum(String s, int base) //10 voor decimaal, 16 voor hex{ unsigned long i =0; niet-ondertekende lange waarde =0; niet-ondertekende lange plaats =s.length(); char c; niet-ondertekend lang teken =1; for(i; i ='0' &&c <='9') //0 to 9 { value +=(c - '0') * exponent(base,place); } else if (c>='A' &&((c - 'A' + 10) ='a' &&(c - 'a' + 10)  
ApparaatdefinitieGroovy
/** * Smart Ir * * Auteur:[email protected] * Datum:06-03-2013 */metadata { // Simulator metadatasimulator {} // UI-tegeldefinities tegels { standardTile("recStatus", "device.recStatus", breedte:2, hoogte:2, canChangeIcon:waar, canChangeBackground:waar) { staat "uit", label:'record', actie:"record", backgroundColor:"#ffffff" staat "aan" , label:'record', action:"record", backgroundColor:"#ff0000" } //dit is een secundaire tegel //set, unset, prog - green, white, yellow standardTile("buttonA", "device.buttonASTatus ", breedte:1, hoogte:1, canChangeIcon:true, canChangeBackground:true) { state "unset", label:'', actie:"buttonA", pictogram:"st.custom.buttons.play-pause", backgroundColor :"#cccccc" // grijze staat "prog", label:'', actie:"buttonA", pictogram:"st.custom.buttons.play-pause", backgroundColor:"#FDE910" //gele staat "set ", label:'', actie:"buttonA", pictogram:"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" //grey state "prog", label:'', action:"buttonB", icoon:"st.custom.buttons.b", backgroundColor:"#FDE910 " //gele staat "set", label:'', actie:"buttonB", pictogram:"st.custom.buttons.b", backgroundColor:"#79b821" //green } //mogelijke hoofdtegels hoofd ([ "buttonA","buttonB"]) //dit is een array voor details van meerdere tegels (["recStatus","buttonA","buttonB"]) }}// Parseer binnenkomende apparaatberichten om eventsdef parse te genereren (String description) { log.trace "parse:" def value =zigbee.parse(description)?.text def codeParts =value.split(/,/) log.trace "code:${codeParts[0]}" //[0] is de hex, [1] is de resend //of [1], de eerste drie tekens zijn het type, gevolgd door code if(device.currentValue("recStatus") =="on") //in record mode { log .trace "record ingeschakeld" if(device.cur rentValue("lastButton") !="") { log.trace "laatste knop is actief" 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) // draai de knop groen ,createEvent(name:buttonHex, value:codeParts[0], isStateChange:true) // sla de code op, createEvent(name:buttonCode, value:codeParts[1], isStateChange:true) //store the code ,createEvent(name:"recStatus", value:"off", isStateChange:true), createEvent(name:"lastButton", value:"", isStateChange:true) // reset de laatste knop ] return resultaat } else{ log.trace "geen knop geselecteerd" } } else { //if not //check om te zien of deze overeenkomt met knoppen if(codeParts[ 0] ==device.currentValue("buttonAHex")) { //stuur een gebeurtenis gerelateerd aan buttonA def result =createEvent(name:"button", value:"A",isStateChange:true) log.debug "Parse heeft $ teruggegeven {result?.descriptionText}" return result } else if(codeParts[0] ==device.currentValue("buttonBHex")) { //stuur een gebeurtenis gerelateerd aan buttonB def result =createEvent(name:"button", waarde:"B", isStateChange:true ) log.debug "Parse heeft ${result?.descriptionText}" geretourneerd ret urn result } } def result =createEvent(name:null, value:"") return result}def record(){ // enter record mode log.debug "RecordMode verandert van ${device.currentValue("recStatus")}" clearLast () // wis laatste knop // schakel kenmerk in / uit if (device.currentValue ("recStatus") =="on") { sendEvent (name:"recStatus", waarde:"off", isStateChange:true ) //tegelkleur verandert in wit } else { sendEvent(name:"recStatus", value:"on", isStateChange:true) //tegelkleur verandert in rood }}def buttonA(){ log.debug "KnopA ingedrukt" if(device.currentValue("recStatus") =="on") //indien in de opnamemodus, stel de te programmeren knop in { clearLast() log.debug "Zet knopA in programmeermodus" // stel het lastTile-kenmerk in op tileA // zet het geel sendEvent(name:"buttonAStatus", value:"prog", isStateChange:true) sendEvent(name:"lastButton", value:"buttonA", isStateChange:true) } else if(device.currentValue(" buttonAStatus") =="set") // als het is ingesteld, stuur de opgeslagen code { log.debug "Send buttonA Code" // stuur de remote code naar de blaster zigbee.smartShield(text:"${device.currentValue("buttonACode")}").format() } else { log.debug "button is momenteel ${device.currentValue("buttonAStatus")} " }}def buttonB(){ clearLast() log.debug "KnopB ingedrukt" if(device.currentValue("recStatus") =="on") //indien in de opnamemodus, stel de knop in om te programmeren { log.debug "Zet de knop in de programmeermodus" // stel het attribuut lastTile in op tileA // zet het geel sendEvent(name:"buttonBSatus", value:"prog", isStateChange:true) sendEvent(name:"lastButton", value:"buttonB ", isStateChange:true) } else if(device.currentValue("buttonBStatus") =="set") // als het is ingesteld, stuur de opgeslagen code { log.debug "Send buttonB Code" // stuur de afstandsbedieningscode naar de blaster zigbee.smartShield(text:"${device.currentValue("buttonBCode")}").format() } else if(device.currentValue("buttonBStatus") =="unset") { log.debug "button is momenteel niet ingesteld" }}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-ontvanger * * Auteur:[email protected] * Datum:31-03-2013 */preferences { section("Kies een IR-apparaat...") { input "irDevice", "device .IrBridge" } section("Knop A gaat aan of uit..."){ input "switch1", "capability.switch", title:"This light", required:false } section("Knop B gaat aan of uit ..."){ input "switch2", "capability.switch", title:"This light", vereist:false } }def installed() { log.debug "Geïnstalleerd met instellingen:${settings}" subscribe(irDevice , "button.B", handleB) subscribe(irDevice, "button.A",handleA)}def updated() { log.debug "Bijgewerkt met instellingen:${settings}" unsubscribe() subscribe(irDevice, "button. B", handleB) subscribe(irDevice, "button.A",handleA)}def handleA(evt) { log.debug "ontvangen knop A" if (switch1.currentValue("switch") =="on") { switch1 .off() } else { switch1.on() }}def handleB(evt) { log.debug "ontvangen knop B" if (switch2.currentValue("switch") =="on") { switch2.off() } else { switch2.on() }}

Productieproces

  1. Botten bouwen met Raspberry Pi en Python
  2. Een segway bouwen met Raspberry Pi
  3. Wat moet ik doen met de gegevens?!
  4. De waterdruppels vastleggen met Arduino
  5. CO2-monitoring met K30-sensor
  6. Doofblinde communicatie met 1Sheeld/Arduino
  7. Bedien muntvangers met Arduino
  8. Arduino met Bluetooth om een ​​LED te bedienen!
  9. Ken de temperatuur van uw huis overal met Arduino Cloud!
  10. De draagbare MAX30100-polssensor gebruiken met Arduino
  11. Bouwen aan de toekomst van werknemerservaring met intelligente automatisering