Sadržaj:

Hue Magic: 4 koraka (sa slikama)
Hue Magic: 4 koraka (sa slikama)

Video: Hue Magic: 4 koraka (sa slikama)

Video: Hue Magic: 4 koraka (sa slikama)
Video: КОНЕЦ МУЧЕНИЯМ. Трава больше не проблема! 2024, Rujan
Anonim
Image
Image

Dobro došli čarobnjaci!

Prije par mjeseci stvorio sam malu čarobnu kutiju sa štapićem za svog trogodišnjeg sina. Kad dodirne kutiju štapićem, svjetlo u promjenjivoj boji počet će emitirati iz kutije. Kad vidi boju koja mu se posebno sviđa, može usmjeriti štapić prema stolnoj svjetiljci (s žaruljom Philips Hue unutra), začarati i boja iz kutije će čarobno skočiti do svjetiljke! Svjetiljka i svjetlo iz kutije odjednom imaju istu boju …

Nakon nekoliko sekundi boja nestaje i stolna lampa se vraća u stanje prije uroka. Dok se ne baci nova čarolija …

Korak 1: Što vam je potrebno za izradu ovog projekta

Što vam je potrebno za izradu ovog projekta
Što vam je potrebno za izradu ovog projekta
Što vam je potrebno za izradu ovog projekta
Što vam je potrebno za izradu ovog projekta
Što vam je potrebno za izradu ovog projekta
Što vam je potrebno za izradu ovog projekta

Za izradu ovog projekta trebat će vam sljedeći materijali:

    • 1 (ili više) žarulja u boji Philips Hue i most Hue
    • 1 Wemos D1 mini ili sličan mikrokontroler zasnovan na esp8266
    • 1 (Arduino) osjetnik na dodir (npr. TTP223R)
    • 1 (Arduino) trenutni gumb
    • 1 10uF kondenzator
    • 1 RGB LED (uobičajena vrsta anode)
    • 5 otpornika (10, 22 i 47 Ohm, 2x 10K Ohm)
    • 2 mala prototipna PCB -a (2x3 inča ili oko 5x7 cm trebaju biti dovoljno veliki)
    • neke (kratkospojne) žice
    • lemilica
    • čarobni štapić (može se kupiti kao gotov u trgovini igračkama ili ga možete sami izraditi)
    • mala kutija od kartona ili drva (može biti postojeća, ali možete napraviti i kutiju od nule, naravno)
    • neka traka
    • malo ljepila i/ili matica i vijaka za postavljanje PCB -a u kutiju.
    • po izboru: papir za omatanje kutije

Napomena: Malo iskustva u čitanju shema kola korisno je prilikom prolaska kroz ovu uputu. Moj dijagram nije pretjerano složen: ako možete razlikovati kondenzator od otpornika, vjerojatno ćete biti u redu.

Neko iskustvo s Arduino programiranjem pomoću Arduino IDE -a također je korisno. Prije bi vam trebalo biti dovoljno osnovnog iskustva jer ću vam dostaviti cijeli kôd za kopiranje/lijepljenje. Morat ćete ipak prilagoditi nekoliko stvari kako bi funkcionirao u vašim posebnim postavkama (npr. Vaše mrežne postavke i neke pojedinosti iz konfiguracije Hue). Ako ovo zvuči pomalo zastrašujuće, ne brinite, pomoći ću vam da pronađete sve potrebne podatke.

Korak 2: Kutija i štapić

Kutija i štapić
Kutija i štapić
Kutija i štapić
Kutija i štapić

Prvi koraci su obično najteži, ali ne u ovom uputstvu! Za lak početak, možete jednostavno kupiti čarobni štapić u trgovini igračkama, a za kutiju možete jednostavno ponovno upotrijebiti postojeću malu kutiju oko koje ste već ležali. Samo pazite da kutija nije od metala jer će to blokirati wifi signale, a oni su nam potrebni za čaroliju;-).

Kad ponovno namjeravate postojeću kutiju, jedino što trebate učiniti je napraviti dvije rupe na vrhu kutije: 1 mala rupa (veličina 5 mm = 0,2 ") za RGB LED i veća rupa (oko 12- 14 mm ili oko 0,5 ") za osjetnik na dodir.

Točan položaj rupa nije kritičan, samo ih postavite prema svom osjećaju za estetiku, ali imajte na umu nekoliko stvari:

  • Držite određenu udaljenost između obje rupe kako biste bili sigurni da komponente koje će biti postavljene ispod rupa (LED dioda RGB i osjetnik na dodir) mogu zauzeti dovoljno prostora za montažu i ožičenje.
  • Najveća rupa je za osjetnik na dodir. Ovaj će senzor biti postavljen odmah ispod rupe, na način da ga štapić može dodirnuti (pa čak i lagano pritisnuti). Zato pazite da štapić koji kupite nije previše gust!

Po želji možete upotrijebiti (raspršiti) boju ili papir za omatanje te pokriti plastiku kako biste svoju kutiju učinili malo ljepšom i zaštitili je od prosipanja hrane i prljavih ruku.

Ako vam je ovaj prvi korak previše neambiciozan, samo naprijed stvorite kutiju i štapić u potpunosti od nule! Postoji nekoliko instrukcija koje vam mogu pomoći da stvorite prekrasan štapić

Koji god put odabrali, vrijeme je da istražite unutrašnjost kutije.

Korak 3: Hardver iznutra

Hardver iznutra
Hardver iznutra
Hardver iznutra
Hardver iznutra
Hardver iznutra
Hardver iznutra

Za spajanje elektroničkih komponenti koristite lemilicu prema gornjoj shemi kola. Postoji nekoliko stvari na koje treba obratiti posebnu pozornost:

  • Žice između Wemos D1 Mini i RGB vodilice trebale bi biti dovoljno dugačke da se RGB vodilica može montirati u rupu koju ste napravili na poklopcu kutije.
  • Isto se računa i za žice pričvršćene na trenutni prekidač i osjetnik na dodir jer bi im trebalo pristupiti kroz drugu rupu na poklopcu.
  • Gumb prekidača za trenutak mora biti zalijepljen na donju stranu (neosjetljivu stranu) osjetnika na dodir, na takav način da možete vratiti gumb na prekidač za trenutak sa osjetnikom za dodir zalijepljenim na vrhu (vidi sliku). Senzor dodira je montiran na vrhu trenutnog prekidača kako bi otkrio pritiske tipki prstom, u tom slučaju pritisak na gumb će se zanemariti. Čarobni ciklus će započeti tek kad gumb pritisne čarobni štapić (koji bi trebao biti neprovodljiv, pa su plastika i drvo u redu).
  • Postavite trenutačni gumb sa senzorom dodira na vrh, ne previše duboko ispod otvora na poklopcu, jer mora biti dostupan čarobnim štapićem da bi pokrenuo magiju.
  • Prilikom lemljenja pazite na polaritet kondenzatora. Ako promijenite pozitivne i negativne vodiče, kondenzator će vjerojatno ispustiti čarobni dim i staviti vaš krug u vječni san.
  • Zalijepite, zalijepite i / ili pričvrstite držač baterije i PCB -e na mjesto. Ne mora biti uredno jer se neće vidjeti. To bi trebao biti samo dokaz ispuštanja.

Prijeđite na softver!

Korak 4: Softver

Provjerite imate li najnoviji (besplatni) uređivač softvera Arduino koji se može preuzeti na https://www.arduino.cc/en/Main/Software. Da biste dodali podršku za Wemos D1 mini i druge ploče zasnovane na ESP8266, poduzmite sljedeće korake:

  • Nakon instalacije pokrenite Arduino softver i otvorite prozor Postavke.
  • Unesite https://arduino.esp8266.com/stable/package_esp8266com_index.json u polje "Dodatni URL -ovi upravitelja ploče". Možete dodati više URL -ova, odvajajući ih zarezima.
  • Otvorite Upravitelj ploča iz Alati> Izbornik ploče i instalirajte esp8266 platformu (i ne zaboravite odabrati svoju ESP8266 ploču iz Alati> Izbornik ploče nakon instalacije. "LOLIN (WEMOS) D1 R2 & mini" najbolje radi za Wemos D1 mini v2 i v3 daske.

Ako vam je potrebna dodatna pomoć pri instaliranju Arduina i postavljanju upravljačkih programa, možete pogledati

U Arduino uređivaču otvorite novu datoteku (Datoteka> Novo) i kopirajte/zalijepite donji kôd u prozor koji se upravo otvorio. Samo prepišite redove koji su već prisutni u novom prozoru (void setup i void loop).

Sada ste gotovo spremni, ali ćete morati prilagoditi nekoliko dijelova koda za svoje postavljanje.

Prvo što trebate učiniti je promijeniti IP adresu u retku 34 (u Arduino uređivaču redovi koda su numerirani) u IP adresu vašeg Hue mosta. Ako ne znate svoju IP adresu Hue Bridge, posjetite https://discovery.meethue.com/ i desna IP adresa odmah će se pojaviti u vašem pregledniku. IP adresa je točkasti broj kojem prethodi "internalipaddress".

Za komunikaciju s Hue svjetlima morat ćete stvoriti korisnika Hue API -ja za Wemos D1 mini, tako da Wemos može komunicirati s Hue svjetlom putem Hue API -ja. Da biste to učinili, slijedite upute na https://developers.meethue.com/develop/get-started-2/ i kopirajte/zalijepite generirano (prilično dugo) korisničko ime u prozor Arduino koda. Samo zamijenite svakog "VAŠEG HUE API USERNAME" generiranim korisničkim imenom za API.

Zatim morate odabrati pravo svjetlo Hue za promjenu boje. U Hue API -ju svako svjetlo ima broj, pa morate saznati broj koji odgovara svjetlu koje želite koristiti za ovaj projekt. Jedan od najjednostavnijih načina da saznate koji broj ima određena svjetlost je preuzimanje Hue Viewer aplikacije za Android ili iOS. Zamijenite tekst "VAŠ SVJETLOSNI BROJ" ispravnim brojem svugdje u prozoru Arduino koda.

Posljednje što trebate učiniti je postaviti Wemos za povezivanje s vašom WiFi mrežom. To se postiže učitavanjem koda na Wemos i na prijenosnom računalu prebacite se na drugu WiFi mrežu: na "AutoConnectAP". Vaš preglednik će tada prikazati stranicu na kojoj možete dodati SSID (naziv) i lozinku svoje WiFi mreže koju će Wemos kontroler koristiti za povezivanje s vašom WiFi mrežom (i na most Hue).

Napomena: Ako prijenos koda na naš Wemos D1 mini putem USB -a ne radi, možda ćete morati preuzeti upravljački program za USB čip na Wemosu. Upravljački program za vašu platformu (Windows, Mac) možete preuzeti na

Sada ste spremni za isprobavanje svoje kreacije!

// ESP8266 Hue Magic Wand // Richard van Kampen - 2018 // Ovaj kôd je testiran na Wemos D1 mini, ali će vjerojatno raditi i na drugim razvojnim pločama baziranim na ESP8266 // Za dodavanje podrške za Wemos D1 mini i druge ploče ESP8266 u Arduino editor, poduzmite sljedeće korake: // - Pokrenite Arduino i otvorite prozor Postavke. // - Unesite https://arduino.esp8266.com/stable/package_esp8266com_index.json u polje Dodatni URL -ovi upravitelja ploče. Možete dodati više URL -ova, odvajajući ih zarezima. // - Otvorite Upravitelj ploča na izborniku Alati> Izbornik ploče i instalirajte platformu esp8266 (i ne zaboravite odabrati svoju ploču ESP8266 u izborniku Alati> Ploča nakon instalacije). // korištene knjižnice: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Lokalni DNS poslužitelj koji se koristi za preusmjeravanje svih zahtjeva na konfiguracijski portal WiFiManager ako nema postavki WIFI -a (SSID, lozinka) još nije postavljeno. #include "ESP8266WebServer.h" // Lokalni WebServer koji je služio za posluživanje konfiguracijskog portala WiFiManager #include "WiFiManager.h" // WiFi Configuration Magic knjižnica, ako još nije instalirana, pogledajte https://github.com/tzapu/WiFiManager #install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, potrebno za korištenje API-ja Philips Hue (pogledajte https://developers.meethue.com/develop/ nijansa-api/). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, potrebno za analizu Hue API odgovora, instalirajte verziju 5.x putem upravitelja knjižnice u Arduinu (izbornik "Sketch"> Include Library> Manage Knjižnice> potražite ArduinoJson i promijenite verziju na najnoviji 5.x). Verzija 6 (trenutno u beta verziji) prikazuje pogrešku. // varijable i init: String response; const int redPin = 13; // na Wemosu ovo je d7 const int greenPin = 12; // na Wemosu ovo je d6 const int bluePin = 14; // na Wemosu je ovo d5 const int touchSensor = 5; // na Wemosu ovo je d1 const int aktivacijaPin = 4; // na Wemosu je ovo d2 bool aktivacija = HIGH; bool touch = LOW; const char* aan_restore; int bri_restore; dvostruko x_restore; dvostruko y_restore; dvostruka x_magic; dvostruka y_magija; bool prvi = istina; nepotpisani dugi startMillis; nepotpisana duga strujaMillis; nepotpisano dugo trajanjeMillis; RestClient klijent = RestClient ("192.168.178.23"); // "vaša IP adresa Hue Bridge" // Ako ne znate svoju Hue Bridge IP adresu, posjetite https://discovery.meethue.com i ona će se odmah pojaviti u vašem pregledniku. IP adresa je točkasti broj kojem prethodi "internalipaddress" void setup () {analogWriteRange (255); Serial.begin (9600); // Počnite s isključenim LED -om. pinMode (activationPin, INPUT_PULLUP); pinMode (osjetnik na dodir, ULAZ); startMillis = millis (); checkWand (); } void loop () {// ovdje nema što raditi, ostavite prazno…} void checkWand () {int rgbColour [3]; // RGB kod boje James Harton, https://gist.github.com/jamesotron/766994 // Počnite s crvenom bojom. rgbBoja [0] = 255; rgbColour [1] = 0; rgbColour [2] = 0; activation = digitalRead (activationPin); // LOW znači da se koristi štapić. touch = digitalRead (touchSensor); // HIGH znači da se umjesto štapića koristi prst, što ne bi trebao biti slučaj. while (aktivacija == LOW && touch == LOW) {// Odaberite boje za povećanje i smanjivanje. for (int decColour = 0; decColour <3; decColour += 1) {int incColour = decColour == 2? 0: decColour + 1; // = trostruki operator, znači: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // unakrsno blijedi dvije boje. za (int i = 0; i <255; i += 1) {rgbColour [decColour] -= 1; rgbColour [incColour] += 1; // budući da naš RGB LED ima zajedničku anodu umjesto katode (tako da se moramo spojiti na +3,3 V umjesto uzemljenja), potrebne su nam inverzne vrijednosti za RGB: int red = 255 - rgbColour [0]; int zelena = 255 - rgbColour [1]; int plava = 255 - rgbColour [2]; analogWrite (redPin, crveno); analogWrite (greenPin, zeleno); analogWrite (bluePin, plavo); kašnjenje (8); activation = digitalRead (activationPin); if (aktivacija == HIGH) {// HIGH znači da je štapić podignut. goto stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - početakMillis); if (durationMillis> 1000) {RGBtoksi (rgbColour [0], rgbColour [1], rgbColour [2]); } else {// stavimo Wemos u stanje mirovanja: ESP.deepSleep (0); }} void RGBtoxy (int red, int green, int blue) {// pogledajte https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = karta (crveno, 0, 255, 0, 1000); R /= 1000; dvostruki G = karta (zelena, 0, 255, 0, 1000); G /= 1000; dvostruki B = karta (plava, 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); dvostruki X = R * 0,649926f + G * 0,103455f + B * 0,197109f; dvostruki Y = R * 0,234327f + G * 0,743075f + B * 0,022598f; dvostruki Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; dvostruko x = X / (X + Y + Z); dvostruko y = Y / (X + Y + Z); // pretvorba nije do kraja dovršena, ali vjerojatno dovoljno dobra za ono što želimo postići, pa ostavite to na ovom mjestu i pošaljite XY vrijednosti lampi: sendtoHue (x, y); } void sendtoHue (double a, double b) {// stvarna promjena boje iz čarobne štapića if (first) {// first pass: get current lamp lamp getCurrentValues (); } // zatim pošaljite čarobne boje štapića: // čekajte čaroliju: long wait; x_magic = a; y_magic = b; // lampica uključena u boji čarobnog štapića: response = ""; int temp = slučajno (2, 9); const char* stanje = "istina"; for (int i = 1; i <= temp; i ++) {// stvoriti niz znakova za slanje na most: String temp_body1 = "{" on / ":" + String (stanje) + ", \" bri / ": 220, / "xy \": [" + niz (x_magic) +", " + niz (y_magic) +"], / "prijelazno vrijeme \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // sada imamo post_body1 kao niz znakova; // poziv za odmor: int statusCodePut1 = client.put ("/api/VAŠ HUE API KORISNIK/svjetla/VAŠ BROJ SVJETLA/stanje", post_body1, & odgovor); čekanje = slučajno (100, 600); odgoda (čekanje); if (stanje == "istina") {stanje = "lažno"; } else {state = "true"; }} // smanji svjetlinu …: response = ""; temp = slučajno (4, 17); // stvoriti niz znakova za slanje na 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); // sada imamo post_body2 kao niz znakova; // napravi poziv za odmor: int statusCodePut2 = client.put ("/api/VAŠ HUE API KORISNIK/svjetla/VAŠ BROJ SVJETLA/stanje", post_body2 i odgovor); čekanje = slučajno (1000, 2500); odgoda (čekanje); //..i ponovno posvijetliti: response = ""; temp = slučajno (4, 17); // stvoriti niz znakova za slanje na most: String temp_body3 = "{" bri_inc / ": 100, \" tranzicijsko vrijeme / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // sada imamo post_body3 kao niz znakova; // poziv za odmor: int statusCodePut3 = client.put ("/api/VAŠ HUE API KORISNIK/svjetla/VAŠ BROJ SVJETLA/stanje", post_body3, & odgovor); wait = random (2500, 5000); // čekanje 2-5 sekundi odgode (čekanje); // i povratak na staru vrijednost: response = ""; // stvoriti niz znakova za slanje na most: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": [" + String (x_restore) +", " + String (y_restore) +"], / "tranzitiontime": " + String (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // sada imamo post_body4 kao niz znakova; // poziv za odmor: int statusCodePut4 = client.put ("/api/VAŠ HUE API KORISNIK/svjetla/VAŠ BROJ SVJETLA/stanje", post_body4, & odgovor); ESP.deepSleep (0); // ponovno zaspati…. } unsigned int getCurrentValues () {connectWifi (); // prvo se povežite na Wifi odgovor = ""; // uputite poziv na odmor: int statusCodeGet = client.get ("/api/VAŠ HUE API USERNAME/lights/YOUR LIGHT NUMBER", & response); Serial.print ("Kôd statusa s poslužitelja nakon GET:"); Serial.println (statusCodeGet); Serial.print ("Tijelo odgovora s poslužitelja:"); Serial.println (odgovor); StaticJsonBuffer jsonBuffer; // Raščlanjivanje Jsonovog odgovora // Korijen stabla objekta. // // To je referenca na JsonObject, stvarni bajti su unutar // jsonBuffer sa svim ostalim čvorovima stabla objekata. // Memorija se oslobađa kada jsonBuffer izađe iz opsega. JsonObject & root = jsonBuffer.parseObject (odgovor); JsonObject & state = root ["state"]; // Testira je li raščlanjivanje uspješno. if (! root.success ()) {Serial.println ("parseObject () nije uspio"); } // Dohvaćanje vrijednosti. aan_restore = stanje ["uključeno"]; Serial.println (aan_restore); bri_restore = stanje ["bri"]; x_restore = stanje ["xy"] [0]; y_restore = stanje ["xy"] [1]; first = false;} void connectWifi () {// Lokalna inicijalizacija. Nakon što posao završi, nema potrebe držati ga u blizini WiFiManager wifiManager; // resetiranje postavki - za testiranje: //wifiManager.resetSettings (); // postavlja povratni poziv koji se poziva pri povezivanju s prethodnom WiFi mrežom ne uspije i ulazi u način pristupne točke wifiManager.setAPCallback (configModeCallback); // dohvaća ssid i pass i pokušava se povezati // ako se ne poveže, pokreće pristupnu točku s navedenim imenom // ovdje "AutoConnectAP" // i odlazi u petlju blokiranja koja čeka konfiguraciju if (! wifiManager.autoConnect ()) {Serial.println ("povezivanje nije uspjelo i vrijeme čekanja je hit"); // resetirati i pokušati ponovo, ili možda staviti u duboki san ESP.reset (); kašnjenje (1000); } // ako dođete ovdje, spojili ste se na WiFi Serial.println ("spojen … yeey:)"); Serial.print ("Povezano s:"); Serial.println (WiFi. SSID ()); Serial.print ("IP adresa:"); Serial.println (WiFi.localIP ()); // IP adresa dodijeljena vašem ESP -u (Wemos) // ispišite jačinu primljenog signala: long rssi = WiFi. RSSI (); Serial.print ("snaga signala (RSSI):"); Serial.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Unesen način konfiguracije"); Serial.println (WiFi.softAPIP ()); // ako ste koristili automatski generirani SSID, ispišite ga Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Preporučeni: