Innholdsfortegnelse:

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

Video: Hue Magic: 4 trinn (med bilder)

Video: Hue Magic: 4 trinn (med bilder)
Video: Цимес. Так готовят только в Одессе! Старое Еврейское Блюдо 2024, September
Anonim
Image
Image

Velkommen veivisere!

For et par måneder siden laget jeg en liten magisk boks med tryllestav til min sønn på 3 år. Når han berører boksen med staven, begynner det å skifte et farget lys fra esken. Når han ser en farge han liker spesielt godt, kan han peke staven mot bordlampen (med en Philips Hue -pære inni), trylleformel og fargen fra esken vil magisk hoppe til lampen! Lampe og lys fra esken har plutselig samme farge …

Etter noen sekunder forsvinner fargen og bordlampen går tilbake til sin tilstand før magien. Inntil en ny trylleformular er kastet …

Trinn 1: Hva du trenger for å lage dette prosjektet

Hva du trenger for å lage dette prosjektet
Hva du trenger for å lage dette prosjektet
Hva du trenger for å lage dette prosjektet
Hva du trenger for å lage dette prosjektet
Hva du trenger for å lage dette prosjektet
Hva du trenger for å lage dette prosjektet

For å lage dette prosjektet trenger du følgende materialer:

    • 1 (eller flere) Philips Hue fargepærer og en Hue Bridge
    • 1 Wemos D1 mini eller lignende esp8266-basert mikrokontroller
    • 1 (Arduino) berøringssensor (f.eks. TTP223R)
    • 1 (Arduino) øyeblikkelig knapp
    • 1 10uF kondensator
    • 1 RGB -led (vanlig anodetype)
    • 5 motstander (10, 22 og 47 Ohm, 2x 10K Ohm)
    • 2 små prototyper PCB (2x3 tommer eller ca 5x7 cm burde være store nok)
    • noen (jumper) ledninger
    • et loddejern
    • en tryllestav (kan kjøpes som ferdig i en lekebutikk, eller du kan lage den selv)
    • en liten eske laget av papp eller tre (kan være en eksisterende eske, men du kan selvfølgelig også bygge en eske fra bunnen av)
    • litt tape
    • litt lim og/eller muttere og bolter for å montere kretskortene i esken.
    • valgfritt: innpakningspapir for esken

NB: Litt erfaring med å lese kretsdiagrammer er nyttig når du går gjennom dette instruerbare. Diagrammet mitt er ikke altfor komplekst: hvis du kan skille en kondensator fra en motstand, vil du sannsynligvis ha det bra.

Noen erfaringer med Arduino -programmering ved bruk av Arduino IDE er også nyttig. Ganske grunnleggende erfaring burde være nok, ettersom jeg gir deg hele koden for å kopiere/lime inn. Du må imidlertid tilpasse noen få ting for å få det til å fungere i ditt spesielle oppsett (f.eks. Nettverksinnstillingene og noen detaljer fra Hue-konfigurasjonen). Hvis dette høres litt skremmende ut, ikke bekymre deg, jeg hjelper deg med å hente all informasjonen du trenger.

Trinn 2: The Box & Wand

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

De første trinnene er normalt de vanskeligste, men ikke i dette instruerbare! For en enkel start kan du bare kjøpe en tryllestav fra en lekebutikk, og for esken kan du ganske enkelt bruke en eksisterende liten eske som du allerede har ligget. Bare pass på at boksen ikke er laget av metall, da dette vil blokkere wifi-signalene og vi trenger dem for magien;-).

Når du omformulerer en eksisterende eske, er det eneste du trenger å gjøre å lage to hull i toppen av esken: 1 lite hull (størrelse 5 mm = 0,2 ") for RGB-ledningen og et større hull (rundt 12- 14 mm eller omtrent 0,5 ") for berøringssensoren.

Den nøyaktige plasseringen av hullene er ikke kritisk, bare plasser dem i henhold til din følelse av estetikk, men husk noen ting:

  • Hold litt avstand mellom begge hullene for å sikre at komponentene som skal monteres under hullene (RGB -lysdioden og berøringssensoren) begge får oppta nok plass til montering og ledninger.
  • Det største hullet er for berøringssensoren. Denne sensoren monteres like under hullet, på en slik måte at den kan berøres (og til og med trykkes litt) av staven. Så pass på at staven du kjøper ikke er for tykk!

Du kan også bruke (spray) maling eller innpakningspapir og dekke plast for å gjøre esken din litt penere og for å beskytte den mot matsøl og skitne hender.

Hvis dette første trinnet er litt for uambisiøst etter din smak, kan du fortsette og lage en eske og tryllestav helt fra bunnen av! Det er flere instrukser der ute som vil hjelpe deg med å lage en vakker tryllestav

Uansett hvilken vei du velger, er det nå på tide å utforske innsiden av esken.

Trinn 3: Maskinvaren inne

Maskinvaren inni
Maskinvaren inni
Maskinvaren inni
Maskinvaren inni
Maskinvaren inni
Maskinvaren inni

Bruk et loddejern til å koble de elektroniske komponentene i henhold til kretsdiagrammet ovenfor. Det er et par ting å være spesielt oppmerksom på:

  • Ledningene mellom Wemos D1 Mini og RGB -ledningen skal være lange nok til at RGB -ledningen kan monteres i hullet du har laget i lokket på esken.
  • Det samme gjelder for ledningene festet til den øyeblikkelige bryteren og berøringssensoren, da disse skal være tilgjengelige via det andre hullet i lokket.
  • Knappen på den øyeblikkelige bryteren skal limes på undersiden (den ikke -følsomme siden) av berøringssensoren, på en slik måte at du kan sette knappen tilbake på øyeblikksbryteren med berøringssensoren limt på toppen (se bildet). Berøringssensoren er montert på toppen av den midlertidige bryteren for å oppdage knappetrykk utført med en finger, i så fall vil knappetrykket bli ignorert. Bare når knappen trykkes av tryllestaven (som skal være ikke-ledende, slik at plast og tre er fine), begynner den magiske syklusen.
  • Monter den øyeblikkelige knappen med berøringssensoren på toppen ikke for dypt under hullet i lokket, fordi den må nås med tryllestaven for å sette magien i bevegelse.
  • Sørg for å observere polariteten til kondensatoren når du lodder den. Hvis du reverserer de positive og negative ledningene, vil kondensatoren sannsynligvis avgi litt magisk røyk og sette kretsen din i en evig søvn.
  • Lim, tape og eller skru på batteriholderen og kretskortene på plass. Det trenger ikke å være pent, da det ikke vil være i sikte. Det skal bare være fallsikkert.

Over til programvaren!

Trinn 4: Programvaren

Sørg for at du har den nyeste (gratis) Arduino -programvareditoren, som kan lastes ned på https://www.arduino.cc/en/Main/Software. For å legge til støtte for Wemos D1 mini og andre ESP8266-baserte kort, gjør du følgende:

  • Etter installasjonen starter du Arduino -programvaren og åpner vinduet Innstillinger.
  • Skriv inn https://arduino.esp8266.com/stable/package_esp8266com_index.json i feltet "Ekstra styringsleder -URLer". Du kan legge til flere nettadresser og skille dem med kommaer.
  • Åpne Boards Manager fra Tools> Board -menyen og installer esp8266 -plattformen (og ikke glem å velge ESP8266 -kortet ditt fra Tools> Board -menyen etter installasjon. "LOLIN (WEMOS) D1 R2 & mini" fungerer best for Wemos D1 mini v2 og v3 brett.

Hvis du trenger mer hjelp til å installere Arduino og konfigurere driverne, kan du ta en titt på

I Arduino -editoren, åpne en ny fil (Fil> Ny) og kopier/lim inn koden nedenfor i vinduet som nettopp åpnet. Bare skriv over linjene som allerede er tilstede i det nye vinduet (ugyldig oppsett og hulrom).

Nå er du nesten klar, men du må tilpasse noen få biter av koden for akkurat ditt oppsett.

Det første du må gjøre er å endre ip -adressen på linje 34 (i Arduino -editoren er kodelinjene nummerert) til ip -adressen til Hue -broen. Hvis du ikke kjenner din Hue Bridge IP -adresse, kan du besøke https://discovery.meethue.com/ og den riktige IP -adressen vil vises med en gang i nettleseren din. IP -adressen er det prikkede nummeret som innledes med "internadresse".

For å kommunisere med Hue -lysene må du opprette en Hue API -bruker for Wemos D1 mini, slik at Wemos kan kommunisere til Hue -lyset via Hue API. For å gjøre det, følg instruksjonene på https://developers.meethue.com/develop/get-started-2/ og kopier/lim inn det genererte (ganske lange) brukernavnet i Arduino-kodevinduet. Bare bytt ut hvert "YOUR HUE API USERNAME" med det genererte API -brukernavnet.

Deretter må du velge riktig fargetone for å endre farge. I Hue API har hvert lys et tall, så du må finne ut tallet som samsvarer med lyset du vil bruke til dette prosjektet. En av de enkleste måtene å finne ut hvilket nummer et bestemt lys har, er å laste ned Hue Viewer -appen for Android eller iOS. Erstatt teksten "DITT LYSNUMMER" med riktig nummer overalt i Arduino -kodevinduet.

Den siste tingen å gjøre er å sette opp Wemos for å koble til wifi -nettverket ditt. Dette gjøres ved å laste opp koden til Wemos og på den bærbare datamaskinen bytte til et annet wifi -nettverk: til "AutoConnectAP". Nettleseren din vil da vise en side der du kan legge til SSID (navn) og passord for wifi -nettverket som Wemos -kontrolleren vil bruke til å koble til wifi -nettverket (og til Hue -broen).

NB: Hvis det ikke virker å laste opp koden til vår Wemos D1 mini via USB, må du kanskje laste ned en driver for USB -brikken på Wemos. En driver for plattformen din (Windows, Mac) kan lastes ned på

Nå er du klar til å teste skapelsen din!

// ESP8266 Hue Magic Wand // Richard van Kampen - 2018 // Denne koden er testet på en Wemos D1 mini, men vil trolig også fungere på andre ESP8266 -baserte utviklingstavler // For å legge til støtte for Wemos D1 mini og andre ESP8266 -kort til Arduino editor, gjør du følgende: // - Start Arduino og åpne vinduet Preferanser. // - Skriv inn https://arduino.esp8266.com/stable/package_esp8266com_index.json i feltet Extra Board Manager URLs. Du kan legge til flere nettadresser og skille dem med kommaer. // - Åpne Boards Manager fra Tools> Board -menyen og installer esp8266 -plattformen (og ikke glem å velge ESP8266 -kortet ditt fra Tools> Board -menyen etter installasjon). // brukte biblioteker: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Lokal DNS -server som brukes til å omdirigere alle forespørsler til WiFiManager -konfigurasjonsportalen hvis ingen WIFI -innstillinger (SSID, passord) har ikke er satt enda. #include "ESP8266WebServer.h" // Lokal WebServer som brukes til å betjene WiFiManager -konfigurasjonsportalen #inkludere "WiFiManager.h" // WiFi Configuration Magic -bibliotek, hvis det ikke er installert ennå, se https://github.com/tzapu/WiFiManager #install-through-library-manager #inkludere "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, nødvendig for bruk av Philips Hue API (se https://developers.meethue.com/develop/ hue-api/). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, nødvendig for å analysere Hue API -respons, vennligst installer versjon 5.x via biblioteksjefen i Arduino (Meny "Skisse"> Inkluder bibliotek> Administrer Biblioteker> søk etter ArduinoJson og endre versjon til siste 5.x). Versjon 6 (for tiden i beta) gir en feil. // variabler og init: Stringrespons; const int redPin = 13; // på Wemos er dette d7 const int greenPin = 12; // på Wemos er dette d6 const int bluePin = 14; // på Wemos er dette d5 const int touchSensor = 5; // på Wemos dette er d1 const int activationPin = 4; // på Wemos er dette d2 bool aktivering = HIGH; bool touch = LOW; const char* aan_restore; int bri_restore; dobbelt x_restore; dobbelt y_restore; dobbelt x_magic; dobbelt y_magic; bool først = sant; usignert lang startMillis; usignert langstrømMillis; usignert lang varighetMillis; RestClient -klient = RestClient ("192.168.178.23"); // "din Hue Bridge IP -adresse" // Hvis du ikke kjenner din Hue Bridge IP -adresse, kan du gå til https://discovery.meethue.com og den vil vises med en gang i nettleseren din. IP -adressen er det prikkede nummeret som går foran med "internalipaddress" void setup () {analogWriteRange (255); Serial.begin (9600); // Start med LED -en av. pinMode (activationPin, INPUT_PULLUP); pinMode (touchSensor, INPUT); startMillis = millis (); checkWand (); } void loop () {// ingenting å gjøre her, la det stå tomt …} void checkWand () {int rgbColour [3]; // RGB -fargekode av James Harton, https://gist.github.com/jamesotron/766994 // Start med rødt. rgbColour [0] = 255; rgbColour [1] = 0; rgbColour [2] = 0; activation = digitalRead (activationPin); // LOW betyr at staven brukes. touch = digitalRead (touchSensor); // HIGH betyr at finger brukes i stedet for tryllestav, noe som ikke burde være tilfelle. mens (aktivering == LOW && touch == LOW) {// Velg fargene som skal økes og reduseres. for (int decColour = 0; decColour <3; decColour += 1) {int incColour = decColour == 2? 0: decColour + 1; // = ternary operator, betyr: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // kryssfade de to fargene. for (int i = 0; i <255; i += 1) {rgbColour [decColour] -= 1; rgbColour [incColour] += 1; // ettersom vår RGB -LED har en felles anode i stedet for katode (så vi må koble til +3.3V i stedet for bakken), trenger vi inverse verdier for RGB: int red = 255 - rgbColour [0]; int green = 255 - rgbColour [1]; int blue = 255 - rgbColour [2]; analogWrite (redPin, rød); analogWrite (greenPin, grønn); analogWrite (bluePin, blå); forsinkelse (8); aktivering = digitalRead (activationPin); hvis (aktivering == HIGH) {// HIGH betyr at tryllestaven er løftet. gå til stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - startMillis); if (durationMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } annet {// sette Wemos i hvilemodus: ESP.deepSleep (0); }} ugyldig RGBtoxy (int rød, int grønn, int blå) {// se https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = map (rød, 0, 255, 0, 1000); R /= 1000; dobbelt G = kart (grønt, 0, 255, 0, 1000); G /= 1000; dobbelt B = kart (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); dobbelt X = R * 0,649926f + G * 0,103455f + B * 0,199710f; dobbelt Y = R * 0,234327f + G * 0,743075f + B * 0,022598f; dobbelt Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; dobbelt x = X / (X + Y + Z); dobbelt y = Y / (X + Y + Z); // konvertering ikke fullført, men sannsynligvis god nok for det vi ønsker å oppnå, så la det stå og send XY -verdier til lampen: sendtoHue (x, y); } void sendtoHue (dobbel a, dobbel b) {// faktisk fargeendring fra tryllestavsmagi hvis (første) {// første passering: få gjeldende lampestatus getCurrentValues (); } // send deretter tryllestavfarger: // vent på stave: lang ventetid; x_magic = a; y_magic = b; // lampe på i tryllestavfarge: response = ""; int temp = tilfeldig (2, 9); const char* state = "true"; for (int i = 1; i <= temp; i ++) {// opprett char array for å sende til bridge: String temp_body1 = "{" on / ":" + String (state) + ", \" bri / ": 220, / "xy \": [" + String (x_magic) +", " + String (y_magic) +"], / "overgangstid \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // nå har vi post_body1 som char array; // foreta hvileanrop: int statusCodePut1 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body1, & response); vent = tilfeldig (100, 600); forsinkelse (vent); if (state == "true") {state = "false"; } annet {state = "true"; }}} // redusere lysstyrken…: response = ""; temp = tilfeldig (4, 17); // lag char array for å sende til bridge: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" overgangstid / ":" + String (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // nå har vi post_body2 som char array; // foreta hvileanrop: int statusCodePut2 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body2, & response); vent = tilfeldig (1000, 2500); forsinkelse (vent); //..og gjør det lysere igjen: response = ""; temp = tilfeldig (4, 17); // lag char array for å sende til bridge: String temp_body3 = "{" bri_inc / ": 100, \" overgangstid / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // nå har vi post_body3 som char array; // foreta hvileanrop: int statusCodePut3 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body3, & response); vent = tilfeldig (2500, 5000); // vent 2-5 sekunders forsinkelse (vent); // og vis tilbake til gammel verdi: response = ""; // lag char array for å sende til bridge: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": [" + String (x_restore) +", " + String (y_restore) +"], / "overgangstid \": " + String (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // nå har vi post_body4 som char array; // foreta hvileanrop: int statusCodePut4 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body4, & response); ESP.deepSleep (0); // skal sove igjen …. } usignert int getCurrentValues () {connectWifi (); // koble først til Wifi response = ""; // foreta hvileanrop: int statusCodeGet = client.get ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER", & response); Serial.print ("Statuskode fra server etter GET:"); Serial.println (statusCodeGet); Serial.print ("Svartekst fra server:"); Serial.println (svar); StaticJsonBuffer jsonBuffer; // Analyse av Json -svar // Rot av objekttreet. // // Det er en referanse til JsonObject, de faktiske bytes er inne i // jsonBuffer med alle de andre nodene i objekttreet. // Minne frigjøres når jsonBuffer går utenfor rekkevidde. JsonObject & root = jsonBuffer.parseObject (respons); JsonObject & state = root ["state"]; // Test om analysering lykkes. hvis (! root.success ()) {Serial.println ("parseObject () mislyktes"); } // Hent verdier. aan_restore = tilstand ["på"]; Serial.println (aan_restore); bri_restore = tilstand ["bri"]; x_restore = tilstand ["xy"] [0]; y_restore = tilstand ["xy"] [1]; first = false;} void connectWifi () {// Lokal intialisering. Når virksomheten er ferdig, er det ikke nødvendig å beholde den rundt WiFiManager wifiManager; // tilbakestill innstillinger - for testing: //wifiManager.resetSettings (); // angi tilbakeringing som blir ringt opp når tilkobling til tidligere WiFi mislykkes, og går inn i Access Point -modus wifiManager.setAPCallback (configModeCallback); // henter ssid og pass og prøver å koble til // hvis den ikke kobles til starter den et tilgangspunkt med det angitte navnet // her "AutoConnectAP" // og går inn i en blokkeringssløyfe som venter på konfigurasjon hvis (! wifiManager.autoConnect ()) {Serial.println ("klarte ikke å koble til og treff timeout"); // tilbakestill og prøv igjen, eller kanskje sette den i dyp søvn ESP.reset (); forsinkelse (1000); } // hvis du kommer hit har du koblet til WiFi Serial.println ("tilkoblet … yeey:)"); Serial.print ("Koblet til:"); Serial.println (WiFi. SSID ()); Serial.print ("IP -adresse:"); Serial.println (WiFi.localIP ()); // IP -adresse tilordnet ESP (Wemos) // skriv ut mottatt signalstyrke: lang rssi = WiFi. RSSI (); Serial.print ("signalstyrke (RSSI):"); Serial.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Angitt konfigurasjonsmodus"); Serial.println (WiFi.softAPIP ()); // hvis du brukte autogenerert SSID, skriv den ut Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Anbefalt: