Tartalomjegyzék:

Hue Magic: 4 lépés (képekkel)
Hue Magic: 4 lépés (képekkel)

Videó: Hue Magic: 4 lépés (képekkel)

Videó: Hue Magic: 4 lépés (képekkel)
Videó: Как придать Объём волосам Пошагово дома | 4 способа Укладки волос! Как научиться укладывать волосы! 2024, Június
Anonim
Image
Image

Isten hozott varázslók!

Pár hónapja készítettem egy kis varázsdobozt pálcával a 3 éves fiamnak. Amikor megérinti a dobozt a pálcával, egy változó színű fény kezd kibocsátani a dobozból. Amikor meglát egy színt, amelyet különösen szeret, az asztali lámpa felé irányíthatja a pálcát (Philips Hue izzóval), varázsolhat, és a doboz színe varázslatosan a lámpára ugrik! A lámpa és a fény a dobozból hirtelen azonos színű lesz…

Néhány másodperc múlva a szín elhalványul, és az asztali lámpa visszatér a varázslat előtti állapotába. Amíg új varázslatot nem adnak…

1. lépés: Amire szüksége van a projekt létrehozásához

Amire szüksége van a projekt létrehozásához
Amire szüksége van a projekt létrehozásához
Amire szüksége van a projekt létrehozásához
Amire szüksége van a projekt létrehozásához
Amire szüksége van a projekt létrehozásához
Amire szüksége van a projekt létrehozásához

A projekt létrehozásához a következő anyagokra lesz szüksége:

    • 1 (vagy több) Philips Hue színű izzó és Hue Bridge
    • 1 Wemos D1 mini vagy hasonló esp8266-alapú mikrovezérlő
    • 1 (Arduino) érintésérzékelő (pl. TTP223R)
    • 1 (Arduino) pillanatnyi gomb
    • 1 10uF kondenzátor
    • 1 RGB led (közös anód típus)
    • 5 ellenállás (10, 22 és 47 Ohm, 2x 10K Ohm)
    • 2 kis prototípus -nyomtatólap (2x3 hüvelyk vagy körülbelül 5x7 cm elég nagynak kell lennie)
    • néhány (jumper) vezeték
    • egy forrasztópáka
    • egy varázspálca (megvásárolható készen a játékboltban, vagy saját maga is elkészítheti)
    • egy kis doboz kartonból vagy fából (lehet egy meglévő doboz, de természetesen építhet egy dobozt a semmiből)
    • valami szalagot
    • néhány ragasztó és/vagy anya és csavar a PCB -k dobozba szereléséhez.
    • opcionális: csomagolópapír a dobozhoz

Megjegyzés: Egy kis tapasztalat a kapcsolási rajzok olvasásában hasznos, ha ezt az utasítást végighaladja. A diagramom nem túl bonyolult: ha meg tudja különböztetni a kondenzátort az ellenállástól, akkor valószínűleg minden rendben lesz.

Néhány tapasztalat az Arduino programozásban az Arduino IDE használatával szintén hasznos. Inkább az alapvető tapasztalatoknak elegendőnek kell lenniük, mivel megadom a teljes kódot a másoláshoz/beillesztéshez. Néhány dolgot azonban módosítania kell, hogy működjön az adott beállításban (például a hálózati beállítások és a Hue konfiguráció néhány részlete). Ha ez kissé megfélemlítőnek hangzik, ne aggódjon, segítek Önnek lekérni az összes szükséges információt.

2. lépés: A doboz és pálca

A doboz és pálca
A doboz és pálca
A doboz és pálca
A doboz és pálca

Az első lépések általában a legnehezebbek, de nem ebben a tanulságosban! A könnyű kezdés érdekében vásároljon egy varázspálcát a játékboltból, és a dobozhoz egyszerűen használhatja újra a meglévő kis dobozt, amelyet már hevert. Csak győződjön meg arról, hogy a doboz nem fémből készült, mivel ez blokkolja a wifi jeleket, és ezekre szükségünk van a varázslathoz;-).

Egy meglévő doboz újbóli rendeltetésénél csak annyit kell tennie, hogy két lyukat készít a doboz tetején: 1 kis lyuk (5 mm = 0,2 ") az RGB led számára és egy nagyobb lyuk (kb. 14 mm vagy körülbelül 0,5 ") az érintésérzékelő számára.

A lyukak pontos elhelyezése nem kritikus, csak helyezze őket esztétikai érzékének megfelelően, de tartsa szem előtt néhány dolgot:

  • Tartson bizonyos távolságot a két lyuk között, hogy megbizonyosodjon arról, hogy a lyukak alá szerelt alkatrészek (az RGB led és az érintésérzékelő) elegendő helyet foglalnak el a szereléshez és a huzalozáshoz.
  • A legnagyobb lyuk az érintésérzékelő. Ezt az érzékelőt közvetlenül a lyuk alá kell felszerelni, oly módon, hogy a pálca megérintse (és kissé le is nyomja). Ezért ügyeljen arra, hogy a vásárolt pálca ne legyen túl vastag!

Opcionálisan (spray) festékkel vagy csomagolópapírral és műanyag borítóval is szebbé teheti a dobozát, és megvédheti azt az élelmiszer -kiömléstől és a piszkos kezeitől.

Ha ez az első lépés egy kicsit túlságosan ambiciózus az Ön ízlése szerint, kérem, készítsen egy dobozt és pálcát teljesen a semmiből! Számos utasítás létezik, amelyek segítenek egy gyönyörű pálca létrehozásában

Bármelyik utat is választja, itt az ideje, hogy felfedezze a doboz belsejét.

3. lépés: A belső hardver

A hardver belül
A hardver belül
A hardver belül
A hardver belül
A hardver belül
A hardver belül

Forrasztópáka segítségével csatlakoztassa az elektronikus alkatrészeket a fenti kapcsolási rajz szerint. Van néhány dolog, amire különös figyelmet kell fordítani:

  • A Wemos D1 Mini és az RGB LED közötti vezetékeknek elég hosszúnak kell lenniük, hogy az RGB LED -et a doboz fedelében lévő lyukba lehessen szerelni.
  • Ugyanez számít a pillanatkapcsolóhoz és az érintésérzékelőhöz csatlakoztatott vezetékekhez, mivel ezekhez a fedél másik lyukán keresztül kell hozzáférni.
  • A pillanatkapcsoló gombját az érintésérzékelő alsó oldalára (nem érzékeny oldalára) kell ragasztani, oly módon, hogy a gombot visszahelyezheti a pillanatkapcsolóra úgy, hogy az érintésérzékelő felül van ragasztva (lásd a képet). Az érintésérzékelő a pillanatkapcsoló tetejére van felszerelve, hogy érzékelje az ujjal végzett gombnyomásokat, ebben az esetben a gombnyomást figyelmen kívül hagyja. Csak akkor kezdődik a varázsciklus, amikor megnyomja a gombot a varázspálca (amelynek nem kell vezetnie, tehát a műanyagok és a fa is megfelelő).
  • Szerelje fel az érintőérzékelővel ellátott pillanatnyi gombot a tetejére, nem túl mélyen a fedélben lévő lyuk alá, mert a varázspálcával elérhetőnek kell lennie ahhoz, hogy a varázslat mozgásban legyen.
  • A forrasztás során ügyeljen a kondenzátor polaritására. Ha megfordítja a pozitív és negatív vezetékeket, a kondenzátor valószínűleg varázslatos füstöt bocsát ki, és örök alvásba helyezi az áramkört.
  • Ragassza fel, ragasztja fel vagy csavarja be az elemtartót és a NYÁK -okat. Nem kell rendezettnek lennie, mivel nem lesz látható. Csak cseppállónak kell lennie.

Irány a szoftver!

4. lépés: A szoftver

Győződjön meg arról, hogy rendelkezik a legújabb (ingyenes) Arduino szoftverszerkesztővel, amely letölthető a https://www.arduino.cc/en/Main/Software webhelyről. A Wemos D1 mini és más ESP8266-alapú lapok támogatásának hozzáadásához tegye a következőket:

  • A telepítés után indítsa el az Arduino szoftvert, és nyissa meg a Beállítások ablakot.
  • Írja be a https://arduino.esp8266.com/stable/package_esp8266com_index.json címet a "További fórumkezelő URL -ek" mezőbe. Több URL -t is hozzáadhat, vesszővel elválasztva.
  • Nyissa meg a Boards Manager alkalmazást az Eszközök> Board menüből, és telepítse az esp8266 platformot (és ne felejtse el kiválasztani az ESP8266 kártyát a Tools> Board menüből a telepítés után. A "LOLIN (WEMOS) D1 R2 & mini" a legjobban működik a Wemos D1 mini v2 és v3 esetén) táblák.

Ha további segítségre van szüksége az Arduino telepítéséhez és az illesztőprogramok beállításához, tekintse meg a https://www.instructables.com/id/Wemos-ESP8266-Getting-Started-Guide-Wemos-101/ oldalt.

Az Arduino szerkesztőben nyisson meg egy új fájlt (Fájl> Új), és másolja/illessze be az alábbi kódot a most megnyíló ablakba. Csak írja felül azokat a sorokat, amelyek már jelen vannak az új ablakban (void setup és void loop).

Most már majdnem készen áll, de néhány kódrészletet hozzá kell igazítania az adott beállításhoz.

Első lépésként módosítsa az ip -címet a 34. sorban (az Arduino szerkesztőben a kódsorok számozva vannak) a Hue -híd ip -címére. Ha nem tudja a Hue Bridge IP -címét, látogasson el a https://discovery.meethue.com/ oldalra, és a megfelelő IP -cím azonnal megjelenik a böngészőben. Az ip -cím az a pontozott szám, amelyet "internalipaddress" előz meg.

A Hue lámpákkal való kommunikációhoz létre kell hoznia egy Hue API felhasználót a Wemos D1 mini számára, így a Wemos a Hue API -n keresztül kommunikálhat a Hue fényhez. Ehhez kövesse a https://developers.meethue.com/develop/get-started-2/ oldalon található utasításokat, és másolja/illessze be a létrehozott (elég hosszú) felhasználónevet az Arduino kódablakba. Csak cserélje le az összes „YOUR HUE API USERNAME” nevet a generált API felhasználónévvel.

Ezután ki kell választania a megfelelő színárnyalatot a szín megváltoztatásához. A Hue API -ban minden lámpának van száma, ezért meg kell találnia azt a számot, amely megfelel a projekthez használni kívánt fénynek. Az egyik legegyszerűbb módja annak, hogy megtudja, melyik számnak van egy adott fénye, a Hue Viewer alkalmazás letöltése Androidra vagy iOS -re. Cserélje ki a "YOUR LIGHT NUMBER" szöveget a megfelelő számmal mindenhol az Arduino kódablakban.

Az utolsó dolog, amit be kell állítania, hogy a Wemos csatlakozzon a wifi hálózatához. Ez úgy történik, hogy feltölti a kódot a Wemos -ra, és laptopján átkapcsol egy másik wifi -hálózatra: az "AutoConnectAP" -ra. A böngésző ezután megjelenít egy oldalt, ahol hozzáadhatja a wifi -hálózat SSID -jét (nevét) és jelszavát, amelyet a Wemos vezérlő a wifi -hálózathoz (és a Hue -hídhoz) való csatlakozáshoz használ.

Megjegyzés: Ha a kód feltöltése Wemos D1 mini készülékünkre USB -n keresztül nem működik, előfordulhat, hogy le kell töltenie egy illesztőprogramot a Wemos USB -chipéhez. A platform (Windows, Mac) illesztőprogramja letölthető a https://sparks.gogo.co.nz/ch340.html webhelyről

Most már készen áll, hogy tesztelje alkotásait!

// ESP8266 Hue Magic Wand // Richard van Kampen - 2018 // Ezt a kódot Wemos D1 mini -n tesztelték, de valószínűleg más ESP8266 -alapú fejlesztőlapokon is működik // Támogatás hozzáadása a Wemos D1 mini és más ESP8266 táblákhoz az Arduino szerkesztőhöz tegye a következő lépéseket: // - Indítsa el az Arduino alkalmazást, és nyissa meg a Beállítások ablakot. // - Írja be a https://arduino.esp8266.com/stable/package_esp8266com_index.json címet a Kiegészítő fórumkezelő URL -ek mezőbe. Több URL -t is hozzáadhat, vesszővel elválasztva. // - Nyissa meg a Boards Manager alkalmazást az Eszközök> Board menüből, és telepítse az esp8266 platformot (és ne felejtse el kiválasztani az ESP8266 kártyát az Eszközök> Board menüből a telepítés után). // használt könyvtárak: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Helyi DNS -kiszolgáló, amely minden kérés átirányítására szolgál a WiFiManager konfigurációs portálra, ha nincsenek WIFI -beállítások (SSID, jelszó) még nincs beállítva. #include "ESP8266WebServer.h" // A WiFiManager konfigurációs portál kiszolgálására használt helyi webszerver #include "WiFiManager.h" // WiFi Configuration Magic könyvtár, ha még nincs telepítve, kérjük, tekintse meg a https://github.com/tzapu/WiFiManager webhelyet #install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, szükséges a Philips Hue API használatához (lásd: https://developers.meethue.com/develop/ hue-api/). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, szükséges a Hue API válaszának elemzéséhez, telepítse az 5.x verziót az Arduino könyvtárkezelőjén keresztül (Menü "Vázlat"> Könyvtár beillesztése> Kezelés Könyvtárak> keresse meg az ArduinoJson szót, és módosítsa a verziót a legújabb 5.x verzióra). A 6. verzió (jelenleg bétaverzióban) hibát jelez. // változók és init: Karakterlánc válasz; const int redPin = 13; // Wemoson ez d7 const int greenPin = 12; // Wemoson ez d6 const int bluePin = 14; // Wemoson ez d5 const int touchSensor = 5; // Wemos ezen a d1 const int aktiválásPin = 4; // Wemoson ez a d2 bool aktiválás = HIGH; bool touch = LOW; const char* aan_restore; int bri_restore; dupla x_restore; dupla y_restore; dupla x_magic; dupla y_magic; bool first = igaz; előjel nélküli hosszú startMillis; előjel nélküli hosszú áramMillis; előjel nélküli hosszú időtartamMillis; RestClient kliens = RestClient ("192.168.178.23"); // "a Hue Bridge IP -címe" // Ha nem tudja a Hue Bridge IP -címét, keresse fel a https://discovery.meethue.com webhelyet, és azonnal megjelenik a böngészőben. Az ip -cím az a pontozott szám, amely előtt a "internalipaddress" void setup () {analogWriteRange (255); Sorozat.kezdet (9600); // Kezdje a LED kikapcsolásával. pinMode (aktivációs pin, INPUT_PULLUP); pinMode (touchSensor, INPUT); startMillis = millis (); checkWand (); } void loop () {// itt nincs mit tenni, hagyja üresen…} void checkWand () {int rgbColour [3]; // James Harton RGB színkódja, https://gist.github.com/jamesotron/766994 // Kezdje pirossal. rgbSzín [0] = 255; rgbSzín [1] = 0; rgbSzín [2] = 0; aktiválás = digitalRead (aktivációs pin); // LOW azt jelenti, hogy pálcát használnak. touch = digitalRead (touchSensor); // A HIGH azt jelenti, hogy pálca helyett ujjat használnak, aminek nem szabad így lennie. while (aktiválás == LOW && touch == LOW) {// Válassza ki a növekvő és a csökkentendő színeket. for (int decColour = 0; decColour <3; decColour += 1) {int incColour = decColour == 2? 0: decColour + 1; // = terner operátor, azt jelenti: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // a két szín keresztezése. mert (int i = 0; i <255; i += 1) {rgbColour [decColour] -= 1; rgbSzín [incColour] += 1; // mivel az RGB ledünknek közös anódja van a katód helyett (tehát +3.3V -hoz kell csatlakoznunk a föld helyett), fordított értékekre van szükségünk az RGB esetében: int red = 255 - rgbColour [0]; int zöld = 255 - rgbSzín [1]; int kék = 255 - rgbSzín [2]; analogWrite (redPin, piros); analogWrite (zöldPin, zöld); analogWrite (bluePin, kék); késleltetés (8); aktiválás = digitalRead (aktivációs pin); if (aktiválás == HIGH) {// HIGH azt jelenti, hogy a pálca felemelkedik. goto stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - startMillis); if (durationMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } else {// a Wemos alvó üzemmódba állítása: ESP.deepSleep (0); }} void RGBtoxy (int piros, zöld, int kék) {// lásd: https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = térkép (piros, 0, 255, 0, 1000); R /= 1000; dupla G = térkép (zöld, 0, 255, 0, 1000); G /= 1000; dupla B = térkép (kék, 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); kettős X = R * 0,649926f + G * 0,103455f + B * 0,197109f; kettős Y = R * 0,234327f + G * 0,743075f + B * 0,022598f; kettős Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; kettős x = X / (X + Y + Z); kettős y = Y / (X + Y + Z); // az átalakítás nem fejeződött be teljesen, de valószínűleg elég jó ahhoz, amit el szeretnénk érni, ezért hagyja ezt, és küldje el az XY értékeket a lampnak: sendtoHue (x, y); } void sendtoHue (dupla a, dupla b) {// tényleges színváltozás a pálca varázslatából if (first) {// first pass: az aktuális lámpaállapot lekérése getCurrentValues (); } // majd küldje el a varázspálca színeit: // várjon a varázslatra: hosszú várakozás; x_magic = a; y_magic = b; // lámpa világít varázspálca színben: response = ""; int temp = véletlenszerű (2, 9); const char* állapot = "igaz"; for (int i = 1; i <= temp; i ++) {// létrehozza a hídra küldendő char tömböt: String temp_body1 = "{" on / ":" + String (state) + ", \" bri / ": 220, / "xy \": [" + String (x_magic) +", " + String (y_magic) +"], / "átmeneti idő \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // most a post_body1 karakterek; // pihenő hívás kezdeményezése: int statusCodePut1 = client.put ("/api/YOU HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body1 és & response); várakozás = véletlenszerű (100, 600); késleltetés (várakozás); if (állapot == "igaz") {állapot = "hamis"; } else {state = "true"; }} // csökkentse a fényerőt…: response = ""; hőmérséklet = véletlenszerű (4, 17); // char tömb létrehozása a hídra küldéshez: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" átmeneti idő / ":" + String (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // most a post_body2 karakterek; // pihenő hívás kezdeményezése: int statusCodePut2 = client.put ("/api/YOU HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body2, & response); várakozás = véletlenszerű (1000, 2500); késleltetés (várakozás); //..és újra világosabbá tenni: response = ""; hőmérséklet = véletlenszerű (4, 17); // char tömb létrehozása a hídra küldéshez: String temp_body3 = "{" bri_inc / ": 100, \" átmeneti idő / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // most a post_body3 karakterek; // pihenő hívás kezdeményezése: int statusCodePut3 = client.put ("/api/YOU HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body3, & response); várakozás = véletlenszerű (2500, 5000); // várj 2-5 másodperc késéssel (várj); // és vissza a régi értékre: response = ""; // char tömb létrehozása a hídra küldéshez: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": [" + Karakterlánc (x_restore) +", " + String (y_restore) +"], / "átmeneti idő \": " + Karakterlánc (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // most a post_body4 karakterek; // pihenő hívás kezdeményezése: int statusCodePut4 = client.put ("/api/YOU HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body4, & response); ESP.deepSleep (0); // újra aludni fogok … } unsigned int getCurrentValues () {connectWifi (); // először csatlakozzon a Wifi -hez válasz = ""; // pihenő hívás kezdeményezése: int statusCodeGet = client.get ("/api/YOU HUE API USERNAME/lights/YOUR LIGHT NUMBER", & response); Serial.print ("Állapotkód a szerverről GET után:"); Serial.println (statusCodeGet); Serial.print ("Válasz törzs a szervertől:"); Serial.println (válasz); StaticJsonBuffer jsonBuffer; // Json válasz elemzése // Az objektumfa gyökere. // // Ez egy hivatkozás a JsonObject -re, a tényleges bájtok a // jsonBuffer -ben vannak az objektumfa összes többi csomópontjával együtt. // A memória felszabadul, ha a jsonBuffer kilép a hatókörből. JsonObject & root = jsonBuffer.parseObject (válasz); JsonObject & state = root ["state"]; // Ellenőrizze, hogy az elemzés sikeres -e. if (! root.success ()) {Serial.println ("parseObject () nem sikerült"); } // Értékek lekérése. aan_restore = állapot ["be"]; Serial.println (aan_restore); bri_restore = állapot ["bri"]; x_restore = állapot ["xy"] [0]; y_restore = állapot ["xy"] [1]; first = false;} void connectWifi () {// Helyi intializáció. Ha az üzlet befejeződött, nem kell a WiFiManager wifiManager környékén tartani; // beállítások visszaállítása - teszteléshez: //wifiManager.resetSettings (); // a visszahívás beállítása, amelyet akkor hívnak meg, ha a korábbi WiFi -hez való csatlakozás sikertelen, és belép a hozzáférési pont módba wifiManager.setAPCallback (configModeCallback); // lekéri az SSID -t és a pass -ot, és megpróbál csatlakozni // ha nem csatlakozik, elindít egy hozzáférési pontot a megadott névvel // itt "AutoConnectAP" //, és belép egy blokkoló hurokba, amely a konfigurációra vár, ha (! wifiManager.autoConnect ()) {Serial.println ("nem sikerült csatlakozni és nem sikerült elérni az időtúllépést"); // alaphelyzetbe állítás és újrapróbálkozás, esetleg mély alvó állapotba állítása ESP.reset (); késleltetés (1000); } // ha ideért, akkor csatlakozott a WiFi Serial.println -hez ("csatlakoztatva … igen:)"); Serial.print ("Csatlakoztatva:"); Serial.println (WiFi. SSID ()); Serial.print ("IP -cím:"); Serial.println (WiFi.localIP ()); // Az ESP -hez rendelt IP -cím (Wemos) // a fogadott jelerősség kinyomtatása: long rssi = WiFi. RSSI (); Serial.print ("jelerősség (RSSI):"); Soros.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Beállított konfigurációs mód"); Serial.println (WiFi.softAPIP ()); // ha automatikusan generált SSID-t használt, nyomtassa ki Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Ajánlott: