Cuprins:

Hue Magic: 4 pași (cu imagini)
Hue Magic: 4 pași (cu imagini)

Video: Hue Magic: 4 pași (cu imagini)

Video: Hue Magic: 4 pași (cu imagini)
Video: Waterfall Scenery Drawing Easy || Easy Scenery Drawing || Waterfall scenery drawing step by step 2024, Iunie
Anonim
Image
Image

Bun venit vrăjitori!

Acum câteva luni am creat o mică cutie magică cu baghetă pentru fiul meu de 3 ani. Când atinge cutia cu bagheta, o lumină colorată în schimbare va începe să emită din cutie. Când vede o culoare care îi place în mod deosebit, poate îndrepta bagheta către lampa de masă (cu un bec Philips Hue înăuntru), poate arunca o vrajă și culoarea din cutie va sări magic la lampă! Lampa și lumina din cutie au brusc aceeași culoare …

După câteva secunde, culoarea dispare și lampa de masă revine la starea sa înainte de vraja. Până la lansarea unei noi vraji …

Pasul 1: De ce aveți nevoie pentru a crea acest proiect

De ce aveți nevoie pentru a crea acest proiect
De ce aveți nevoie pentru a crea acest proiect
De ce aveți nevoie pentru a crea acest proiect
De ce aveți nevoie pentru a crea acest proiect
De ce aveți nevoie pentru a crea acest proiect
De ce aveți nevoie pentru a crea acest proiect

Pentru a crea acest proiect, veți avea nevoie de următoarele materiale:

    • 1 (sau mai multe) bec color Philips Hue și un Hue Bridge
    • 1 Wemos D1 mini sau un microcontroler similar bazat pe esp8266
    • 1 senzor tactil (Arduino) (de ex. TTP223R)
    • 1 buton momentan (Arduino)
    • 1 condensator 10uF
    • 1 LED RGB (tip anod comun)
    • 5 rezistențe (10, 22 și 47 Ohm, 2x 10K Ohm)
    • 2 PCB mici de prototipare (2x3 inch sau aproximativ 5x7 cm ar trebui să fie suficient de mari)
    • unele fire (jumper)
    • un fier de lipit
    • o baghetă magică (poate fi cumpărată ca gata făcută într-un magazin de jucării sau o puteți face singură)
    • o cutie mică din carton sau lemn (poate fi o cutie existentă, dar poți construi și o cutie de la zero, desigur)
    • niște bandă
    • niște lipici și / sau piulițe și șuruburi pentru a monta PCB-urile în cutie.
    • opțional: hârtie de ambalat pentru cutie

NB: O mică experiență în citirea diagramelor de circuite este utilă atunci când parcurgeți acest instructable. Diagrama mea nu este prea complexă: dacă puteți diferenția un condensator de un rezistor, probabil că veți fi bine.

Câteva experiențe cu programarea Arduino folosind Arduino IDE sunt de asemenea utile. Experiența de bază ar trebui să fie suficientă, deoarece vă voi oferi codul complet pentru copiere / lipire. Totuși, va trebui să adaptați câteva lucruri, pentru ca acesta să funcționeze în configurația dvs. particulară (de exemplu, setările de rețea și câteva detalii din configurația dvs. Hue). Dacă sună puțin intimidant, nu vă faceți griji, vă voi ajuta să recuperați toate informațiile de care aveți nevoie.

Pasul 2: Cutia și bagheta

Cutia și bagheta
Cutia și bagheta
Cutia și bagheta
Cutia și bagheta

Primii pași sunt în mod normal cei mai grei, dar nu în acest instructable! Pentru un început ușor, puteți cumpăra doar o baghetă magică dintr-un magazin de jucării, iar pentru cutie puteți reutiliza pur și simplu o cutie mică existentă pe care ați întins-o deja. Doar asigurați-vă că cutia nu este din metal, deoarece aceasta va bloca semnalele wifi și avem nevoie de acestea pentru magie;-).

Când refaceți o cutie existentă, singurul lucru pe care trebuie să-l faceți este să faceți două găuri în partea superioară a cutiei: 1 gaură mică (dimensiunea 5 mm = 0,2 ") pentru ledul RGB și o gaură mai mare (în jur de 12- 14 mm sau aproximativ 0,5 ") pentru senzorul tactil.

Amplasarea exactă a găurilor nu este critică, pur și simplu așezați-le în funcție de simțul dvs. estetic, dar țineți cont de câteva lucruri:

  • Păstrați o anumită distanță între ambele găuri pentru a vă asigura că componentelor care vor fi montate sub găuri (ledul RGB și senzorul tactil) li se permite ambele să ocupe suficient spațiu pentru montare și cablare.
  • Cea mai mare gaură este pentru senzorul tactil. Acest senzor va fi montat chiar sub gaură, astfel încât să poată fi atins (și chiar ușor apăsat) de baghetă. Deci, asigurați-vă că bagheta pe care o cumpărați nu este prea groasă!

Opțional, puteți folosi vopsea (spray) sau hârtie de ambalat și acoperiți plasticul pentru a vă face cutia puțin mai frumoasă și pentru a o proteja de vărsările de alimente și de mâinile murdare.

Dacă acest prim pas este puțin prea ambițios pe placul dvs., vă rugăm să continuați și să creați o cutie și baghetă în întregime de la zero! Există mai multe instrumente care vă vor ajuta să creați o baghetă frumoasă

Indiferent de calea pe care o alegeți, este timpul să explorați interiorul casetei.

Pasul 3: Hardware-ul din interior

Hardware-ul din interior
Hardware-ul din interior
Hardware-ul din interior
Hardware-ul din interior
Hardware-ul din interior
Hardware-ul din interior

Utilizați un fier de lipit pentru a conecta componentele electronice conform schemei de mai sus. Există câteva lucruri cărora trebuie să le acordați o atenție specială:

  • Cablurile dintre Wemos D1 Mini și ledul RGB ar trebui să fie suficient de lungi, astfel încât ledul RGB să poată fi montat în orificiul pe care l-ați făcut în capacul cutiei.
  • Același număr este valabil pentru firele atașate la întrerupătorul momentan și senzorul tactil, deoarece acestea ar trebui să fie accesibile prin cealaltă gaură din capac.
  • Butonul comutatorului momentan ar trebui lipit pe partea inferioară (partea nesensibilă) a senzorului tactil, astfel încât să puteți pune butonul din nou pe comutatorul momentan cu senzorul tactil lipit deasupra (a se vedea imaginea). Senzorul tactil este montat deasupra comutatorului momentan pentru a detecta apăsarea butoanelor efectuată de un deget, caz în care apăsarea butonului va fi ignorată. Numai când butonul este apăsat de bagheta magică (care ar trebui să fie neconductivă, deci plasticul și lemnul sunt în regulă), ciclul magic va începe.
  • Montați butonul momentan cu senzor tactil deasupra, nu prea adânc sub gaura din capac, deoarece trebuie să fie accesibil cu bagheta magică pentru a pune magia în mișcare.
  • Asigurați-vă că respectați polaritatea condensatorului atunci când îl lipiți. Dacă inversați cablurile pozitive și negative, condensatorul va emite probabil fum magic și va pune circuitul într-un somn veșnic.
  • Lipiți, lipiți sau înșurubați suportul bateriei și PCB-urile în poziție. Nu trebuie să fie îngrijit, deoarece nu va fi la vedere. Ar trebui să fie doar dovada căderii.

Pe software!

Pasul 4: Software-ul

Asigurați-vă că aveți cel mai recent editor de software Arduino (gratuit), care poate fi descărcat de la https://www.arduino.cc/en/Main/Software. Pentru a adăuga suport pentru Wemos D1 mini și alte plăci bazate pe ESP8266, urmați pașii următori:

  • După instalare, porniți software-ul Arduino și deschideți fereastra Preferințe.
  • Introduceți https://arduino.esp8266.com/stable/package_esp8266com_index.json în câmpul „Adrese URL suplimentare pentru Board Board”. Puteți adăuga mai multe adrese URL, separându-le cu virgule.
  • Deschideți Managerul plăcilor din Instrumente> Meniul plăcii și instalați platforma esp8266 (și nu uitați să selectați placa ESP8266 din meniul Instrumente> Placă după instalare. „LOLIN (WEMOS) D1 R2 & mini” funcționează cel mai bine pentru Wemos D1 mini v2 și v3 scânduri.

Dacă aveți nevoie de mai mult ajutor pentru instalarea Arduino și configurarea driverelor, puteți consulta

În editorul Arduino, deschideți un fișier nou (Fișier> Nou) și copiați / lipiți codul de mai jos în fereastra care tocmai a fost deschisă. Doar suprascrieți liniile care sunt deja prezente în noua fereastră (configurare nulă și buclă nulă).

Acum sunteți aproape gata, dar va trebui să adaptați câteva bucăți din cod pentru setarea dvs. particulară.

Primul lucru de făcut este să schimbați adresa IP de pe linia 34 (în editorul Arduino liniile de cod sunt numerotate) în adresa ip a podului dvs. Hue. Dacă nu vă cunoașteți adresa IP Hue Bridge, accesați https://discovery.meethue.com/ și adresa IP corectă va apărea imediat în browserul dvs. Adresa IP este numărul punctat care este precedat de „internalipaddress”.

Pentru a comunica cu luminile Hue, va trebui să creați un utilizator API Hue pentru Wemos D1 mini, astfel încât Wemos să poată comunica lumina Hue prin intermediul API Hue. Pentru aceasta, urmați instrucțiunile de la https://developers.meethue.com/develop/get-started-2/ și copiați / lipiți numele de utilizator generat (destul de lung) în fereastra codului Arduino. Trebuie doar să înlocuiți fiecare „NUME DE UTILIZATOR API-UL TĂU HUE” cu numele de utilizator API generat.

Apoi, trebuie să selectați lumina potrivită pentru a schimba culoarea. În API-ul Hue fiecare lumină are un număr, deci trebuie să aflați numărul care corespunde luminii pe care doriți să o utilizați pentru acest proiect. Una dintre cele mai simple modalități de a afla ce număr are o anumită lumină este să descărcați aplicația Hue Viewer pentru Android sau iOS. Înlocuiți textul „NUMĂRUL LUMINOS” cu numărul corect peste tot în fereastra codului Arduino.

Ultimul lucru de făcut este să configurați Wemos pentru a vă conecta la rețeaua dvs. wifi. Acest lucru se face prin încărcarea codului pe Wemos și pe laptopul dvs. comutați la o altă rețea wifi: la „AutoConnectAP”. Browserul dvs. va afișa apoi o pagină în care puteți adăuga SSID (numele) și parola rețelei dvs. wifi pe care controlerul Wemos le va folosi pentru a vă conecta la rețeaua dvs. wifi (și la podul Hue).

NB: Dacă încărcarea codului pe Wemos D1 mini prin USB nu funcționează, poate fi necesar să descărcați un driver pentru cipul USB de pe Wemos. Un driver pentru platforma dvs. (Windows, Mac) poate fi descărcat de la

Acum sunteți pregătiți să vă testați creația!

// ESP8266 Hue Magic Wand // Richard van Kampen - 2018 // Acest cod este testat pe un Wemos D1 mini, dar probabil va funcționa și pe alte plăci de dezvoltare bazate pe ESP8266 // Pentru a adăuga suport pentru Wemos D1 mini și alte plăci ESP8266 în editorul Arduino, urmați pașii următori: // - Porniți Arduino și deschideți fereastra Preferințe. // - Introduceți https://arduino.esp8266.com/stable/package_esp8266com_index.json în câmpul Adrese URL suplimentare pentru Board Board Manager. Puteți adăuga mai multe adrese URL, separându-le cu virgule. // - Deschideți Managerul de placi din meniul Instrumente> Placă și instalați platforma esp8266 (și nu uitați să selectați placa ESP8266 din meniul Instrumente> Placă după instalare). // biblioteci folosite: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Server DNS local utilizat pentru redirecționarea tuturor cererilor către portalul de configurare WiFiManager dacă nu există setări WIFI (SSID, parolă) încă nu a fost setat.. # install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, necesar pentru utilizarea API-ului Philips Hue (consultați https://developers.meethue.com/develop/ nuanță-api /). #include „ArduinoJson.h” // https://github.com/bblanchon/ArduinoJson, necesar pentru a analiza răspunsul Hue API, vă rugăm să instalați versiunea 5.x prin intermediul managerului bibliotecii în Arduino (meniul „Schiță”> Includeți biblioteca> Gestionați Biblioteci> căutați ArduinoJson și schimbați versiunea la cea mai recentă 5.x). Versiunea 6 (în prezent beta) generează o eroare. // variabile și init: Răspuns șir; const int redPin = 13; // pe Wemos acesta este d7 const int greenPin = 12; // pe Wemos acesta este d6 const int bluePin = 14; // pe Wemos acesta este d5 const int touchSensor = 5; // pe Wemos acest este d1 const int activationPin = 4; // pe Wemos aceasta este d2 bool activation = HIGH; atingere bool = LOW; const char * aan_restore; int bri_restore; x_restore dublu; y_restore dublu; x_magic dublu; y_magic dublu; bool first = adevărat; start semnat lungMillis; curent lung semnat Millis; nesemnat lungă durată Millis; RestClient client = RestClient ("192.168.178.23"); // „adresa dvs. Hue Bridge” // Dacă nu cunoașteți adresa IP Hue Bridge, accesați https://discovery.meethue.com și va apărea imediat în browserul dvs. Adresa IP este numărul punctat care este precedat de "internalipaddress" void setup () {analogWriteRange (255); Serial.begin (9600); // Începeți cu LED-ul oprit. pinMode (activationPin, INPUT_PULLUP); pinMode (senzor tactil, INPUT); startMillis = milis (); checkWand (); } void loop () {// nimic de făcut aici, lăsați gol …} void checkWand () {int rgbColour [3]; // Cod culoare RGB de James Harton, https://gist.github.com/jamesotron/766994 // Începeți cu roșu. rgbColour [0] = 255; rgbColour [1] = 0; rgbColour [2] = 0; activation = digitalRead (activationPin); // LOW înseamnă că bagheta este utilizată. touch = digitalRead (touchSensor); // HIGH înseamnă că se folosește degetul în locul baghetei, ceea ce nu ar trebui să fie cazul. while (activare == LOW && touch == LOW) {// Alegeți culorile pentru incrementare și decrementare. for (int decColour = 0; decColour <3; decColour + = 1) {int incColour = decColour == 2? 0: decColour + 1; // = operator ternar, înseamnă: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // fade încrucișat cele două culori. for (int i = 0; i <255; i + = 1) {rgbColour [decColour] - = 1; rgbColour [incColour] + = 1; // întrucât ledul nostru RGB are un anod comun în loc de catod (deci trebuie să ne conectăm la + 3,3V în loc de masă), avem nevoie de valori inverse pentru RGB: int red = 255 - rgbColour [0]; int verde = 255 - rgbColour [1]; int albastru = 255 - rgbColour [2]; analogWrite (redPin, red); analogWrite (greenPin, verde); analogWrite (bluePin, blue); întârziere (8); activation = digitalRead (activationPin); if (activare == HIGH) {// HIGH înseamnă bagheta este ridicată. go stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - startMillis); if (durationMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } else {// pune Wemos în modul sleep: ESP.deepSleep (0); }} void RGBtoxy (int roșu, int verde, int albastru) {// vezi https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = hartă (roșu, 0, 255, 0, 1000); R / = 1000; dublu G = hartă (verde, 0, 255, 0, 1000); G / = 1000; dublu B = hartă (albastru, 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); dublu X = R * 0.649926f + G * 0.103455f + B * 0.197109f; dublu Y = R * 0.234327f + G * 0.743075f + B * 0.022598f; dublu Z = R * 0.0000000f + G * 0.053077f + B * 1.035763f; dublu x = X / (X + Y + Z); dublu y = Y / (X + Y + Z); // conversia nu este complet finalizată, dar probabil suficient de bună pentru ceea ce vrem să realizăm, așa că lăsați-o la aceasta și trimiteți valorile XY la lampă: sendtoHue (x, y); } void sendtoHue (dublu a, dublu b) {// schimbarea reală a culorii din magia baghetei dacă (primul) {// prima trecere: obțineți starea curentă a lămpii getCurrentValues (); } // apoi trimiteți culori de baghetă magică: // așteptați vraja: așteptați mult; x_magic = a; y_magic = b; // lampă aprinsă în culoarea baghetei magice: răspuns = ""; int temp = aleatoriu (2, 9); const char * state = "true"; for (int i = 1; i <= temp; i ++) {// creați un tablou de caractere pentru a trimite la 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); // acum avem post_body1 ca matrice de caractere; // efectuați apel de repaus: int statusCodePut1 = client.put ("/ api / YOUR HUE API NUME DE UTILIZATOR / lights / YOUR LIGHT NUMBER / state", post_body1 și răspuns); wait = aleatoriu (100, 600); întârziere (așteptați); if (state == "true") {state = "false"; } else {state = "true"; }} // reduce luminozitatea …: răspuns = ""; temp = aleatoriu (4, 17); // creați matrice de caractere pentru a trimite la 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); // acum avem post_body2 ca matrice de caractere; // efectuați apel de repaus: int statusCodePut2 = client.put ("/ api / YOUR HUE API NUME DE UTILIZATOR / lights / YOUR LIGHT NUMBER / state", post_body2 și răspuns); wait = random (1000, 2500); întârziere (așteptați); //..și face din nou mai luminos: răspuns = ""; temp = aleatoriu (4, 17); // creați o matrice de caractere pentru a trimite la 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); // acum avem post_body3 ca matrice de caractere; // efectuați apel de odihnă: int statusCodePut3 = client.put ("/ api / YOUR HUE API USERNAME / lights / YOUR LIGHT NUMBER / state", post_body3 și răspuns); wait = random (2500, 5000); // așteptați 2-5 secunde întârziere (așteptați); // și reveniți la valoarea veche: răspuns = ""; // creați matrice de caractere pentru a trimite la bridge: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": ["+ String (x_restore) +", "+ String (y_restore) +"], / "transitiontime \": "+ String (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // acum avem post_body4 ca matrice de caractere; // efectuați apel de odihnă: int statusCodePut4 = client.put ("/ api / YOUR HUE API USERNAME / lights / YOUR LIGHT NUMBER / state", post_body4 și răspuns); ESP.deepSleep (0); // să mă culc din nou …. } unsigned int getCurrentValues () {connectWifi (); // conectează-te mai întâi la răspunsul Wifi = ""; // efectuați apel de odihnă: int statusCodeGet = client.get ("/ api / YOUR HUE API USERNAME / lights / YOUR LIGHT NUMBER", & răspuns); Serial.print ("Cod de stare de pe server după GET:"); Serial.println (statusCodeGet); Serial.print ("Corpul de răspuns de la server:"); Serial.println (răspuns); StaticJsonBuffer jsonBuffer; // Analizarea răspunsului Json // Rădăcina arborelui obiectului. // // Este o referință la JsonObject, octeții reali se află în // jsonBuffer cu toate celelalte noduri ale arborelui obiectului. // Memoria este eliberată când jsonBuffer iese din domeniul de aplicare. JsonObject & root = jsonBuffer.parseObject (răspuns); JsonObject & state = root ["state"]; // Testează dacă analiza reușește. if (! root.success ()) {Serial.println ("parseObject () a eșuat"); } // Obține valorile. aan_restore = state ["on"]; Serial.println (aan_restore); bri_restore = state ["bri"]; x_restore = state ["xy"] [0]; y_restore = state ["xy"] [1]; first = false;} void connectWifi () {// Intializare locală. Odată ce afacerea sa este terminată, nu este nevoie să o păstrați în jurul WiFiManager wifiManager; // resetare setări - pentru testare: //wifiManager.resetSettings (); // setează apelul care este apelat la conectarea la WiFi-ul anterior eșuează și intră în modul punct de acces wifiManager.setAPCallback (configModeCallback); // preia ssid și pass și încearcă să se conecteze // dacă nu se conectează pornește un punct de acces cu numele specificat // aici „AutoConnectAP” // și intră într-o buclă de blocare în așteptarea configurării if (! wifiManager.autoConnect ()) {Serial.println ("nu s-a putut conecta și a expirat"); // resetați și încercați din nou, sau poate puneți-l în somn profund ESP.reset (); întârziere (1000); } // dacă ajungi aici te-ai conectat la WiFi Serial.println („conectat … yeey:)”); Serial.print ("Conectat la:"); Serial.println (WiFi. SSID ()); Serial.print („Adresă IP:”); Serial.println (WiFi.localIP ()); // Adresa IP atribuită ESP-ului dvs. (Wemos) // tipăriți puterea semnalului primit: rssi lung = WiFi. RSSI (); Serial.print ("puterea semnalului (RSSI):"); Serial.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Mod de configurare introdus"); Serial.println (WiFi.softAPIP ()); // dacă ați utilizat SSID generat automat, imprimați-l Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Recomandat: