Innehållsförteckning:

Hue Magic: 4 steg (med bilder)
Hue Magic: 4 steg (med bilder)

Video: Hue Magic: 4 steg (med bilder)

Video: Hue Magic: 4 steg (med bilder)
Video: СВИСТОК СМЕРТИ ночью НА КЛАДБИЩЕ / Призрак ребёнка в видео / Aztec Death Whistle 2024, Juni
Anonim
Image
Image

Välkommen trollkarlar!

För ett par månader sedan skapade jag en liten magisk låda med trollstav till min 3 -åriga son. När han vidrör lådan med trollstaven, kommer ett skiftande färgat ljus att avge från lådan. När han ser en färg han gillar särskilt kan han rikta staven mot bordslampan (med en Philips Hue -glödlampa inuti), göra en besvärjelse och färgen från lådan hoppar magiskt till lampan! Lampa och ljus från lådan har plötsligt samma färg …

Efter några sekunder bleknar färgen och bordslampan återgår till sitt tillstånd före trollformeln. Tills en ny trollformulering är gjord …

Steg 1: Vad du behöver för att skapa detta projekt

Vad du behöver för att skapa detta projekt
Vad du behöver för att skapa detta projekt
Vad du behöver för att skapa detta projekt
Vad du behöver för att skapa detta projekt
Vad du behöver för att skapa detta projekt
Vad du behöver för att skapa detta projekt

För att skapa det här projektet behöver du följande material:

    • 1 (eller fler) Philips Hue -färglampa och en Hue Bridge
    • 1 Wemos D1 mini eller liknande esp8266-baserad mikrokontroller
    • 1 (Arduino) touch -sensor (t.ex. TTP223R)
    • 1 (Arduino) tillfällig knapp
    • 1 10uF kondensator
    • 1 RGB -led (vanlig anodtyp)
    • 5 motstånd (10, 22 och 47 Ohm, 2x 10K Ohm)
    • 2 små prototyper PCB (2x3 tum eller ca 5x7 cm borde vara tillräckligt stora)
    • några (bygel) trådar
    • ett lödkolv
    • en trollstav (kan köpas som färdig i en leksaksaffär, eller så kan du göra den själv)
    • en liten låda av kartong eller trä (kan vara en befintlig låda, men du kan också bygga en låda från början förstås)
    • lite tejp
    • lite lim och/eller muttrar och bultar för att montera kretskorten i lådan.
    • valfritt: förpackningspapper för lådan

OBS: Lite erfarenhet av att läsa kretsscheman är till hjälp när du går igenom detta instruerbara. Mitt diagram är inte alltför komplext: om du kan skilja en kondensator från ett motstånd kommer du förmodligen att må bra.

Viss erfarenhet av Arduino -programmering med Arduino IDE är också till hjälp. Ganska grundläggande erfarenhet borde vara tillräckligt, eftersom jag ska ge hela koden för dig att kopiera/klistra in. Du måste dock anpassa några saker för att det ska fungera i din specifika konfiguration (t.ex. dina nätverksinställningar och några detaljer från din Hue-konfiguration). Om det här låter lite skrämmande, oroa dig inte, jag hjälper dig att hämta all information du behöver.

Steg 2: The Box & Wand

The Box & Wand
The Box & Wand
The Box & Wand
The Box & Wand

De första stegen är normalt de svåraste, men inte i detta instruerbara! För en enkel start kan du bara köpa en trollstav från en leksaksaffär och för lådan kan du helt enkelt återanvända en befintlig liten låda som du redan har legat runt. Se bara till att lådan inte är gjord av metall, eftersom detta kommer att blockera wifi-signalerna och vi behöver dem för magin;-).

När du ändrar en befintlig låda är det enda du behöver göra att göra två hål i lådans ovansida: 1 litet hål (storlek 5 mm = 0,2 tum) för RGB-ledningen och ett större hål (cirka 12- 14 mm eller cirka 0,5 tum) för beröringssensorn.

Den exakta placeringen av hålen är inte kritisk, bara placera dem enligt din känsla av estetik men tänk på några saker:

  • Håll ett avstånd mellan båda hålen för att se till att komponenterna som kommer att monteras under hålen (RGB -lysdioden och pekssensorn) tillåts uppta tillräckligt med utrymme för montering och kabeldragning.
  • Det största hålet är för beröringssensorn. Denna sensor kommer att monteras precis under hålet, på ett sådant sätt att den kan vidröras (och till och med tryckas in något) av staven. Så se till att trollstaven du köper inte är för tjock!

Alternativt kan du använda (spray) färg eller omslagspapper och täcka plast för att göra din låda lite snyggare och för att skydda den från matspill och smutsiga händer.

Om det här första steget är lite för oambitiöst efter ditt tycke, var snäll och skapa en låda och trollstav helt från grunden! Det finns flera instruktioner där ute som hjälper dig att skapa en vacker trollstav

Oavsett vilken väg du väljer är det nu dags att utforska insidan av lådan.

Steg 3: Hårdvaran inuti

Hårdvaran inuti
Hårdvaran inuti
Hårdvaran inuti
Hårdvaran inuti
Hårdvaran inuti
Hårdvaran inuti

Använd ett lödkolv för att ansluta de elektroniska komponenterna enligt kretsschemat ovan. Det finns ett par saker att vara särskilt uppmärksam på:

  • Ledningarna mellan Wemos D1 Mini och RGB -lysdioden ska vara tillräckligt långa så att RGB -ledningen kan monteras i hålet du har gjort i lådan på lådan.
  • Detsamma gäller för trådarna som är anslutna till den tillfälliga omkopplaren och pekssensorn, eftersom dessa ska vara tillgängliga via det andra hålet i locket.
  • Knappen på den tillfälliga omkopplaren ska vara limmad på undersidan (den icke känsliga sidan) av pekssensorn, på ett sådant sätt att du kan sätta tillbaka knappen på momentbrytaren med pekssensorn limmad ovanpå (se bild). Pekssensorn är monterad ovanpå den momentana omkopplaren för att upptäcka knapptryckningar som görs med ett finger, i vilket fall knapptryckningen ignoreras. Först när knappen trycks av trollstaven (som ska vara icke-ledande, så att plast och trä är fina), börjar den magiska cykeln.
  • Montera den tillfälliga knappen med beröringssensorn ovanpå inte för djupt under hålet i locket, eftersom den måste nås av trollstaven för att sätta magin i rörelse.
  • Var noga med att observera kondensatorns polaritet vid lödning. Om du vänder de positiva och negativa avledningarna kommer kondensatorn sannolikt att avge lite magisk rök och sätta din krets i en evig sömn.
  • Limma, tejpa och eller skruva fast batterihållaren och kretskortet på plats. Det behöver inte vara snyggt, eftersom det inte kommer att synas. Det ska bara vara droppsäkert.

Till programvaran!

Steg 4: Programvaran

Se till att du har den senaste (gratis) Arduino -programvaroredigeraren som kan laddas ner på https://www.arduino.cc/en/Main/Software. Gör följande för att lägga till stöd för Wemos D1 mini och andra ESP8266-baserade kort:

  • Efter installationen startar du Arduino -programvaran och öppnar fönstret Inställningar.
  • Ange https://arduino.esp8266.com/stable/package_esp8266com_index.json i fältet "Ytterligare styrhanteringsadresser". Du kan lägga till flera webbadresser och separera dem med kommatecken.
  • Öppna Boards Manager från Tools> Board -menyn och installera esp8266 -plattformen (och glöm inte att välja ditt ESP8266 -kort från Tools> Board -menyn efter installationen. "LOLIN (WEMOS) D1 R2 & mini" fungerar bäst för Wemos D1 mini v2 och v3 brädor.

Om du behöver mer hjälp med att installera Arduino och konfigurera drivrutinerna kan du titta på

I Arduino -redigeraren öppnar du en ny fil (Arkiv> Ny) och kopierar/klistrar in koden nedan i fönstret som just öppnades. Skriv bara över de rader som redan finns i det nya fönstret (void setup och void loop).

Nu är du nästan klar, men du måste anpassa några bitar av koden för just din inställning.

Det första du ska göra är att ändra ip -adressen på rad 34 (i Arduino -redigeraren är kodens rader numrerade) till ip -adressen på din Hue -bro. Om du inte känner till din Hue Bridge IP -adress besöker du https://discovery.meethue.com/ och rätt IP -adress visas direkt i din webbläsare. IP -adressen är det prickade numret som föregås av "internadress".

För att kommunicera med Hue -lamporna måste du skapa en Hue API -användare för Wemos D1 mini, så att Wemos kan kommunicera med Hue -ljuset via Hue API. För att göra det, följ instruktionerna på https://developers.meethue.com/develop/get-started-2/ och kopiera/klistra in det genererade (ganska långa) användarnamnet i Arduino-kodfönstret. Ersätt bara varje "DIN HUE API ANVÄNDARNAMN" med det genererade API -användarnamnet.

Då måste du välja rätt Hue -ljus för att ändra färg. I Hue API har varje ljus ett nummer, så du måste ta reda på det nummer som motsvarar ljuset som du vill använda för detta projekt. Ett av de enklaste sätten att ta reda på vilket nummer ett visst ljus har är att ladda ner Hue Viewer -appen för Android eller iOS. Ersätt texten "DITT LJUSNUMMER" med rätt nummer överallt i Arduino -kodfönstret.

Det sista du ska göra är att konfigurera Wemos för att ansluta till ditt wifi -nätverk. Detta görs genom att ladda upp koden till Wemos och växla till din bärbara dator till ett annat wifi -nätverk: till "AutoConnectAP". Din webbläsare visar sedan en sida där du kan lägga till SSID (namn) och lösenord för ditt wifi -nätverk som Wemos -kontrollen kommer att använda för att ansluta till ditt wifi -nätverk (och till Hue -bron).

OBS! Om det inte fungerar att ladda upp koden till vår Wemos D1 mini via USB kan du behöva ladda ner en drivrutin för USB -chipet på Wemos. En drivrutin för din plattform (Windows, Mac) kan laddas ner på

Nu är du redo att testa din skapelse!

// ESP8266 Hue Magic Wand // Richard van Kampen - 2018 // Denna kod är testad på en Wemos D1 mini, men kommer sannolikt också att fungera på andra ESP8266 -baserade utvecklingsbrädor // För att lägga till stöd för Wemos D1 mini och andra ESP8266 -kort till Arduino -redigeraren, följ följande steg: // - Starta Arduino och öppna fönstret Inställningar. // - Ange https://arduino.esp8266.com/stable/package_esp8266com_index.json i fältet Extra Board Manager URLs. Du kan lägga till flera webbadresser och separera dem med kommatecken. // - Öppna Boards Manager från Tools> Board -menyn och installera esp8266 -plattformen (och glöm inte att välja ditt ESP8266 -kort från Tools> Board -menyn efter installationen). // använda bibliotek: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Lokal DNS -server som används för att omdirigera alla förfrågningar till WiFiManager -konfigurationsportalen om inga WIFI -inställningar (SSID, lösenord) har inte ställts in ännu. #include "ESP8266WebServer.h" // Lokal WebServer som används för att konfigurera WiFiManager -konfigurationsportalen #inkludera "WiFiManager.h" // WiFi Configuration Magic -bibliotek, om det inte är installerat ännu, se https://github.com/tzapu/WiFiManager #install-through-library-manager #inkludera "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, behövs för att använda Philips Hue API (se https://developers.meethue.com/develop/ hue-api/). #inkludera "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, behövs för att analysera Hue API -svar, installera version 5.x via bibliotekshanteraren i Arduino (Meny "Skiss"> Inkludera bibliotek> Hantera Bibliotek> sök efter ArduinoJson och ändra version till senaste 5.x). Version 6 (för närvarande i beta) ger ett fel. // variabler och init: String -svar; const int redPin = 13; // på Wemos är detta d7 const int greenPin = 12; // på Wemos är detta d6 const int bluePin = 14; // på Wemos är detta d5 const int touchSensor = 5; // på Wemos detta är d1 const int activationPin = 4; // på Wemos är detta d2 bool aktivering = HIGH; bool touch = LÅG; const char* aan_restore; int bri_restore; dubbel x_restore; dubbel y_restore; dubbel x_magic; dubbel y_magic; bool först = sant; osignerad lång startMillis; osignerad lång strömMillis; osignerad long durationMillis; RestClient -klient = RestClient ("192.168.178.23"); // "din Hue Bridge IP -adress" // Om du inte känner till din Hue Bridge IP -adress besöker du https://discovery.meethue.com så visas den direkt i din webbläsare. IP -adressen är det prickade numret som föregås av "internalipaddress" void setup () {analogWriteRange (255); Serial.begin (9600); // Börja med lysdioden släckt. pinMode (activationPin, INPUT_PULLUP); pinMode (touchSensor, INPUT); startMillis = millis (); checkWand (); } void loop () {// inget att göra här, lämna tomt …} void checkWand () {int rgbColour [3]; // RGB -färgkod av James Harton, https://gist.github.com/jamesotron/766994 // Börja med rött. rgbColour [0] = 255; rgbColour [1] = 0; rgbColour [2] = 0; activation = digitalRead (activationPin); // LOW betyder att trollstav används. touch = digitalRead (touchSensor); // HIGH betyder att finger används istället för trollstav, vilket inte borde vara fallet. medan (aktivering == LÅG && touch == LÅG) {// Välj de färger som ska ökas och minskas. för (int decColour = 0; decColour <3; decColour += 1) {int incColour = decColour == 2? 0: decColour + 1; // = ternary operator, betyder: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // korsfade de två färgerna. för (int i = 0; i <255; i += 1) {rgbColour [decColour] -= 1; rgbColour [incColour] += 1; // eftersom vår RGB -LED har en gemensam anod istället för katod (så vi måste ansluta till +3.3V istället för jord), behöver vi inverterade värden för RGB: int red = 255 - rgbColour [0]; int green = 255 - rgbColour [1]; int blue = 255 - rgbColour [2]; analogWrite (redPin, röd); analogWrite (greenPin, grön); analogWrite (bluePin, blue); fördröjning (8); aktivering = digitalRead (activationPin); om (aktivering == HIGH) {// HIGH betyder att trollspetsen lyfts. gå till stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - startMillis); if (durationMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } annars {// sätta Wemos i viloläge: ESP.deepSleep (0); }} ogiltig RGBtoxy (int röd, int grön, int blå) {// se https://developers.meethue.com/documentation/color-conversions-rgb-xy dubbel R = map (röd, 0, 255, 0, 1000); R /= 1000; dubbel G = karta (grön, 0, 255, 0, 1000); G /= 1000; dubbel B = karta (blå, 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); dubbel X = R * 0,649926f + G * 0,103455f + B * 0,199710f; dubbel Y = R * 0,234327f + G * 0,743075f + B * 0,022598f; dubbel Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; dubbel x = X / (X + Y + Z); dubbel y = Y / (X + Y + Z); // omvandlingen är inte helt klar, men förmodligen tillräckligt bra för det vi vill uppnå, så lämna det här och skicka XY -värden till lampan: sendtoHue (x, y); } void sendtoHue (dubbel a, dubbel b) {// verklig färgförändring från trollmagi om (första) {// första pass: få nuvarande lampstatus getCurrentValues (); } // skicka sedan trollstavens färger: // vänta på stavning: lång väntan; x_magic = a; y_magic = b; // lampa på i trollstavens färg: respons = ""; int temp = slumpmässig (2, 9); const char* state = "true"; for (int i = 1; i <= temp; i ++) {// skapa char array för att skicka till bridge: String temp_body1 = "{" on / ":" + String (state) + ", \" bri / ": 220, / "xy \": [" + String (x_magic) +", " + String (y_magic) +"], / "övergångstid \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // nu har vi post_body1 som char array; // ringa resten: int statusCodePut1 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body1, & response); vänta = slumpmässig (100, 600); fördröjning (vänta); if (state == "true") {state = "false"; } annat {state = "true"; }}} // minska ljusstyrkan …: response = ""; temp = slumpmässig (4, 17); // skapa char array för att skicka till bridge: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" övergångstid / ":" + String (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // nu har vi post_body2 som char array; // ringa resten: int statusCodePut2 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body2, & response); vänta = slumpmässig (1000, 2500); fördröjning (vänta); //..och gör det ljusare igen: response = ""; temp = slumpmässig (4, 17); // skapa char array för att skicka till bridge: String temp_body3 = "{" bri_inc / ": 100, \" övergångstid / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // nu har vi post_body3 som char array; // ringa resten: int statusCodePut3 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body3, and response); vänta = slumpmässig (2500, 5000); // vänta 2-5 sekunder fördröjning (vänta); // och blekna tillbaka till gammalt värde: response = ""; // skapa char array för att skicka till bridge: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": [" + String (x_restore) +", " + String (y_restore) +"], / "övergångstid \": " + String (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // nu har vi post_body4 som char array; // ringa resten: int statusCodePut4 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body4, & response); ESP.deepSleep (0); // ska sova igen … } osignerad int getCurrentValues () {connectWifi (); // först ansluta till Wifi -svar = ""; // ringa resten: int statusCodeGet = client.get ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER", & response); Serial.print ("Statuskod från servern efter GET:"); Serial.println (statusCodeGet); Serial.print ("Svarsteknik från server:"); Serial.println (svar); StaticJsonBuffer jsonBuffer; // Parsing Json -svar // Root på objektträdet. // // Det är en referens till JsonObject, de faktiska bytena är inne i // jsonBuffer med alla andra noder i objektträdet. // Minnet frigörs när jsonBuffer går utanför tillämpningsområdet. JsonObject & root = jsonBuffer.parseObject (svar); JsonObject & state = root ["state"]; // Testa om analysen lyckas. om (! root.success ()) {Serial.println ("parseObject () misslyckades"); } // Hämta värden. aan_restore = tillstånd ["på"]; Serial.println (aan_restore); bri_restore = tillstånd ["bri"]; x_restore = tillstånd ["xy"] [0]; y_restore = tillstånd ["xy"] [1]; first = false;} void connectWifi () {// lokal intialisering. När det väl är gjort behöver du inte ha det kvar i WiFiManager wifiManager; // återställ inställningar - för testning: //wifiManager.resetSettings (); // ställ in återuppringning som blir uppringd när anslutning till tidigare WiFi misslyckas och går in i åtkomstpunktsläget wifiManager.setAPCallback (configModeCallback); // hämtar ssid och pass och försöker ansluta // om den inte ansluter startar den en åtkomstpunkt med det angivna namnet // här "AutoConnectAP" // och går in i en blockeringsslinga i väntan på konfiguration om (! wifiManager.autoConnect ()) {Serial.println ("misslyckades med att ansluta och träffa timeout"); // återställ och försök igen, eller kanske lägga den i djup sömn ESP.reset (); fördröjning (1000); } // om du kommer hit har du anslutit till WiFi Serial.println ("ansluten … ååå:)"); Serial.print ("Ansluten till:"); Serial.println (WiFi. SSID ()); Serial.print ("IP -adress:"); Serial.println (WiFi.localIP ()); // IP -adress tilldelad din ESP (Wemos) // skriv ut den mottagna signalstyrkan: lång rssi = WiFi. RSSI (); Serial.print ("signalstyrka (RSSI):"); Serial.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Inmatat konfigurationsläge"); Serial.println (WiFi.softAPIP ()); // om du använde automatiskt genererat SSID, skriv ut det Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Rekommenderad: