Kazalo:

Hue Magic: 4 koraki (s slikami)
Hue Magic: 4 koraki (s slikami)

Video: Hue Magic: 4 koraki (s slikami)

Video: Hue Magic: 4 koraki (s slikami)
Video: ЮЛЯ ФИНЕСС: Как я вышла с 8 этажа! Групповое изнасилование под мефедроном, психиатрическая больница 2024, Junij
Anonim
Image
Image

Dobrodošli čarovniki!

Pred nekaj meseci sem za svojega 3 -letnega sina ustvaril majhno čarobno škatlo s palico. Ko se s palico dotakne škatle, bo iz škatle začela oddajati spreminjajoča se barvna svetloba. Ko zagleda barvo, ki mu je še posebej všeč, lahko palico pokaže proti namizni svetilki (v njej je žarnica Philips Hue), urok in barva iz škatle bo čarobno skočila do svetilke! Svetilka in luč iz škatle imata nenadoma isto barvo …

Po nekaj sekundah barva zbledi in namizna svetilka se vrne v stanje pred urokom. Dokler ni izdan nov urok …

1. korak: Kaj potrebujete za ustvarjanje tega projekta

Kaj potrebujete za ustvarjanje tega projekta
Kaj potrebujete za ustvarjanje tega projekta
Kaj potrebujete za ustvarjanje tega projekta
Kaj potrebujete za ustvarjanje tega projekta
Kaj potrebujete za ustvarjanje tega projekta
Kaj potrebujete za ustvarjanje tega projekta

Za izdelavo tega projekta potrebujete naslednje materiale:

    • 1 (ali več) barvnih žarnic Philips Hue in most Hue
    • 1 Wemos D1 mini ali podoben mikrokrmilnik na osnovi esp8266
    • 1 (Arduino) senzor na dotik (npr. TTP223R)
    • 1 (Arduino) trenutni gumb
    • 1 10uF kondenzator
    • 1 RGB LED (običajna vrsta anode)
    • 5 uporov (10, 22 in 47 Ohm, 2x 10K Ohm)
    • 2 majhna prototipna tiskana vezja (2x3 palca ali približno 5x7 cm morata biti dovolj velika)
    • nekaj (mostičnih) žic
    • spajkalnik
    • čarobno palico (lahko jo kupite že pripravljeno v trgovini z igračami ali pa jo naredite sami)
    • majhna škatla iz lepenke ali lesa (lahko je že obstoječa, lahko pa jo naredite tudi iz nič)
    • nekaj traku
    • nekaj lepila in/ali matic in vijakov za pritrditev tiskanih vezij v škatlo.
    • neobvezno: ovojni papir za škatlo

Opomba: Nekaj izkušenj pri branju diagramov vezja je v pomoč pri pregledu tega navodila. Moj diagram ni preveč zapleten: če lahko ločite kondenzator od upora, boste verjetno v redu.

Koristne so tudi nekatere izkušnje s programiranjem Arduino z uporabo Arduino IDE. Prej bi morale zadostovati osnovne izkušnje, saj vam bom posredoval celotno kodo za kopiranje/lepljenje. Nekaj stvari boste morali prilagoditi, da bo delovalo v vaši posebni nastavitvi (npr. Nastavitve omrežja in nekatere podrobnosti iz konfiguracije Hue). Če se to sliši malce zastrašujoče, ne skrbite, pomagal vam bom pri pridobivanju vseh potrebnih podatkov.

2. korak: Škatla in palica

Škatla in palica
Škatla in palica
Škatla in palica
Škatla in palica

Prvi koraki so običajno najtežji, vendar ne v tem navodilu! Za lažji začetek lahko preprosto kupite čarobno palico v trgovini z igračami, za škatlo pa preprosto znova uporabite obstoječo majhno škatlo, ki ste jo že ležali. Prepričajte se le, da škatla ni iz kovine, saj bo to blokiralo signale wifi in jih potrebujemo za čarovnijo;-).

Ko znova namestite obstoječo škatlo, morate samo narediti dve luknji na vrhu škatle: 1 majhno luknjo (velikost 5 mm = 0,2 ) za RGB LED in večjo luknjo (približno 12- 14 mm ali približno 0,5 palca) za senzor na dotik.

Natančna postavitev lukenj ni kritična, le postavite jih v skladu s svojim estetskim občutkom, vendar ne pozabite na nekaj stvari:

  • Med obema luknjama se držite nekaj razdalje, da zagotovite, da bodo komponente, ki bodo nameščene pod luknjami (LED RGB in senzor na dotik), zasedle dovolj prostora za montažo in ožičenje.
  • Največja luknja je za senzor na dotik. Ta senzor bo nameščen tik pod luknjo, tako da se ga lahko dotakne (in celo rahlo pritisne) s palico. Zato poskrbite, da palica, ki jo kupujete, ni predebela!

Po želji lahko uporabite (razpršite) barvo ali ovojni papir in pokrijete plastiko, da naredite škatlo nekoliko lepšo in jo zaščitite pred razlitjem hrane in umazanimi rokami.

Če vam je ta prvi korak malo preveč ambiciozen, nadaljujte in ustvarite škatlo in palico v celoti iz nič! Obstaja več navodil, ki vam bodo pomagale ustvariti lepo palico

Ne glede na pot, ki jo izberete, je zdaj čas, da raziščete notranjost škatle.

3. korak: Strojna oprema v notranjosti

Strojna oprema v notranjosti
Strojna oprema v notranjosti
Strojna oprema v notranjosti
Strojna oprema v notranjosti
Strojna oprema v notranjosti
Strojna oprema v notranjosti

Za spajanje elektronskih komponent uporabite spajkalnik v skladu z zgornjo shemo vezja. Posebno pozornost je treba nameniti nekaj stvarem:

  • Žice med Wemos D1 Mini in RGB vodilom morajo biti dovolj dolge, da jih lahko vstavite v luknjo, ki ste jo naredili na pokrovu škatle.
  • Enako velja za žice, pritrjene na stikalo za trenutek in senzor na dotik, saj morajo biti dostopne prek druge luknje na pokrovu.
  • Gumb trenutnega stikala mora biti prilepljen na spodnjo stran (neobčutljiva stran) senzorja na dotik, tako da lahko gumb postavite nazaj na stikalo za trenutek z lepljenim senzorjem na dotik (glejte sliko). Senzor na dotik je nameščen na vrhu trenutnega stikala, da zazna pritisk tipk s prstom, v tem primeru se pritisk na gumb ne upošteva. Šele ko gumb pritisne čarobna palica (ki ne sme biti prevodna, zato sta plastika in les v redu), se bo začel čarobni cikel.
  • Tipkovni gumb s senzorjem na dotik namestite na vrh, ne preveč globoko pod luknjo v pokrovu, ker mora biti dosegljiv s čarobno palico, da se čarovnija sproži.
  • Pri spajkanju pazite na polarnost kondenzatorja. Če obrnete pozitivni in negativni vod, bo kondenzator verjetno oddajal nekaj čarobnega dima in vaše vezje spravil v večni spanec.
  • Lepite, lepite in / ali privijte držalo baterije in tiskano vezje. Ni nujno, da je čeden, saj ga ne bo na vidiku. Moral bi biti le dokaz padca.

Naprej na programsko opremo!

4. korak: programska oprema

Poskrbite, da imate najnovejši (brezplačni) urejevalnik programske opreme Arduino, ki ga lahko prenesete s spletnega mesta https://www.arduino.cc/en/Main/Software. Če želite dodati podporo za Wemos D1 mini in druge plošče na osnovi ESP8266, naredite naslednje:

  • Po namestitvi zaženite programsko opremo Arduino in odprite okno Nastavitve.
  • V polje "Dodatni URL -ji upravitelja upravnega odbora" vnesite https://arduino.esp8266.com/stable/package_esp8266com_index.json. Dodate lahko več URL -jev in jih ločite z vejicami.
  • Odprite upravitelja plošč v meniju Orodja> meni plošče in namestite platformo esp8266 (po namestitvi ne pozabite izbrati plošče ESP8266 v meniju Orodja> meni plošče. "LOLIN (WEMOS) D1 R2 & mini" najbolje deluje za Wemos D1 mini v2 in v3 deske.

Če potrebujete dodatno pomoč pri namestitvi Arduina in nastavitvi gonilnikov, si lahko ogledate

V urejevalniku Arduino odprite novo datoteko (Datoteka> Novo) in kopirajte/prilepite spodnjo kodo v okno, ki se je pravkar odprlo. Preprosto prepišite vrstice, ki so že prisotne v novem oknu (nastavitev praznine in zanka praznine).

Zdaj ste skoraj pripravljeni, vendar boste morali nekaj kode prilagoditi svoji nastavitvi.

Najprej morate spremeniti naslov IP v vrstici 34 (v urejevalniku Arduino so vrstice kode oštevilčene) v naslov IP vašega mostu Hue. Če ne poznate svojega naslova IP Hue Bridge, obiščite https://discovery.meethue.com/ in desni naslov IP se bo takoj prikazal v vašem brskalniku. Naslov IP je črtkana številka, pred katero je "internalipaddress".

Za komunikacijo z lučmi Hue boste morali ustvariti uporabnika API -ja Hue za Wemos D1 mini, tako da lahko Wemos komunicira s svetilko Hue prek API -ja Hue. Če želite to narediti, sledite navodilom na naslovu https://developers.meethue.com/develop/get-started-2/ in kopirajte/prilepite ustvarjeno (precej dolgo) uporabniško ime v okno kode Arduino. Preprosto zamenjajte vsakega "VAŠEGA HUE API USERNAME" z ustvarjenim uporabniškim imenom API.

Nato morate za spremembo barve izbrati pravo Hue svetlobo. V API -ju Hue ima vsaka luč številko, zato morate ugotoviti številko, ki ustreza svetlobi, ki jo želite uporabiti za ta projekt. Eden najlažjih načinov, da ugotovite, katero številko ima določena luč, je prenos aplikacije Hue Viewer za Android ali iOS. Besedilo "VAŠA LUČNA ŠTEVILKA" zamenjajte s pravilno številko povsod v oknu kode Arduino.

Zadnja stvar, ki jo morate narediti, je, da nastavite Wemos za povezavo z vašim brezžičnim omrežjem. To naredite tako, da kodo naložite v Wemos in na prenosnem računalniku preklopite na drugo omrežje wifi: na "AutoConnectAP". Vaš brskalnik bo nato prikazal stran, na kateri lahko dodate SSID (ime) in geslo svojega omrežja wifi, ki ga bo krmilnik Wemos uporabil za povezavo z vašim omrežjem wifi (in mostom Hue).

Opomba: Če nalaganje kode na naš Wemos D1 mini prek USB -ja ne deluje, boste morda morali na Wemos prenesti gonilnik za čip USB. Gonilnik za vašo platformo (Windows, Mac) lahko prenesete na

Zdaj ste pripravljeni na preizkušanje svojega ustvarjanja!

// ESP8266 Hue Magic Wand // Richard van Kampen - 2018 // Ta koda je preizkušena na Wemos D1 mini, verjetno pa bo delovala tudi na drugih razvojnih ploščah na osnovi ESP8266 // Za dodajanje podpore za Wemos D1 mini in druge plošče ESP8266 v urejevalnik Arduino naredite naslednje: // - Zaženite Arduino in odprite okno Nastavitve. // - Vnesite https://arduino.esp8266.com/stable/package_esp8266com_index.json v polje Dodatni URL -ji upravitelja plošč. Dodate lahko več URL -jev in jih ločite z vejicami. // - Odprite upravitelja plošč v meniju Orodja> meni Board in namestite platformo esp8266 (po namestitvi pa ne pozabite izbrati plošče ESP8266 v meniju Tools> menu). // uporabljene knjižnice: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Lokalni strežnik DNS, ki se uporablja za preusmeritev vseh zahtev na konfiguracijski portal WiFiManager, če nima nastavitev WIFI (SSID, geslo) še ni nastavljeno. #include "ESP8266WebServer.h" // Lokalni spletni strežnik, ki je služil za konfiguracijo portala WiFiManager #include "WiFiManager.h" // Čarobna knjižnica konfiguracije WiFi, če še ni nameščena, glejte https://github.com/tzapu/WiFiManager #install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, potreben za uporabo API-ja Philips Hue (glejte https://developers.meethue.com/develop/ odtenek-api/). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, potreben za analizo odziva API -ja Hue, namestite različico 5.x prek upravitelja knjižnice v Arduinu (Meni "Sketch"> Include Library> Manage Knjižnice> poiščite ArduinoJson in spremenite različico na najnovejšo različico 5.x). Različica 6 (trenutno v beta različici) povzroča napako. // spremenljivke in init: odziv niza; const int redPin = 13; // na Wemosu je to d7 const int greenPin = 12; // na Wemosu je to d6 const int bluePin = 14; // na Wemosu je to d5 const int touchSensor = 5; // na Wemosu to je d1 const int activationPin = 4; // na Wemosu je to d2 bool aktivacija = HIGH; bool touch = LOW; const char* aan_restore; int bri_restore; dvojni x_restore; dvojno y_restore; dvojna x_magic; dvojna y_magic; bool najprej = res; brez podpisa dolg začetekMillis; nepodpisani dolgi tokMillis; nepodpisano dolgotrajno Milis; Odjemalec RestClient = RestClient ("192.168.178.23"); // "vaš IP naslov Hue Bridge" // Če ne poznate svojega IP naslova Hue Bridge, obiščite https://discovery.meethue.com in takoj se bo prikazal v vašem brskalniku. Naslov ip je črtkana številka, pred katero je "internalipaddress" void setup () {analogWriteRange (255); Serial.begin (9600); // Začnite z izklopljeno LED diodo. pinMode (activationPin, INPUT_PULLUP); pinMode (senzor dotika, VHOD); startMillis = millis (); checkWand (); } void loop () {// tukaj ni ničesar, pustite prazno…} void checkWand () {int rgbColour [3]; // Barvna koda RGB avtorja James Harton, https://gist.github.com/jamesotron/766994 // Začnite z rdečo. rgbColour [0] = 255; rgbColour [1] = 0; rgbColour [2] = 0; activation = digitalRead (activationPin); // LOW pomeni, da se uporablja palica. touch = digitalRead (touchSensor); // HIGH pomeni, da se namesto palice uporablja prst, kar pa ne bi smelo biti. while (aktivacija == LOW && touch == LOW) {// Izberite barve za povečanje in zmanjšanje. for (int decColour = 0; decColour <3; decColour += 1) {int incColour = decColour == 2? 0: decColour + 1; // = trojni operater, pomeni: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // navzkrižno zbledi dve barvi. za (int i = 0; i <255; i += 1) {rgbColour [decColour] -= 1; rgbColour [incColour] += 1; // ker ima naš LED RGB skupno anodo namesto katode (zato se moramo priključiti na +3,3 V namesto tal), potrebujemo obratno vrednost za RGB: int rdeča = 255 - rgbColour [0]; int zelena = 255 - rgbColour [1]; int modra = 255 - rgbColour [2]; analogWrite (redPin, rdeče); analogWrite (greenPin, zelen); analogWrite (bluePin, modro); zamuda (8); activation = digitalRead (activationPin); if (aktivacija == HIGH) {// HIGH pomeni, da je palica dvignjena. goto stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - začetekMillis); če (durationMillis> 1000) {RGBtoksi (rgbColour [0], rgbColour [1], rgbColour [2]); } else {// preklopite Wemos v način spanja: ESP.deepSleep (0); }} void RGBtoxy (int rdeča, int zelena, int modra) {// glej https://developers.meethue.com/documentation/color-conversions-rgb-xy dvojni R = zemljevid (rdeča, 0, 255, 0, 1000); R /= 1000; dvojni G = zemljevid (zelen, 0, 255, 0, 1000); G /= 1000; dvojni B = zemljevid (modra, 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); dvojni X = R * 0,649926f + G * 0,103455f + B * 0,197109f; dvojni Y = R * 0,234327f + G * 0,743075f + B * 0,022598f; dvojno Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; dvojni x = X / (X + Y + Z); dvojni y = Y / (X + Y + Z); // pretvorba ni v celoti dokončana, vendar verjetno dovolj dobra za tisto, kar želimo doseči, zato pustite pri tem in vrednosti XY pošljite svetilki: sendtoHue (x, y); } void sendtoHue (double a, double b) {// dejanska sprememba barve iz čarobne palice if (first) {// first pass: get current state lamp getCurrentValues (); } // nato pošljite barve čarobne palice: // počakajte na urok: long wait; x_magic = a; y_magic = b; // sveti svetilka v barvi čarobne palice: response = ""; int temp = naključno (2, 9); const char* stanje = "res"; for (int i = 1; i <= temp; i ++) {// ustvarite niz znakov za pošiljanje v most: String temp_body1 = "{" on / ":" + String (stanje) + ", \" bri / ": 220, / "xy \": [" + niz (x_magic) +", " + niz (y_magic) +"], / "prehodni čas \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // zdaj imamo post_body1 kot niz nizov; // pokliči počitek: int statusCodePut1 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body1, & response); čaka = naključno (100, 600); zamuda (čakanje); if (stanje == "res") {stanje = "napačno"; } else {state = "true"; }} // zmanjša svetlost …: response = ""; temp = naključno (4, 17); // ustvari niz nizov za pošiljanje v most: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" tranzitionntime / ":" + String (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // zdaj imamo post_body2 kot niz znakov; // pokliči počitek: int statusCodePut2 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body2, & response); čaka = naključno (1000, 2500); zamuda (čakanje); //..in naredimo svetlejše: response = ""; temp = naključno (4, 17); // ustvari niz nizov za pošiljanje v most: String temp_body3 = "{" bri_inc / ": 100, \" tranzitionntime / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // zdaj imamo post_body3 kot niz znakov; // pokliči počitek: int statusCodePut3 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body3, & response); čaka = naključno (2500, 5000); // počakajte 2-5 sekund zakasnitve (počakajte); // in se vrnite na staro vrednost: response = ""; // ustvari niz znakov za pošiljanje v most: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": [" + Niz (x_restore) +", " + niz (y_restore) +"], / "prehodni čas \": " + niz (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // zdaj imamo post_body4 kot niz nizov; // pokliči počitek: int statusCodePut4 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body4, & response); ESP.deepSleep (0); // grem spet spat …. } unsigned int getCurrentValues () {connectWifi (); // najprej se povežite z odzivom Wifi = ""; // pokliči počitek: int statusCodeGet = client.get ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER", & response); Serial.print ("Koda stanja s strežnika po GET:"); Serial.println (statusCodeGet); Serial.print ("Telo odziva s strežnika:"); Serial.println (odgovor); StaticJsonBuffer jsonBuffer; // Razčlenitev Jsonovega odziva // Koren drevesa objekta. // // To je sklic na JsonObject, dejanski bajti so znotraj // jsonBuffer z vsemi drugimi vozlišči drevesa objekta. // Pomnilnik se sprosti, ko jsonBuffer preseže področje uporabe. JsonObject & root = jsonBuffer.parseObject (odgovor); JsonObject & state = root ["state"]; // Preverite, ali je razčlenitev uspela. if (! root.success ()) {Serial.println ("parseObject () ni uspelo"); } // Pridobite vrednosti. aan_restore = stanje ["vklopljeno"]; Serial.println (aan_restore); bri_restore = stanje ["bri"]; x_restore = stanje ["xy"] [0]; y_restore = stanje ["xy"] [1]; first = false;} void connectWifi () {// Lokalna incializacija. Ko je posel končan, ga ni treba hraniti v bližini WiFiManager wifiManager; // ponastavitev nastavitev - za testiranje: //wifiManager.resetSettings (); // nastavimo povratni klic, ki se pokliče ob neuspešni povezavi s prejšnjo WiFi, in vstopi v način dostopne točke wifiManager.setAPCallback (configModeCallback); // pridobi ssid in pass ter se poskuša povezati // če se ne poveže, zažene dostopno točko z določenim imenom // tukaj "AutoConnectAP" // in gre v zanko za blokiranje, ki čaka na konfiguracijo if (! wifiManager.autoConnect ()) {Serial.println ("povezava ni uspela in časovna omejitev ni uspela"); // ponastavite in poskusite znova ali pa ga postavite v stanje globokega spanja ESP.reset (); zamuda (1000); } // če pridete sem, ste povezani z WiFi Serial.println ("povezan … yeey:)"); Serial.print ("Povezano z:"); Serial.println (WiFi. SSID ()); Serial.print ("IP naslov:"); Serial.println (WiFi.localIP ()); // naslov IP, dodeljen vašemu ESP (Wemos) // natisnite jakost prejetega signala: long rssi = WiFi. RSSI (); Serial.print ("jakost signala (RSSI):"); Serial.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Vnesen način konfiguracije"); Serial.println (WiFi.softAPIP ()); // če ste uporabili samodejno ustvarjen SSID, ga natisnite Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Priporočena: