Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Membangun Jembatan IR dengan SmartThings ThingShield

Komponen dan persediaan

Arduino UNO
× 1
SmartThings Shield untuk Arduino
× 1
LED Pemancar IR
× 1
Dioda Penerima IR
× 1
Resistor 100 Ohm (opsional)
× 1

Tentang proyek ini

Pengantar

Remote TV sederhana mampu lebih banyak mengubah saluran saat terhubung ke cloud SmartThings. Dengan jumlah bagian kecil dan hasil langsung, proyek ini adalah cara yang baik untuk menjelajahi platform.

Latar Belakang Arduino dan ThingShield

SmartThings ThingShield memudahkan pembuatan prototipe SmartThings menggunakan Arduino. Perisai terhubung langsung ke UNO yang terhubung ke hub SmartThings melalui protokol Zigbee. Sakelar pada pelindung memungkinkan seseorang untuk memilih antara menggunakan pin 0,1 atau 2,3 ​​untuk berkomunikasi dengan Arduino. ThingShield sudah mencadangkan penggunaan pin 6.

Untuk informasi lebih lanjut tentang memulai dengan Arudino:http://arduino.cc/en/Guide/Introduction

Langkah 1:Anda membutuhkan

  • (x1) SmartThings Arduino ThingShield
  • (x1) Arduino Uno
  • (x1) Penerima IR
  • (x1) LED Pemancar IR
  • (x1) Resistor 100 Ohm (opsional)


Langkah 2:Unduh Perpustakaan IR

Proyek ini bergantung pada perpustakaan Arduino yang luar biasa yang dikembangkan oleh Ken Shirriff. https://github.com/shirriff/Arduino-IRremote

Instal library Arduino library seperti biasa.

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

Setelah terinstal, kita perlu memodifikasi IRRemoteInt.h untuk menggunakan timer pada pin 9. Dalam contoh ini, kita menggunakan pin 3 untuk berkomunikasi dengan ThingShield.


Langkah 3:Sketsa Arduino

Selanjutnya, unggah sketsa ke papan Arduino Anda (lihat bagian kode).


Langkah 4:Pembuatan

Buildnya sederhana dan lugas. Pertama hubungkan ThingShield di atas Arduino. Meskipun hanya Arduino yang ditunjukkan pada diagram di bawah ini, penempatan pin sama dengan pelindung yang terpasang.

Untuk Penerima IR, sambungkan pin yang sesuai ke ground dan 5V. Kemudian pasang pin data ke pin Arduino 11. Hubungkan LED pemancar IR ke pin 9 dan ground. Resistor 100 ohm adalah opsional dalam desain ini karena LED kemungkinan dapat menangani arus maksimum dari Arduino saat berkedip cepat untuk mengirim sinyal. Dibiarkan terus menerus, arus yang sama kemungkinan akan membuat LED padam.


Langkah 5:Membuat Jenis Perangkat SmartThings Kustom

Di IDE SmartThings, selanjutnya kita membuat jenis perangkat baru untuk ThingShield kita.

Buka bagian “Jenis Perangkat Saya”, klik “Perangkat Cerdas Baru” di sebelah kanan.

Membuat SmartDevice baru memerlukan dua langkah. Pertama, beri nama jenis perangkat baru di bagian atas "Ir Bridge." Perhatikan bahwa kami akan merujuk nama SmartDevice kami di kode SmartApp kami nanti.

Kita perlu mendefinisikan Atribut (variabel) dan Perintah (fungsi) perangkat. Untuk tutorial ini, kita akan membuat atribut dan perintah untuk dua tombol yang dapat diprogram dan tombol rekam. Tambahkan setiap atribut dan perintah yang ditampilkan. Pilih “Buat” untuk melanjutkan pengkodean perangkat.

Selanjutnya, salin definisi perangkat ke jendela kode di IDE (lihat bagian kode). Klik tombol “Simpan” di bagian atas, lalu klik “Publikasikan” agar perangkat tersedia untuk Anda.


Langkah 6:Memperbarui ThingShield ke Jenis Perangkat Baru Anda

Pastikan untuk menambahkan ThingShield Anda ke hub SmartThings Anda jika belum diatur. Untuk memasangkan perangkat, pasang ThingShield ke Arudino Anda dan berikan daya. Tahan tombol "Switch" pada pelindung selama 6 detik. Dengan aplikasi smartphone SmartThings, pilih tombol Tambah. Tekan tombol fisik "saklar" sekali lagi dan Anda akan melihat hub mengidentifikasi ThingShield.

Kembali, di IDE, navigasikan ke Arduino ThingShield Anda dengan mengklik "perangkat" di layar beranda. Pilih perangkat Anda dari daftar dan klik tombol "Edit" di bagian bawah halaman. Dari menu tarik-turun "Jenis", pilih jenis SmartDevice baru yang Anda buat. Akan sangat membantu jika Anda memberi nama label yang bermakna pada perangkat saat Anda perlu memilihnya nanti. Tekan perbarui untuk menyetel perangkat ke jenis perangkat baru Anda.

Perhatikan, saat memublikasikan pembaruan untuk jenis perangkat khusus Anda di masa mendatang, Anda sebaiknya kembali untuk mengonfirmasi bahwa perangkat fisik Anda tetap terkait dengan jenis perangkat yang benar setelah pembaruan yang dipublikasikan.


Langkah 7:Menulis Aplikasi SmartThings

Kami memiliki satu bagian kode lagi dalam proyek – SmartApp itu sendiri. Arahkan ke "My SmartApps" dan mulai "SmartApp Baru" dengan mengklik tombol di sebelah kanan. Beri nama, deskripsi, dan kategori (“Aplikasi saya”). Klik “Buat” untuk melanjutkan pengkodean aplikasi.

Salin kode smartApp (lihat bagian kode). Pilih “Simpan” lalu klik “Terbitkan” untuk membuat SmartApp tersedia di aplikasi Smartthings iOS atau Android Anda (segera hadir).

Perhatikan bahwa kami mereferensikan jenis SmartDevice berdasarkan nama sebagai “IrBridge” tanpa spasi asli yang awalnya kami gunakan dalam nama “Ir Bridge”:

masukkan "irDevice", "device.IrBridge"

Baris memungkinkan kami untuk hanya menampilkan perangkat jenis "Ir Bridge" sebagai opsi untuk dipilih di SmartApp. CamelCasing yang digunakan sangat spesifik:Saat mereferensikan jenis perangkat di aplikasi pintar, spasi dihapus dari namanya. Karakter pertama dan karakter yang awalnya mengikuti spasi dikapitalisasi. Semua yang lain adalah huruf kecil, terlepas dari kapitalisasi aslinya.


Langkah 8:Aktifkan SmartApp

Dalam aplikasi smartphone SmartThings, kaitkan SmartApp baru dengan perangkat IR baru kami dan pilih sakelar yang ingin Anda kendalikan. Kemudian klik “instal.”

Untuk memprogram setiap tombol di aplikasi, buka detail ubin dengan mengklik roda gigi di sudut ubin. Pilih tombol rekam besar - itu akan berubah menjadi merah untuk menunjukkan Anda berada dalam mode rekam. Kemudian klik ubin (Putar/Jeda atau B) yang ingin Anda kontrol – ubin akan berubah menjadi kuning. Arahkan remote Anda ke ThingShield dan tekan tombol yang ingin Anda pelajari. ThingShield sekarang akan mengirim kode itu ke cloud SmartThings dan mengaitkannya dengan tombol yang Anda pilih di SmartApp. Tombol yang baru diprogram akan berubah menjadi hijau dan tombol rekam akan kembali menjadi putih.

Saat berikutnya Anda menekan tombol itu di remote control, Anda akan mengaktifkan sakelar yang Anda kaitkan dengan tombol di SmartApp.

Kode

  • Sketsa Arduino
  • Definisi perangkat
  • kode SmartApp
Sketsa ArduinoC/C++
//********************************************* ********************************/// @file/// @brief/// Arduino SmartThings IR Shield/ /************************************************ ****************************#include //TODO perlu diatur karena beberapa penghubung bahasa kabel yang aneh, harus kami menyerap seluruh perpustakaan ini menjadi hal-hal cerdas#include #include //*************************** ************************************************** // Sematkan Definisi | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//**************************************** **********************************#menentukan PIN_LED 13#menentukan PIN_RECV 11#menentukan PIN_THING_RX 3#menentukan PIN_THING_TX 2 //************************************************ *****************************// Variabel Global | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//**************************************** **********************************SmartThingsCallout_t messageCallout; // memanggil fungsi forward decalarationSmartThings smartthing(PIN_THING_RX, PIN_THING_TX, messageCallout); // constructorbool isDebugEnabled; // aktifkan atau nonaktifkan debug dalam stateLED contoh ini; // status untuk melacak nilai set terakhir dari LEDIRrecv irrecv(PIN_RECV);IRsend irsend;decode_results results;//*************************** ************************************************** // Fungsi API | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//**************************************** **********************************void setup(){ // setup status default variabel global isDebugEnabled =true; stateLED =0; // cocok dengan status pin perangkat keras yang diatur di bawah // setel pin perangkat keras pinMode(PIN_LED, OUTPUT); // mendefinisikan PIN_LED sebagai output digitalWrite(PIN_LED, LOW); // set nilai ke LOW (off) agar sesuai dengan stateLED=0 if (isDebugEnabled) { // setup debug serial port Serial.begin(9600); // setup serial dengan baud rate 9600 Serial.println("setup.."); // print 'setup..' saat start } irrecv.enableIRIn(); // Mulai penerima}//****************************************** ***********************************void loop(){ // jalankan smartthing logic smartthing.run(); if (irrecv.decode(&hasil)) { biru(); irrecv.resume(); // Menerima nilai berikutnya Serial.println(results.value, HEX); //buang(&hasil); //CONTOH:smartthing.send("HEX,XXXCODE"); String 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(hasil.nilai, HEX) + "," + "RAW" + String(hasil.bit, DEC) + ":"; } Serial.println(irCmd); smartthing.send(irCmd); irCmd =""; }}//********************************************* *******************************void messageCallout(String message){ smartthing.shieldSetLED(0, 0, 0); // jika debug diaktifkan, cetak pesan yang diterima if (isDebugEnabled) { Serial.print("Rx:'"); Serial.print(pesan); Serial.println("'"); } Tipe string =message.substring(0,3); int startCode =pesan.indexOf(':'); String lenStr =message.substring(3,startCode); String codeStr =pesan.substring(startCode + 1); kode panjang yang tidak ditandatangani; //ubah string hex menjadi long unsigned if(type !="RAW") code =stringToNum(codeStr,16); //tidak akan bekerja untuk RAW int len ​​=stringToNum(lenStr,10); //Untuk setiap tipe - NEC,SON,PAN,JVC,RC5,RC6,dll...3 pertama if(type =="NEC") { Serial.println("NEC-SEND"); Serial.println(len); Serial.println(kode,HEX); irsend.sendNEC(kode,len); irrecv.enableIRIn(); } else if(ketik =="SNY") { irsend.sendSony(code,len); irrecv.enableIRIn(); } else if(ketik =="RC5") { irsend.sendRC5(kode,len); irrecv.enableIRIn(); } else if(ketik =="RC6") { irsend.sendRC6(code,len); irrecv.enableIRIn(); } }// Membuang struktur decode_results.// Panggil ini setelah IRrecv::decode()// void * untuk mengatasi masalah compiler//void dump(void *v) {// decode_results *results =(decode_results *) vvoid dump(decode_results *results) { int count =hasil->rawlen; if (hasil->decode_type ==UNKNOWN) { Serial.print("Encoding tidak diketahui:"); } else if (hasil->decode_type ==NEC) { Serial.print("Decoded NEC:"); } else if (hasil->decode_type ==SONY) { Serial.print("Decoded SONY:"); } else if (hasil->decode_type ==RC5) { Serial.print("RC5 terdekode:"); } else if (hasil->decode_type ==RC6) { Serial.print("Decoded RC6:"); } else if (hasil->decode_type ==PANASONIC) { Serial.print("Decoded PANASONIC - Alamat:"); Serial.print(hasil->panasonicAddress,HEX); Serial.print("Nilai:"); } else if (hasil->decode_type ==JVC) { Serial.print("Decoded JVC:"); } Serial.print(hasil->nilai, HEX); Serial.print("("); Serial.print(hasil->bit, DEC); Serial.println(" bit)"); Serial.print("Raw ("); Serial.print(hitungan, DEC); Serial.print("):"); for (int i =0; i rawbuf[i]*USECPERTICK, DEC); } else { Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC); } Serial.print(" "); } Serial.println("");}//************************************ ***************************************// Fungsi Lokal | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |// VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//**************************************** ********************************** unsigned long stringToNum(String s, int base) //10 untuk desimal, 16 untuk hex{ unsigned long i =0; nilai panjang yang tidak ditandatangani =0; unsigned long place =s.length(); karakter c; tanda panjang yang tidak ditandatangani =1; for(i; i ='0' &&c <='9') //0 hingga 9 { nilai +=( c - '0') * eksponen(basis,tempat); } else if (c>='A' &&((c - 'A' + 10) ='a' &&(c - 'a' + 10)
Definisi perangkatGroovy
/** * Smart Ir * * Penulis:[email protected] * Tanggal:06-03-2013 */metadata { // Simulator metadata simulator {} // Ubin definisi ubin UI { standardTile("recStatus", "device.recStatus", lebar:2, tinggi:2, canChangeIcon:true, canChangeBackground:true) { state "off", label:'record', action:"record", backgroundColor:"#ffffff" state "on" , label:'record', action:"record", backgroundColor:"#ff0000" } //ini adalah ubin sekunder //set, unset, prog - hijau, putih, kuning standarTile("buttonA", "device.buttonAStatus ", lebar:1, tinggi:1, canChangeIcon:true, canChangeBackground:true) { state "unset", label:'', action:"buttonA", icon:"st.custom.buttons.play-pause", backgroundColor :"#cccccc" //status abu-abu "prog", label:'', aksi:"buttonA", icon:"st.custom.buttons.play-pause", backgroundColor:"#FDE910" //status kuning "set ", label:'', tindakan:"buttonA", ikon:"st.custom.buttons.play-pause", backgroundColor:"#79b821" //hijau } //set, unset, prog - hijau, putih, y ellow standardTile("buttonB", "device.buttonBStatus", lebar:1, tinggi:1, canChangeIcon:true, canChangeBackground:true) { state "unset", label:'', action:"buttonB", icon:"st .custom.buttons.b", backgroundColor:"#cccccc" //status abu-abu "prog", label:'', tindakan:"buttonB", ikon:"st.custom.buttons.b", backgroundColor:"#FDE910 " //status kuning "set", label:'', tindakan:"buttonB", icon:"st.custom.buttons.b", backgroundColor:"#79b821" //hijau } //kemungkinan ubin utama utama ([ "buttonA","buttonB"]) //ini adalah larik untuk beberapa detail ubin (["recStatus","buttonA","buttonB"]) }}// Parsing pesan perangkat yang masuk untuk menghasilkan eventsdef parse(String description) { log.trace "parse:" def value =zigbee.parse(description)?.text def codeParts =value.split(/,/) log.trace "code:${codeParts[0]}" //[0] adalah hex, [1] adalah pengiriman ulang //dari [1], tiga karakter pertama adalah tipenya, diikuti oleh kode if(device.currentValue("recStatus") =="on") //in record mode { log .trace "rekaman diaktifkan" jika(device.cur rentValue("lastButton") !="") { log.trace "tombol terakhir aktif" def buttonStatus ="${device.currentValue("lastButton")}Status"; def buttonHex ="${device.currentValue("lastButton")}Hex"; def buttonCode ="${device.currentValue("lastButton")}Kode"; def result =[ createEvent(name:buttonStatus, value:"set", isStateChange:true) //mengubah tombol menjadi hijau ,createEvent(name:buttonHex, value:codeParts[0], isStateChange:true) //menyimpan kode , createEvent(name:buttonCode, value:codeParts[1], isStateChange:true) //menyimpan kode ,createEvent(name:"recStatus", value:"off", isStateChange:true) ,createEvent(name:"lastButton", value:"", isStateChange:true) //reset tombol terakhir ] kembalikan hasil } else{ log.trace "tidak ada tombol yang dipilih" } } else { //jika tidak //periksa apakah cocok dengan tombol apa pun if(codeParts[ 0] ==device.currentValue("buttonAHex")) { //mengirim event yang berhubungan dengan buttonA def result =createEvent(name:"button", value:"A",isStateChange:true) log.debug "Parse mengembalikan $ {result?.descriptionText}" return result } else if(codeParts[0] ==device.currentValue("buttonBHex")) { //mengirim event yang berhubungan dengan buttonB def result =createEvent(name:"button", value:"B", isStateChange:true ) log.debug "Parse mengembalikan ${result?.descriptionText}" ret urn result } } def result =createEvent(name:null, value:"") return result}def record(){ //masuk ke mode record log.debug "RecordMode berubah dari ${device.currentValue("recStatus")}" clearLast() //hapus tombol terakhir //alihkan atribut ke on/off if(device.currentValue("recStatus") =="on") { sendEvent(name:"recStatus", value:"off", isStateChange:true ) //warna ubin berubah menjadi putih } else { sendEvent(name:"recStatus", value:"on", isStateChange:true) //warna ubin berubah menjadi merah }}def buttonA(){ log.debug "ButtonA pressed" if(device.currentValue("recStatus") =="on") //jika dalam mode rekam, setel tombol untuk diprogram { clearLast() log.debug "Letakkan buttonA dalam mode pemrograman" //set atribut lastTile ke tileA //ubah menjadi kuning sendEvent(name:"buttonAStatus", value:"prog", isStateChange:true) sendEvent(name:"lastButton", value:"buttonA", isStateChange:true) } else if(device.currentValue(" buttonAStatus") =="set") //jika sudah disetel, kirim kode yang disimpan { log.debug "Send buttonA Code" //kirim kode jarak jauh ke blaster zigbee.smartShield(text:"${device.currentValue("buttonACode")}").format() } else { log.debug "tombol saat ini ${device.currentValue("buttonAStatus")} " }}def buttonB(){ clearLast() log.debug "Tombol ditekan" if(device.currentValue("recStatus") =="on") //jika dalam mode rekam, setel tombol yang akan diprogram { log.debug "Letakkan tombol dalam mode pemrograman" //set atribut lastTile ke tileA //ubah menjadi kuning sendEvent(name:"buttonBStatus", value:"prog", isStateChange:true) sendEvent(name:"lastButton", value:"buttonB ", isStateChange:true) } else if(device.currentValue("buttonBStatus") =="set") //jika sudah disetel, kirim kode yang disimpan { log.debug "Send buttonB Code" //kirim kode jarak jauh ke blaster zigbee.smartShield(teks:"${device.currentValue("buttonBCode")}").format() } else if(device.currentValue("buttonBStatus") =="tidak disetel") { log.debug "button saat ini tidak disetel" }}def clearLast(){ if(device.currentValue("lastButton") !="") { sendEvent(name:"${device.current Nilai("lastButton")}", nilai:"tidak disetel", isStateChange:true) sendEvent(name:"lastButton", nilai:"", isStateChange:true) }}
kode SmartAppGroovy
/** * Penerima IR * * Penulis:[email protected] * Tanggal:31-03-2013 */preferences { section("Pilih perangkat IR...") { input "irDevice", "device .IrBridge" } section("Tombol A menyala atau mati..."){ input "switch1", "capability.switch", title:"Lampu ini", diperlukan:false } section("Tombol B menyala atau mati ..."){ input "switch2", "capability.switch", judul:"Lampu ini", diperlukan:false } }def terinstal() { log.debug "Diinstal dengan pengaturan:${settings}" subscribe(irDevice , "button.B", handleB) subscribe(irDevice, "button.A",handleA)}def updated() { log.debug "Diperbarui dengan pengaturan:${settings}" unsubscribe() subscribe(irDevice, "button. B", handleB) subscribe(irDevice, "button.A",handleA)}def handleA(evt) { log.debug "menerima tombol A" if (switch1.currentValue("switch") =="on") { switch1 .off() } else { switch1.on() }}def handleB(evt) { log.debug "tombol yang diterima B" if (switch2.currentValue("switch") =="on") { switch2.off() } else { switch2.on() }}

Proses manufaktur

  1. Membuat robot dengan Raspberry Pi dan Python
  2. Membangun segway dengan Raspberry Pi
  3. Apa yang Saya Lakukan dengan Data?!
  4. Mengambil Tetesan Air Dengan Arduino
  5. Pemantauan CO2 dengan Sensor K30
  6. Komunikasi Tunarungu dengan 1Sheeld/Arduino
  7. Kontrol Penerima Koin dengan Arduino
  8. Arduino dengan Bluetooth untuk Mengontrol LED!
  9. Ketahui Suhu Rumah Anda Dari Mana Saja dengan Arduino Cloud!
  10. Membangun Masa Depan Pengalaman Karyawan Dengan Otomatisasi Cerdas