Isi kandungan:

Hue Magic: 4 Langkah (dengan Gambar)
Hue Magic: 4 Langkah (dengan Gambar)

Video: Hue Magic: 4 Langkah (dengan Gambar)

Video: Hue Magic: 4 Langkah (dengan Gambar)
Video: Kursi Menggambar, Melukis, Mewarnai untuk Anak & Balita | Teknik Menggambar Dasar #237 2024, September
Anonim
Image
Image

Ahli sihir selamat datang!

Beberapa bulan yang lalu saya membuat kotak sihir kecil dengan tongkat untuk anak saya yang berusia 3 tahun. Apabila dia menyentuh kotak dengan tongkat sihir, cahaya berwarna yang berubah akan mula terpancar dari kotak itu. Apabila dia melihat warna yang sangat disukainya, dia dapat mengarahkan tongkat ke arah lampu meja (dengan mentol Philips Hue di dalamnya), melemparkan mantra dan warna dari kotak akan secara ajaib melompat ke lampu! Lampu dan cahaya dari kotak tiba-tiba mempunyai warna yang sama …

Selepas beberapa saat, warnanya pudar dan lampu meja kembali ke keadaan sebelum mantra. Sehingga mantra baru dilancarkan …

Langkah 1: Apa yang Anda Perlu Buat Projek Ini

Apa Yang Anda Perlu Buat Projek Ini
Apa Yang Anda Perlu Buat Projek Ini
Apa Yang Anda Perlu Buat Projek Ini
Apa Yang Anda Perlu Buat Projek Ini
Apa Yang Anda Perlu Buat Projek Ini
Apa Yang Anda Perlu Buat Projek Ini

Untuk membuat projek ini, anda memerlukan bahan berikut:

    • 1 (atau lebih) mentol warna Philips Hue dan Jambatan Hue
    • 1 mikrokontroler berasaskan Wemos D1 mini atau esp8266 serupa
    • Sensor sentuh 1 (Arduino) (mis. TTP223R)
    • 1 (Arduino) butang sekejap
    • 1 kapasitor 10uF
    • 1 RGB led (jenis anod biasa)
    • 5 perintang (10, 22 dan 47 Ohm, 2x 10K Ohm)
    • 2 PCB prototaip kecil (2x3 inci atau kira-kira 5x7 cm mestilah cukup besar)
    • beberapa wayar (pelompat)
    • besi pematerian
    • tongkat sihir (boleh dibeli sebagai barang siap di kedai mainan, atau anda boleh membuatnya sendiri)
    • kotak kecil yang terbuat dari kadbod atau kayu (boleh menjadi kotak yang ada, tetapi anda juga boleh membina kotak dari awal)
    • beberapa pita
    • beberapa gam dan / atau kacang dan baut untuk memasang PCB di dalam kotak.
    • pilihan: kertas pembungkus untuk kotak

NB: Sedikit pengalaman dalam membaca gambarajah litar sangat berguna semasa menjalani arahan ini. Gambar rajah saya tidak terlalu rumit: jika anda dapat membezakan kapasitor dari perintang, anda mungkin akan baik-baik saja.

Beberapa pengalaman dengan pengaturcaraan Arduino menggunakan Arduino IDE juga bermanfaat. Pengalaman yang agak asas seharusnya cukup, kerana saya akan memberikan kod lengkap untuk anda salin / tampal. Anda perlu menyesuaikan beberapa perkara untuk membuatnya berfungsi dalam penyediaan tertentu (mis. Tetapan rangkaian anda dan beberapa perincian dari konfigurasi Hue anda). Sekiranya ini terdengar agak menakutkan, jangan risau, saya akan membantu anda mendapatkan semula semua maklumat yang anda perlukan.

Langkah 2: Kotak & Tongkat

Kotak & Tongkat
Kotak & Tongkat
Kotak & Tongkat
Kotak & Tongkat

Langkah pertama biasanya adalah yang paling sukar, tetapi tidak mengikut arahan ini! Untuk permulaan yang mudah, anda hanya boleh membeli tongkat sihir dari kedai mainan dan untuk kotak itu anda boleh menggunakan semula kotak kecil yang sudah ada yang sudah terbaring. Pastikan kotak itu tidak terbuat dari logam, kerana ini akan menyekat isyarat wifi dan kita memerlukannya untuk keajaiban;-).

Apabila anda mengarahkan semula kotak yang ada, satu-satunya perkara yang perlu anda lakukan ialah membuat dua lubang di bahagian atas kotak: 1 lubang kecil (ukuran 5mm = 0.2 ") untuk led RGB dan lubang yang lebih besar (sekitar 12- 14mm atau kira-kira 0.5 ") untuk sensor sentuh.

Penempatan lubang yang tepat tidak kritikal, letakkan mengikut kesesuaian estetika anda tetapi ingatlah beberapa perkara:

  • Jauhkan jarak antara kedua-dua lubang untuk memastikan komponen yang akan dipasang di bawah lubang (led RGB dan sensor sentuh) kedua-duanya dibenarkan untuk menempati ruang yang cukup untuk pemasangan dan pendawaian.
  • Lubang terbesar adalah untuk sensor sentuh. Sensor ini akan dipasang tepat di bawah lubang, sedemikian rupa sehingga dapat disentuh (dan bahkan sedikit ditekan) oleh tongkat. Oleh itu, pastikan tongkat yang anda beli tidak terlalu tebal!

Sebagai pilihan, anda boleh menggunakan cat (spray) atau kertas pembungkus dan plastik penutup untuk menjadikan kotak anda sedikit lebih cantik dan melindunginya dari tumpahan makanan dan tangan yang kotor.

Sekiranya langkah pertama ini sedikit tidak sesuai dengan keinginan anda, teruskan dan buat kotak dan tongkat sepenuhnya dari awal! Terdapat beberapa perkara yang tidak dapat disembunyikan di luar sana yang akan membantu anda membuat tongkat yang indah

Apa sahaja jalan yang anda pilih, kini saatnya untuk meneroka bahagian dalam kotak.

Langkah 3: Perkakasan Di Dalam

Perkakasan Di Dalam
Perkakasan Di Dalam
Perkakasan Di Dalam
Perkakasan Di Dalam
Perkakasan Di Dalam
Perkakasan Di Dalam

Gunakan besi pematerian untuk menyambungkan komponen elektronik mengikut rajah litar di atas. Terdapat beberapa perkara yang perlu diberi perhatian khusus:

  • Wayar antara Wemos D1 Mini dan LED RGB harus cukup panjang sehingga led RGB boleh dipasang di lubang yang anda buat di penutup kotak.
  • Kira-kira yang sama untuk wayar yang terpasang pada suis sesaat dan sensor sentuh kerana kabel ini boleh diakses melalui lubang lain di penutupnya.
  • Butang suis sesaat harus dilekatkan ke bahagian bawah (sisi tidak sensitif) sensor sentuh, sedemikian rupa sehingga anda dapat meletakkan kembali butang pada suis sesaat dengan sensor sentuh terpaku di atas (lihat gambar). Sensor sentuh dipasang di atas suis sesaat untuk mengesan penekanan butang yang dilakukan oleh jari, dalam hal ini tekan butang akan diabaikan. Hanya apabila butang ditekan oleh tongkat sihir (yang seharusnya tidak konduktif, jadi plastik dan kayu baik), kitaran sihir akan bermula.
  • Pasang butang sesaat dengan sensor sentuh di atas tidak terlalu jauh di bawah lubang penutupnya, kerana ia perlu dijangkau oleh tongkat sihir untuk mengatur sihir tersebut.
  • Pastikan untuk memerhatikan kekutuban kapasitor semasa menyoldernya. Sekiranya anda membalikkan petunjuk positif dan negatif, kapasitor kemungkinan akan mengeluarkan asap sihir dan meletakkan litar anda dalam tidur yang kekal.
  • Lekatkan, pita dan atau skru pemegang bateri dan PCB di tempatnya. Tidak harus rapi, karena tidak akan terlihat. Ia semestinya menjadi bukti penurunan.

Pergi ke perisian!

Langkah 4: Perisian

Pastikan anda mempunyai penyunting perisian Arduino (percuma) terkini, yang boleh dimuat turun di https://www.arduino.cc/en/Main/Software. Untuk menambah sokongan untuk Wemos D1 mini dan papan berasaskan ESP8266 lain, ambil langkah berikut:

  • Selepas pemasangan, mulakan perisian Arduino dan buka tetingkap Preferences.
  • Masukkan https://arduino.esp8266.com/stable/package_esp8266com_index.json ke dalam bidang "URL Pengurus Papan Tambahan". Anda boleh menambahkan beberapa URL, memisahkannya dengan koma.
  • Buka Pengurus Papan dari Alat> Menu papan dan pasang platform esp8266 (dan jangan lupa untuk memilih papan ESP8266 anda dari Alat> Menu papan selepas pemasangan. "LOLIN (WEMOS) D1 R2 & mini" berfungsi paling baik untuk Wemos D1 mini v2 dan v3 papan.

Sekiranya anda memerlukan lebih banyak bantuan untuk memasang Arduino dan menyiapkan pemacu, anda boleh melihat

Dalam editor Arduino, buka fail baru (Fail> Baru) dan salin / tampal kod di bawah di tetingkap yang baru dibuka. Tuliskan garis yang sudah ada di tetingkap baru (persediaan kosong dan gelung kosong).

Sekarang anda hampir siap, tetapi anda perlu menyesuaikan beberapa bahagian kod untuk penyediaan tertentu anda.

Perkara pertama yang perlu dilakukan ialah menukar alamat ip pada baris 34 (dalam editor Arduino baris kod diberi nombor) ke alamat ip jambatan Hue anda. Sekiranya anda tidak mengetahui alamat IP Hue Bridge anda, kunjungi https://discovery.meethue.com/ dan alamat IP yang betul akan segera muncul di penyemak imbas anda. Alamat ip adalah nombor putus-putus yang didahului oleh "internalipaddress".

Untuk berkomunikasi dengan lampu Hue, anda harus membuat pengguna API Hue untuk Wemos D1 mini, sehingga Wemos dapat berkomunikasi dengan lampu Hue melalui Hue API. Untuk melakukannya, ikuti arahan di https://developers.meethue.com/develop/get-started-2/ dan salin / tampal nama pengguna yang dihasilkan (cukup lama) di tetingkap kod Arduino. Cukup ganti setiap "PENGGUNA API HUE ANDA" dengan nama pengguna API yang dihasilkan.

Kemudian anda perlu memilih lampu Hue yang tepat untuk menukar warna. Dalam API Hue setiap lampu memiliki nombor, jadi anda perlu mengetahui nombor yang sesuai dengan cahaya yang ingin anda gunakan untuk projek ini. Salah satu cara termudah untuk mengetahui nombor yang dimiliki cahaya tertentu, adalah memuat turun Aplikasi Hue Viewer untuk Android atau iOS. Ganti teks "NOMBOR CAHAYA ANDA" dengan nombor yang betul di mana sahaja di tetingkap kod Arduino.

Perkara terakhir yang perlu dilakukan ialah menyediakan Wemos untuk menyambung ke rangkaian wifi anda. Ini dilakukan dengan memuat naik kod ke Wemos dan pada komputer riba anda beralih ke rangkaian wifi lain: ke "AutoConnectAP". Penyemak imbas anda kemudian akan memaparkan halaman di mana anda dapat menambahkan SSID (nama) dan kata laluan rangkaian wifi anda yang akan digunakan pengawal Wemos untuk menyambung ke rangkaian wifi anda (dan ke jambatan Hue).

NB: Sekiranya memuat naik kod ke Wemos D1 mini kami melalui USB tidak berfungsi, anda mungkin perlu memuat turun pemacu untuk cip USB di Wemos. Pemacu untuk platform anda (Windows, Mac) boleh dimuat turun di

Sekarang anda sudah bersedia untuk menguji ciptaan anda!

// ESP8266 Hue Magic Wand // Richard van Kampen - 2018 // Kod ini diuji pada Wemos D1 mini, tetapi mungkin juga akan berfungsi pada papan pengembangan berasaskan ESP8266 lain // Untuk menambahkan sokongan untuk Wemos D1 mini dan papan ESP8266 lain kepada editor Arduino, ambil langkah berikut: // - Mulakan Arduino dan buka tetingkap Preferences. // - Masukkan https://arduino.esp8266.com/stable/package_esp8266com_index.json ke dalam medan URL Pengurus Papan Tambahan. Anda boleh menambahkan beberapa URL, memisahkannya dengan koma. // - Buka Pengurus Papan dari Alat> Menu papan dan pasang platform esp8266 (dan jangan lupa memilih papan ESP8266 anda dari Alat> menu Papan selepas pemasangan). // perpustakaan terpakai: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Pelayan DNS tempatan yang digunakan untuk mengarahkan semua permintaan ke portal konfigurasi WiFiManager jika tidak ada tetapan WIFI (SSID, kata laluan) belum ditetapkan. #include "ESP8266WebServer.h" // Local WebServer digunakan untuk melayani portal konfigurasi WiFiManager #include "WiFiManager.h" // Perpustakaan Magic Configuration WiFi, jika belum dipasang sila rujuk https://github.com/tzapu/WiFiManager # install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, diperlukan untuk menggunakan Philips Hue API (lihat https://developers.meethue.com/develop/ hue-api /). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, diperlukan untuk menganalisis respons API Hue, sila pasang versi 5.x melalui pengurus perpustakaan di Arduino (Menu "Sketsa"> Sertakan Perpustakaan> Kelola Perpustakaan> cari ArduinoJson dan ubah versi menjadi 5.x terkini). Versi 6 (kini dalam beta) menimbulkan ralat. // pemboleh ubah dan init: Respons tali; const int redPin = 13; // pada Wemos ini adalah d7 const int greenPin = 12; // pada Wemos ini adalah d6 const int bluePin = 14; // pada Wemos ini adalah d5 const int touchSensor = 5; // pada Wemos ini adakah d1 const int activationPin = 4; // pada Wemos ini adalah d2 bool activation = TINGGI; sentuhan bool = RENDAH; const char * aan_restore; int bri_restore; x_restore berganda; y_restore berganda; x_magik berganda; berganda y_magik; bool dulu = benar; permulaan panjang yang tidak ditandatanganiMillis; arus panjang yang tidak ditandatanganiMillis; jangka masa panjang yang tidak ditandatanganiMillis; Pelanggan RestClient = RestClient ("192.168.178.23"); // "alamat IP Hue Bridge anda" // Jika anda tidak mengetahui alamat IP Hue Bridge anda, kunjungi https://discovery.meethue.com dan alamat tersebut akan segera muncul di penyemak imbas anda. Alamat ip adalah nombor putus-putus yang didahului oleh persediaan dalaman "internalipaddress" () {analogWriteRange (255); Serial.begin (9600); // Mulakan dengan LED mati. pinMode (activationPin, INPUT_PULLUP); pinMode (touchSensor, INPUT); startMillis = millis (); checkWand (); } gelung void () {// tiada kaitan di sini, biarkan kosong…} kosongkan checkWand () {int rgbColour [3]; // Kod warna RGB oleh James Harton, https://gist.github.com/jamesotron/766994 // Mulakan dengan warna merah. rgbColour [0] = 255; rgbColour [1] = 0; rgbColour [2] = 0; activation = digitalRead (activationPin); // RENDAH bermaksud tongkat digunakan. touch = digitalRead (touchSensor); // TINGGI bermaksud jari digunakan dan bukannya tongkat sihir, yang seharusnya tidak berlaku. sementara (pengaktifan == RENDAH && sentuh == RENDAH) {// Pilih warna untuk kenaikan dan penurunan. untuk (int decColour = 0; decColour <3; decColour + = 1) {int incColour = decColour == 2? 0: decColour + 1; // = pengendali ternary, bermaksud: int incColour; if (decColour == 2) {incColour = 0;} other {incColour = decColour +1;} // pudar dua warna. untuk (int i = 0; i <255; i + = 1) {rgbColour [decColour] - = 1; rgbColour [incColour] + = 1; // kerana led RGB kami mempunyai anod biasa dan bukannya katod (jadi kami perlu menyambung ke + 3.3V dan bukannya ground), kami memerlukan nilai terbalik untuk RGB: int red = 255 - rgbColour [0]; int hijau = 255 - rgbColour [1]; int biru = 255 - rgbColour [2]; analogWrite (redPin, merah); analogWrite (greenPin, hijau); analogWrite (bluePin, biru); kelewatan (8); pengaktifan = digitalRead (activationPin); jika (pengaktifan == TINGGI) {// TINGGI bermaksud tongkat diangkat. goto stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durasiMillis = (currentMillis - startMillis); jika (tempohMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } lain {// masukkan Wemos ke mod tidur: ESP.deepSleep (0); }} batal RGBtoxy (int merah, int hijau, int biru) {// lihat https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = peta (merah, 0, 255, 0, 1000); R / = 1000; double G = peta (hijau, 0, 255, 0, 1000); G / = 1000; berganda B = peta (biru, 0, 255, 0, 1000); B / = 1000; R = (R> 0.04045f)? pow ((R + 0.055f) / (1.0f + 0.055f), 2.4f): (R / 12.92f); G = (G> 0.04045f)? pow ((G + 0.055f) / (1.0f + 0.055f), 2.4f): (G / 12.92f); B = (B> 0.04045f)? pow ((B + 0.055f) / (1.0f + 0.055f), 2.4f): (B / 12.92f); berganda X = R * 0.649926f + G * 0.103455f + B * 0.197109f; berganda Y = R * 0.234327f + G * 0.743075f + B * 0.022598f; berganda Z = R * 0.0000000f + G * 0.053077f + B * 1.035763f; berganda x = X / (X + Y + Z); dua kali ganda y = Y / (X + Y + Z); // penukaran tidak selesai sepenuhnya, tetapi mungkin cukup baik untuk apa yang ingin kita capai, jadi tinggalkan ini dan hantarkan nilai XY ke lampu: sendtoHue (x, y); } batal sendtoHue (double a, double b) {// perubahan warna sebenar dari tongkat sihir jika (pertama) {// hantaran pertama: dapatkan keadaan lampu semasa getCurrentValues (); } // kemudian hantarkan warna tongkat sihir: // tunggu mantra: tunggu lama; x_magic = a; y_magic = b; // lampu menyala dengan warna tongkat sihir: tindak balas = ""; int temp = rawak (2, 9); const char * state = "benar"; untuk (int i = 1; i <= temp; i ++) {// buat array char untuk dihantar ke bridge: String temp_body1 = "{" on / ":" + String (state) + ", \" bri / ": 220, / "xy \": ["+ String (x_magic) +", "+ String (y_magic) +"], / "masa peralihan \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // sekarang kita mempunyai post_body1 sebagai array char; // buat rehat: int statusCodePut1 = client.put ("/ api / NAMA PENGGUNA API HUE / lampu / NOMBOR CAHAYA ANDA / keadaan", post_body1, & respons); tunggu = rawak (100, 600); kelewatan (tunggu); jika (state == "true") {state = "false"; } lain {state = "true"; }} // kurangkan kecerahan…: tindak balas = ""; temp = rawak (4, 17); // buat array char untuk dihantar ke jambatan: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" Transtimetime / ":" + String (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // sekarang kita mempunyai post_body2 sebagai array char; // buat rehat: int statusCodePut2 = client.put ("/ api / NAMA PENGGUNA API HUE ANDA / lampu / NOMOR LIGHT ANDA / keadaan", post_body2, & respons); tunggu = rawak (1000, 2500); kelewatan (tunggu); //..dan buat lebih cerah lagi: tindak balas = ""; temp = rawak (4, 17); // buat array char untuk dihantar ke jambatan: String temp_body3 = "{" bri_inc / ": 100, \" transtimetime / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // sekarang kita mempunyai post_body3 sebagai array char; // buat rehat: int statusCodePut3 = client.put ("/ api / NAMA PENGGUNA API HUE ANDA / lampu / NOMBOR CAHAYA / keadaan", post_body3, & respons); tunggu = rawak (2500, 5000); // tunggu kelewatan 2-5 saat (tunggu); // dan pudar kembali ke nilai lama: respons = ""; // buat array char untuk dihantar ke jambatan: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": ["+ String (x_restore) +", "+ String (y_restore) +"], / "masa peralihan \": "+ String (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // sekarang kita mempunyai post_body4 sebagai array char; // buat rehat: int statusCodePut4 = client.put ("/ api / NAMA PENGGUNA API HUE / lampu / NOMBOR CAHAYA ANDA / keadaan", post_body4, & respons); ESP.deepSleep (0); // akan tidur semula…. } int getCurrentValues yang tidak ditandatangani () {connectWifi (); // sambungkan pertama ke respons Wifi = ""; // buat rehat: int statusCodeGet = client.get ("/ api / NAMA PENGGUNA API HUE ANDA / lampu / NOMBOR CAHAYA ANDA", & respons); Serial.print ("Kod status dari pelayan selepas GET:"); Serial.println (statusCodeGet); Serial.print ("Badan respons dari pelayan:"); Serial.println (tindak balas); StaticJsonBuffer jsonBuffer; // Menghuraikan respons Json // Akar pokok objek. // // Ini merujuk kepada JsonObject, byte sebenarnya ada di dalam // jsonBuffer dengan semua nod pokok objek yang lain. // Memori dibebaskan apabila jsonBuffer berada di luar ruang lingkup. JsonObject & root = jsonBuffer.parseObject (tindak balas); JsonObject & state = root ["state"]; // Uji apakah penghuraian berjaya. jika (! root.success ()) {Serial.println ("parseObject () gagal"); } // Ambil nilai. aan_restore = nyatakan ["on"]; Serial.println (aan_restore); bri_restore = negeri ["bri"]; x_restore = negeri ["xy"] [0]; y_restore = negeri ["xy"] [1]; pertama = false;} batal connectWifi () {// Intialisasi tempatan. Setelah perniagaannya selesai, tidak perlu menyimpannya di sekitar WiFiManager wifiManager; // tetapkan semula tetapan - untuk ujian: //wifiManager.resetSettings (); // tetapkan panggilan balik yang dipanggil ketika menyambung ke WiFi sebelumnya gagal, dan memasuki mod Titik Akses wifiManager.setAPCallback (configModeCallback); // mengambil ssid dan lulus dan cuba menyambung // jika tidak menyambungkannya, ia memulakan titik akses dengan nama yang ditentukan // di sini "AutoConnectAP" // dan memasuki gelung pencegahan yang menunggu konfigurasi jika (! wifiManager.autoConnect ()) {Serial.println ("gagal menyambung dan tekan timeout"); // tetapkan semula dan cuba lagi, atau mungkin tidurkan ESP.reset (); kelewatan (1000); } // jika anda sampai di sini anda telah menyambung ke WiFi Serial.println ("bersambung … yeey:)"); Serial.print ("Bersambung ke:"); Serial.println (WiFi. SSID ()); Serial.print ("Alamat IP:"); Serial.println (WiFi.localIP ()); // Alamat IP yang diberikan kepada ESP anda (Wemos) // mencetak kekuatan isyarat yang diterima: panjang rssi = WiFi. RSSI (); Serial.print ("kekuatan isyarat (RSSI):"); Serial.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Memasukkan mod konfigurasi"); Serial.println (WiFi.softAPIP ()); // jika anda menggunakan SSID yang dihasilkan secara automatik, cetaklah Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Disyorkan: