Daftar Isi:

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

Video: Sihir Hue: 4 Langkah (dengan Gambar)

Video: Sihir Hue: 4 Langkah (dengan Gambar)
Video: BAGAIMANA SIHIR BEKERJA 2024, September
Anonim
Image
Image

Selamat datang para penyihir!

Beberapa bulan yang lalu saya membuat kotak ajaib kecil dengan tongkat untuk putra saya yang berusia 3 tahun. Ketika dia menyentuh kotak dengan tongkat, cahaya berwarna yang berubah akan mulai memancar dari kotak. Ketika dia melihat warna yang sangat dia sukai, dia dapat mengarahkan tongkatnya ke lampu meja (dengan bohlam Philips Hue di dalamnya), membaca mantra dan warna dari kotak akan melompat ke lampu secara ajaib! Lampu dan cahaya dari kotak tiba-tiba memiliki warna yang sama …

Setelah beberapa detik, warnanya memudar dan lampu meja kembali ke keadaannya sebelum mantra. Sampai mantra baru dilemparkan …

Langkah 1: Apa yang Anda Butuhkan untuk Membuat Proyek Ini

Apa yang Anda Butuhkan untuk Membuat Proyek Ini
Apa yang Anda Butuhkan untuk Membuat Proyek Ini
Apa yang Anda Butuhkan untuk Membuat Proyek Ini
Apa yang Anda Butuhkan untuk Membuat Proyek Ini
Apa yang Anda Butuhkan untuk Membuat Proyek Ini
Apa yang Anda Butuhkan untuk Membuat Proyek Ini

Untuk membuat proyek ini, Anda memerlukan bahan-bahan berikut:

    • 1 (atau lebih) bohlam warna Philips Hue dan Jembatan Hue
    • 1 Wemos D1 mini atau mikrokontroler berbasis esp8266 serupa
    • 1 (Arduino) sensor sentuh (misalnya TTP223R)
    • 1 (Arduino) tombol sesaat
    • 1 10uF kapasitor
    • 1 LED RGB (tipe anoda umum)
    • 5 resistor (10, 22 dan 47 Ohm, 2x 10K Ohm)
    • 2 PCB prototipe kecil (2x3 inci atau sekitar 5x7 cm harus cukup besar)
    • beberapa kabel (pelompat)
    • besi solder
    • tongkat ajaib (bisa dibeli sebagai yang sudah jadi di toko mainan, atau Anda bisa membuatnya sendiri)
    • sebuah kotak kecil yang terbuat dari karton atau kayu (bisa berupa kotak yang sudah ada, tetapi Anda juga dapat membuat kotak dari awal tentunya)
    • beberapa kaset
    • beberapa lem dan/atau mur dan baut untuk memasang PCB di dalam kotak.
    • opsional: kertas pembungkus untuk kotak

NB: Sedikit pengalaman dalam membaca diagram sirkuit sangat membantu ketika melalui instruksi ini. Diagram saya tidak terlalu rumit: jika Anda dapat membedakan kapasitor dari resistor, Anda mungkin akan baik-baik saja.

Beberapa pengalaman dengan pemrograman Arduino menggunakan Arduino IDE juga membantu. Pengalaman yang agak mendasar seharusnya sudah cukup, karena saya akan memberikan kode lengkap untuk Anda salin/tempel. Anda harus menyesuaikan beberapa hal, untuk membuatnya berfungsi dalam pengaturan khusus Anda (misalnya pengaturan jaringan Anda dan beberapa detail dari konfigurasi Hue Anda). Jika ini terdengar sedikit menakutkan, jangan khawatir, saya akan membantu Anda mendapatkan kembali semua informasi yang Anda butuhkan.

Langkah 2: Kotak & Tongkat

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

Langkah pertama biasanya yang paling sulit, tetapi tidak dalam instruksi ini! Untuk permulaan yang mudah, Anda bisa membeli tongkat ajaib dari toko mainan dan untuk kotaknya Anda bisa menggunakan kembali kotak kecil yang sudah ada dan sudah tergeletak di sekitar Anda. Pastikan kotaknya tidak terbuat dari logam, karena ini akan memblokir sinyal wifi dan kita membutuhkannya untuk keajaiban;-).

Saat Anda menggunakan kembali kotak yang ada, satu-satunya hal yang harus Anda lakukan adalah membuat dua lubang di bagian atas kotak: 1 lubang kecil (ukuran 5mm = 0,2") untuk led RGB dan lubang yang lebih besar (sekitar 12- 14mm atau sekitar 0,5") untuk sensor sentuh.

Penempatan lubang yang tepat tidak penting, cukup tempatkan sesuai dengan selera estetika Anda, tetapi ingatlah beberapa hal:

  • Jaga jarak antara kedua lubang untuk memastikan komponen yang akan dipasang di bawah lubang (LED RGB dan sensor sentuh) keduanya diizinkan untuk menempati ruang yang cukup untuk pemasangan dan pemasangan kabel.
  • 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. Jadi pastikan tongkat yang Anda beli tidak terlalu tebal!

Opsional Anda dapat menggunakan (semprot) cat atau kertas pembungkus dan plastik penutup untuk membuat kotak Anda sedikit lebih cantik dan untuk melindunginya dari tumpahan makanan dan tangan kotor.

Jika langkah pertama ini sedikit terlalu ambisius sesuai keinginan Anda, silakan buat kotak dan tongkat sepenuhnya dari awal! Ada beberapa instruksi di luar sana yang akan membantu Anda membuat tongkat yang indah

Jalan apa pun yang Anda pilih, sekarang saatnya menjelajahi bagian dalam kotak.

Langkah 3: Perangkat Keras Di Dalam

Perangkat Keras Di Dalam
Perangkat Keras Di Dalam
Perangkat Keras Di Dalam
Perangkat Keras Di Dalam
Perangkat Keras Di Dalam
Perangkat Keras Di Dalam

Gunakan besi solder untuk menghubungkan komponen elektronik sesuai dengan diagram rangkaian di atas. Ada beberapa hal yang perlu mendapat perhatian khusus:

  • Kabel antara Wemos D1 Mini dan led RGB harus cukup panjang sehingga led RGB dapat dipasang di lubang yang telah Anda buat di tutup kotak.
  • Jumlah yang sama untuk kabel yang terpasang ke sakelar sesaat dan sensor sentuh karena ini harus dapat diakses melalui lubang lain di tutupnya.
  • Tombol sakelar sesaat harus direkatkan ke bagian bawah (sisi non-sensitif) sensor sentuh, sedemikian rupa sehingga Anda dapat meletakkan tombol kembali pada sakelar sesaat dengan sensor sentuh terpaku di atas (lihat gambar). Sensor sentuh dipasang di atas sakelar sesaat untuk mendeteksi penekanan tombol yang dilakukan oleh jari, dalam hal ini penekanan tombol akan diabaikan. Hanya ketika tombol ditekan oleh tongkat ajaib (yang seharusnya non-konduktif, jadi plastik dan kayu baik-baik saja), siklus ajaib akan dimulai.
  • Pasang tombol sesaat dengan sensor sentuh di bagian atas tidak terlalu dalam di bawah lubang di tutupnya, karena perlu dijangkau oleh tongkat ajaib untuk menggerakkan sihir.
  • Pastikan untuk mengamati polaritas kapasitor saat menyoldernya. Jika Anda membalikkan kabel positif dan negatif, kapasitor kemungkinan akan mengeluarkan asap ajaib dan membuat sirkuit Anda tertidur selamanya.
  • Rekatkan, rekatkan dan atau kencangkan dudukan baterai dan PCB pada tempatnya. Tidak harus rapi, karena tidak akan terlihat. Itu hanya harus menjadi bukti jatuh.

Ke perangkat lunak!

Langkah 4: Perangkat Lunak

Pastikan Anda memiliki software editor Arduino terbaru (gratis) yang dapat diunduh di https://www.arduino.cc/en/Main/Software. Untuk menambahkan dukungan untuk mini Wemos D1 dan papan berbasis ESP8266 lainnya, lakukan langkah-langkah berikut:

  • Setelah instalasi, mulai perangkat lunak Arduino dan buka jendela Preferences.
  • Masukkan https://arduino.esp8266.com/stable/package_esp8266com_index.json ke dalam bidang "Additional Board Manager URLs". Anda dapat menambahkan beberapa URL, memisahkannya dengan koma.
  • Buka Boards Manager dari Tools > Board menu dan instal platform esp8266 (dan jangan lupa untuk memilih board ESP8266 Anda dari Tools > Board menu setelah instalasi. "LOLIN(WEMOS) D1 R2 & mini" bekerja paling baik untuk Wemos D1 mini v2 dan v3 papan.

Jika Anda memerlukan bantuan lebih lanjut untuk menginstal Arduino dan menyiapkan driver, Anda dapat melihat di

Di editor Arduino, buka file baru (File> New) dan salin/tempel kode di bawah ini di jendela yang baru saja dibuka. Timpa saja baris yang sudah ada di jendela baru (pengaturan void dan loop batal).

Sekarang Anda hampir siap, tetapi Anda harus menyesuaikan beberapa bagian kode untuk pengaturan khusus Anda.

Hal pertama yang harus dilakukan adalah mengubah alamat ip pada baris 34 (di editor Arduino baris kode diberi nomor) menjadi alamat ip jembatan Hue Anda. Jika Anda tidak tahu alamat IP Jembatan Hue Anda, kunjungi https://discovery.meethue.com/ dan alamat IP yang benar akan langsung muncul di browser Anda. Alamat ip adalah nomor putus-putus yang didahului oleh "internalipaddress".

Untuk berkomunikasi dengan lampu Hue, Anda harus membuat pengguna Hue API untuk Wemos D1 mini, sehingga Wemos dapat berkomunikasi dengan cahaya Hue melalui Hue API. Untuk melakukannya, ikuti instruksi di https://developers.meethue.com/develop/get-started-2/ dan salin/tempel nama pengguna yang dihasilkan (cukup panjang) di jendela kode Arduino. Ganti saja setiap "NAMA PENGGUNA API HUE ANDA" dengan nama pengguna API yang dihasilkan.

Maka Anda perlu memilih cahaya Hue yang tepat untuk mengubah warna. Di Hue API setiap lampu memiliki nomor, jadi Anda perlu mencari tahu nomor yang sesuai dengan lampu yang ingin Anda gunakan untuk proyek ini. Salah satu cara termudah untuk mengetahui nomor mana yang dimiliki lampu tertentu, adalah dengan mengunduh Aplikasi Hue Viewer untuk Android atau iOS. Ganti teks "YOUR LIGHT NUMBER" dengan nomor yang benar di mana saja di jendela kode Arduino.

Hal terakhir yang harus dilakukan adalah mengatur Wemos untuk terhubung ke jaringan wifi Anda. Ini dilakukan dengan mengunggah kode ke Wemos dan di laptop Anda beralih ke jaringan wifi lain: ke "AutoConnectAP". Browser Anda kemudian akan menampilkan halaman di mana Anda dapat menambahkan SSID (nama) dan kata sandi jaringan wifi Anda yang akan digunakan pengontrol Wemos untuk terhubung ke jaringan wifi Anda (dan ke jembatan Hue).

NB: Jika mengunggah kode ke Wemos D1 mini kami melalui USB tidak berfungsi, Anda mungkin perlu mengunduh driver untuk chip USB di Wemos. Driver untuk platform Anda (Windows, Mac) dapat diunduh di

Sekarang Anda siap untuk menguji kreasi Anda!

// ESP8266 Tongkat Ajaib Hue// Richard van Kampen - 2018 // Kode ini diuji pada mini Wemos D1, tetapi mungkin juga akan berfungsi pada papan pengembangan berbasis ESP8266 lainnya // Untuk menambahkan dukungan untuk mini Wemos D1 dan papan ESP8266 lainnya ke editor Arduino, lakukan langkah-langkah berikut: // - Mulai Arduino dan buka jendela Preferensi. // - Masukkan https://arduino.esp8266.com/stable/package_esp8266com_index.json ke dalam bidang URL Manajer Dewan Tambahan. Anda dapat menambahkan beberapa URL, memisahkannya dengan koma. // - Buka Boards Manager dari menu Tools > Board dan instal platform esp8266 (dan jangan lupa untuk memilih board ESP8266 Anda dari menu Tools > Board setelah instalasi). // library yang digunakan: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Server DNS Lokal yang digunakan untuk mengarahkan semua permintaan ke portal konfigurasi WiFiManager jika tidak ada pengaturan WIFI (SSID, kata sandi) belum ditetapkan. #include "ESP8266WebServer.h" //Server Web Lokal yang digunakan untuk melayani portal konfigurasi WiFiManager #include "WiFiManager.h" // Perpustakaan Sihir Konfigurasi WiFi, jika belum diinstal, silakan merujuk ke 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 Hue API, silakan instal versi 5.x melalui pengelola perpustakaan di Arduino (Menu "Sketsa" > Sertakan Perpustakaan > Kelola Perpustakaan > cari ArduinoJson dan ubah versi ke 5.x terbaru). Versi 6 (saat ini dalam versi beta) menimbulkan kesalahan. // variabel dan init: String respon; 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 adalah d1 const int activationPin = 4;//pada Wemos ini d2 bool activation = HIGH; sentuhan bool = RENDAH; const char* aan_restore; int bri_restore; x_restore ganda; y_restore ganda; ganda x_magic; ganda y_magic; bool dulu = benar; startMillis panjang yang tidak ditandatangani; Milis arus panjang yang tidak ditandatangani; durasi panjang yang tidak ditandatanganiMillis; Klien RestClient = RestClient("192.168.178.23"); // "alamat IP Jembatan Hue Anda" // Jika Anda tidak tahu alamat IP Jembatan Hue Anda, kunjungi https://discovery.meethue.com dan alamat itu akan langsung muncul di browser Anda. Alamat ip adalah nomor putus-putus yang didahului oleh "internalipaddress" void setup() { analogWriteRange(255); Serial.begin(9600); // Mulai dengan LED mati. pinMode(Pin aktivasi, INPUT_PULLUP); pinMode(Sensor sentuh, INPUT); startMillis = mili(); checkWand(); } void loop() { // tidak ada yang bisa dilakukan di sini, biarkan kosong… } void checkWand() { int rgbColour[3]; // Kode warna RGB oleh James Harton, https://Gist.github.com/jamesotron/766994 // Mulai dengan warna merah. rgbWarna[0] = 255; rgbWarna[1] = 0; rgbWarna[2] = 0; activation = digitalRead(activationPin);// LOW berarti tongkat sedang digunakan. touch = digitalRead(touchSensor);// HIGH berarti jari yang digunakan sebagai pengganti tongkat, yang seharusnya tidak demikian. while (aktivasi == RENDAH && sentuh == RENDAH) { // Pilih warna untuk menambah dan mengurangi. for (int decColour = 0; decColour < 3; decColour += 1) { int incColour = decoColour == 2 ? 0: warna-warni + 1; //= operator ternary, artinya: int incColour;if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // cross-fade kedua warna. for (int i = 0; i <255; i += 1) { rgbColour[decColour] -= 1; rgbWarna[termasukWarna] += 1; // karena led RGB kita memiliki anoda yang sama dan bukan katoda (jadi kita perlu menyambungkan ke +3.3V sebagai ganti ground), kita membutuhkan nilai kebalikan untuk RGB: int red = 255 - rgbColour[0]; int hijau = 255 - rgbWarna[1]; int biru = 255 - rgbWarna [2]; analogWrite(pin merah, merah); analogWrite(pin hijau, hijau); analogWrite(bluePin, biru); penundaan (8); aktivasi = digitalRead(activationPin); if (aktivasi == TINGGI) { // TINGGI berarti tongkat diangkat. goto stopColorCycling; } } } } stopColorCycling: currentMillis = milis(); durasiMillis = (currentMillis - startMillis); if (durasiMillis> 1000) { RGBtoxy(rgbColour[0], rgbColour[1], rgbColour[2]); } else { //masukkan Wemos ke mode tidur: ESP.deepSleep(0); } } void RGBtoxy(int red, int green, int blue) { //lihat https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = map(red, 0, 255, 0, 1000); R /= 1000; double G = peta(hijau, 0, 255, 0, 1000); G /= 1000; double 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); ganda X = R * 0.649926f + G * 0.103455f + B * 0.197109f; ganda Y = R * 0.234327f + G * 0.743075f + B * 0.022598f; ganda Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; ganda x = X / (X + Y + Z); ganda y = Y / (X + Y + Z); // konversi tidak sepenuhnya selesai, tetapi mungkin cukup baik untuk apa yang ingin kita capai, jadi biarkan di sini dan kirim nilai XY ke lamp: sendtoHue(x, y); } void sendtoHue(double a, double b) {// perubahan warna sebenarnya dari sihir tongkat if (pertama) { //first pass: dapatkan status lampu saat ini getCurrentValues(); }// lalu kirim warna tongkat sihir: // tunggu mantra: tunggu lama; x_ajaib = a; y_ajaib = b; // lampu menyala dengan warna tongkat ajaib: response = ""; int temp = acak (2, 9); const char* status = "benar"; for (int i = 1; i <= temp; i++) { // buat array char untuk dikirim ke bridge: String temp_body1 = "{"on\": " + String(state) + ", \"bri\": 220, \"xy\": [" + String(x_magic) + ", " + String(y_magic) + "], \"transitiontime\": 1}"; int str_len1 = temp_body1.length() + 1; char post_body1[str_len1]; temp_body1.toCharArray(post_body1, str_len1);// sekarang kita memiliki post_body1 sebagai array char; // lakukan panggilan istirahat: int statusCodePut1 = client.put("/api/NAMA PENGGUNA API HUE ANDA/lampu/NOMOR LAMPU ANDA/status", post_body1, &respons); tunggu = acak (100, 600); tunda (tunggu); if (status == "benar") { status = "salah"; } else { keadaan = "benar"; } } // kurangi kecerahan…: response = ""; suhu = acak (4, 17); // buat array char untuk dikirim ke bridge: String temp_body2 = "{"on\": true, \"bri\": 154, \"transitiontime\": " + String(temp) + "}"; int str_len2 = temp_body2.length() + 1; char post_body2[str_len2]; temp_body2.toCharArray(post_body2, str_len2);// sekarang kita memiliki post_body2 sebagai array char; // lakukan panggilan istirahat: int statusCodePut2 = client.put("/api/NAMA PENGGUNA API HUE ANDA/lampu/NOMOR LAMPU ANDA/status", post_body2, &respon); tunggu = acak (1000, 2500); tunda (tunggu); //..dan buat lebih cerah lagi: response = ""; suhu = acak (4, 17); // buat array char untuk dikirim ke bridge: String temp_body3 = "{"bri_inc\": 100, \"transitiontime\": }"; int str_len3 = temp_body3.length() + 1; char post_body3[str_len3]; temp_body3.toCharArray(post_body3, str_len3);// sekarang kita memiliki post_body3 sebagai array char; // lakukan panggilan istirahat: int statusCodePut3 = client.put("/api/NAMA PENGGUNA API HUE ANDA/lampu/NOMOR LAMPU ANDA/status", post_body3, &respons); tunggu = acak (2500, 5000); // tunggu 2-5 detik delay(tunggu);//dan kembali ke nilai lama: response = ""; // buat array char untuk dikirim ke bridge: String temp_body4 = "{"on\": " + String(aan_restore) + ", \"bri\": " + String(bri_restore) + ", \"xy\": [" + String(x_restore) + ", " + String(y_restore) + "], \"waktu transisi\": " + String(20) + "}"; int str_len4 = temp_body4.length() + 1; char post_body4[str_len4]; temp_body4.toCharArray(post_body4, str_len4);// sekarang kita memiliki post_body4 sebagai array char; // lakukan panggilan istirahat: int statusCodePut4 = client.put("/api/NAMA PENGGUNA API HUE ANDA/lampu/NOMOR LAMPU ANDA/status", post_body4, &respons); ESP.tidur nyenyak(0); //tidur lagi…. } unsigned int getCurrentValues() { connectWifi();// pertama sambungkan ke Wifi response = ""; // lakukan panggilan istirahat: int statusCodeGet = client.get("/api/NAMA PENGGUNA API HUE ANDA/lampu/NOMOR CAHAYA ANDA", &respon); Serial.print("Kode status dari server setelah GET: "); Serial.println(statusCodeGet); Serial.print("Badan tanggapan dari server: "); Serial.println(tanggapan); StaticJsonBuffer jsonBuffer; // Mengurai respons Json // Root dari pohon objek. // // Ini adalah referensi ke JsonObject, byte sebenarnya ada di dalam // jsonBuffer dengan semua node lain dari pohon objek. // Memori dibebaskan ketika jsonBuffer keluar dari ruang lingkup. JsonObject& root = jsonBuffer.parseObject(respon); JsonObject& state = root["state"];// Uji apakah penguraian berhasil. if (!root.success()) { Serial.println("parseObject() gagal"); } // Ambil nilai. aan_restore = status["aktif"]; Serial.println(aan_restore); bri_restore = status["bri"]; x_restore = status["xy"][0]; y_restore = status["xy"][1]; first = false;} void connectWifi() { //Inisialisasi lokal. Setelah bisnisnya selesai, tidak perlu menyimpannya di sekitar WiFiManager wifiManager; //reset pengaturan - untuk pengujian: //wifiManager.resetSettings(); //set callback yang dipanggil saat koneksi ke WiFi sebelumnya gagal, dan masuk ke mode Access Point wifiManager.setAPCallback(configModeCallback); //mengambil ssid dan meneruskan dan mencoba untuk terhubung //jika tidak terhubung, itu memulai titik akses dengan nama yang ditentukan //di sini "AutoConnectAP" //dan masuk ke loop pemblokiran menunggu konfigurasi jika (!wifiManager.autoConnect()) { Serial.println("gagal terhubung dan mencapai batas waktu"); //reset dan coba lagi, atau mungkin ubah ke deep sleep ESP.reset(); penundaan (1000); } //jika sudah sampai disini berarti sudah terhubung ke Serial WiFi.println("connected…yeey:)"); Serial.print("Tersambung ke: "); Serial.println(WiFi. SSID()); Serial.print("Alamat IP: "); Serial.println(WiFi.localIP()); //Alamat IP yang ditetapkan untuk ESP (Wemos) Anda // cetak kekuatan sinyal yang diterima: long rssi = WiFi. RSSI(); Serial.print("kekuatan sinyal (RSSI):"); Serial.println(rssi); } void configModeCallback (WiFiManager * myWiFiManager) { Serial.println("Masuk mode konfigurasi"); Serial.println(WiFi.softAPIP()); //jika Anda menggunakan SSID yang dibuat secara otomatis, cetak Serial.println(myWiFiManager->getConfigPortalSSID()); }

Direkomendasikan: