Sisällysluettelo:

Värisävy: 4 vaihetta (kuvilla)
Värisävy: 4 vaihetta (kuvilla)

Video: Värisävy: 4 vaihetta (kuvilla)

Video: Värisävy: 4 vaihetta (kuvilla)
Video: UP-dokkari: Kamera käy! 4/6 2024, Kesäkuu
Anonim
Image
Image

Tervetuloa velhot!

Pari kuukautta sitten tein pienen taikuulaatikon sauvalla 3 -vuotiaalle pojalleni. Kun hän koskettaa laatikkoa sauvalla, värillinen valo alkaa säteillä laatikosta. Kun hän näkee värin, josta hän erityisesti pitää, hän voi osoittaa sauvan pöytälamppua kohti (jossa on Philips Hue -lamppu), loitsu ja laatikon väri hyppää maagisesti lampulle! Laatikon lamppu ja valo ovat yhtäkkiä samanvärisiä …

Muutaman sekunnin kuluttua väri häviää ja pöytälamppu palaa tilaansa ennen loitsua. Kunnes uusi loitsu …

Vaihe 1: Mitä tarvitset tämän projektin luomiseen

Mitä tarvitset tämän projektin luomiseen
Mitä tarvitset tämän projektin luomiseen
Mitä tarvitset tämän projektin luomiseen
Mitä tarvitset tämän projektin luomiseen
Mitä tarvitset tämän projektin luomiseen
Mitä tarvitset tämän projektin luomiseen

Tämän projektin luomiseen tarvitset seuraavat materiaalit:

    • 1 (tai enemmän) Philips Hue -väripolttimo ja Hue Bridge
    • 1 Wemos D1 mini tai vastaava ESP8266-pohjainen mikro-ohjain
    • 1 (Arduino) -kosketusanturi (esim. TTP223R)
    • 1 (Arduino) hetkellinen painike
    • 1 10uF kondensaattori
    • 1 RGB -led (yleinen anodityyppi)
    • 5 vastusta (10, 22 ja 47 ohmia, 2x 10 K ohmia)
    • 2 pientä prototyyppipiirilevyä (2x3 tuumaa tai noin 5x7 cm pitäisi olla tarpeeksi suuri)
    • joitakin (hyppyjohtoja)
    • juotin
    • taikasauva (voi ostaa valmiina lelukaupasta tai tehdä sen itse)
    • pieni laatikko pahvista tai puusta (voi olla olemassa oleva laatikko, mutta voit tietysti rakentaa laatikon myös alusta)
    • jotain nauhaa
    • joitakin liimaa ja/tai muttereita ja pultteja piirilevyjen kiinnittämiseksi laatikkoon.
    • valinnainen: käärepaperi laatikolle

HUOM: Pieni kokemus piirikaavioiden lukemisesta on hyödyllistä, kun käydään läpi tämä ohje. Kaavioni ei ole liian monimutkainen: jos pystyt erottamaan kondensaattorin vastuksesta, olet todennäköisesti kunnossa.

Jotkut kokemukset Arduino -ohjelmoinnista Arduino IDE: n avulla ovat myös hyödyllisiä. Pikakokemuksen pitäisi riittää, koska annan sinulle täydellisen koodin kopioimiseksi/liittämiseksi. Sinun on kuitenkin mukautettava muutamia asioita, jotta se toimisi tietyssä kokoonpanossasi (esim. Verkkoasetukset ja joitain tietoja Hue-kokoonpanostasi). Jos tämä kuulostaa hieman pelottavalta, älä huoli, autan sinua noutamaan kaikki tarvitsemasi tiedot.

Vaihe 2: Laatikko ja sauva

Laatikko ja sauva
Laatikko ja sauva
Laatikko ja sauva
Laatikko ja sauva

Ensimmäiset askeleet ovat yleensä vaikeimpia, mutta eivät tässä ohjeellisessa! Aloittamisen helpottamiseksi voit ostaa taikasauvan lelukaupasta ja laatikolle voit käyttää uudelleen olemassa olevaa pientä laatikkoa, jonka olet jo maannut. Varmista vain, että laatikko ei ole metallista, koska tämä estää wifi-signaalit ja tarvitsemme niitä taikuutta varten;-).

Kun suunnittelet olemassa olevaa laatikkoa uudelleen, sinun tarvitsee vain tehdä kaksi reikää laatikon yläosaan: 1 pieni reikä (koko 5 mm = 0,2 ") RGB-ledille ja suurempi reikä (noin 12- 14 mm tai noin 0,5 ") kosketusanturille.

Reikien tarkka sijainti ei ole kriittinen, aseta ne vain esteettisen mielesi mukaan, mutta pidä mielessä muutama asia:

  • Pidä jonkin verran etäisyyttä molempien reikien välillä varmistaaksesi, että reikien alle asennettavat komponentit (RGB -led ja kosketusanturi) saavat molemmat varata tarpeeksi tilaa asennusta ja johdotusta varten.
  • Suurin reikä on kosketusanturille. Tämä anturi asennetaan aivan reiän alle siten, että sauva voi koskettaa sitä (ja jopa painaa sitä hieman). Varmista siis, että ostamasi sauva ei ole liian paksu!

Vaihtoehtoisesti voit käyttää (ruiskutus) maalia tai käärepaperia ja kansi muovia tehdäksesi laatikostasi hieman kauniimman ja suojataksesi sitä elintarvikkeiden roiskeilta ja likaisilta käsiltä.

Jos tämä ensimmäinen askel on vähän liian kunnianhimoinen mielesi mukaan, mene eteenpäin ja luo laatikko ja sauva kokonaan tyhjästä! Siellä on useita ohjeita, jotka auttavat sinua luomaan kauniin sauvan

Riippumatta valitsemastasi polusta, on nyt aika tutkia laatikon sisäpuolta.

Vaihe 3: Laitteisto sisällä

Laitteisto sisällä
Laitteisto sisällä
Laitteisto sisällä
Laitteisto sisällä
Laitteisto sisällä
Laitteisto sisällä

Liitä elektroniset komponentit juotosraudalla yllä olevan kytkentäkaavion mukaisesti. On syytä kiinnittää erityistä huomiota muutamaan asiaan:

  • Wemos D1 Minin ja RGB -ledin välisten johtojen tulee olla riittävän pitkiä, jotta RGB -ledit voidaan asentaa reikään, jonka olet tehnyt laatikon kannessa.
  • Sama koskee hetkelliskytkimeen ja kosketusanturiin kiinnitettyjä johtoja, koska niihin pitäisi päästä käsiksi kannen toisen reiän kautta.
  • Hetkekytkimen painike tulee liimata kosketusanturin alapuolelle (ei -herkkä puoli) siten, että voit laittaa painikkeen takaisin hetkelliskytkimelle kosketusanturi liimattu päälle (katso kuva). Kosketusanturi on asennettu hetkekytkimen päälle tunnistamaan sormen painallukset, jolloin painikkeiden painallusta ei oteta huomioon. Vasta kun taikasauva painaa painiketta (jonka ei pitäisi olla johtava, joten muovit ja puu ovat kunnossa), taikasykli alkaa.
  • Kiinnitä kosketusanturilla varustettu hetkellinen painike päälle liian syvälle kannen reiän alapuolelle, koska sen on oltava tavoitettavissa taikasauvalla, jotta taika pääsee liikkeelle.
  • Muista kondensaattorin napaisuus juotettaessa. Jos käännät positiiviset ja negatiiviset johdot, kondensaattori päästää todennäköisesti taikamahaa ja saa piirisi ikuiseen uneen.
  • Liimaa, teippaa tai ruuvaa paristopidike ja piirilevyt paikalleen. Sen ei tarvitse olla siisti, koska se ei näy. Sen pitäisi olla vain pudotuskestävä.

Ohjelmistoon!

Vaihe 4: Ohjelmisto

Varmista, että sinulla on uusin (ilmainen) Arduino -ohjelmistoeditori, jonka voit ladata osoitteesta https://www.arduino.cc/en/Main/Software. Jos haluat lisätä tukea Wemos D1 minille ja muille ESP8266-pohjaisille levyille, toimi seuraavasti:

  • Käynnistä Arduino -ohjelmisto asennuksen jälkeen ja avaa Asetukset -ikkuna.
  • Kirjoita https://arduino.esp8266.com/stable/package_esp8266com_index.json "Hallituksen ylimääräiset URL -osoitteet" -kenttään. Voit lisätä useita URL -osoitteita erottamalla ne pilkuilla.
  • Avaa Boards Manager Työkalut> Hallitus -valikosta ja asenna esp8266 -alusta (ja muista valita ESP8266 -korttisi Työkalut> Hallitus -valikosta asennuksen jälkeen. "LOLIN (WEMOS) D1 R2 & mini" toimii parhaiten Wemos D1 mini v2 ja v3 -laitteille) levyt.

Jos tarvitset lisäapua Arduinon asentamiseen ja ohjainten käyttöönottoon, voit katsoa sivua

Avaa Arduino -editorissa uusi tiedosto (Tiedosto> Uusi) ja kopioi/liitä alla oleva koodi juuri avattuun ikkunaan. Korvaa vain rivit, jotka ovat jo uudessa ikkunassa (void setup ja void loop).

Nyt olet melkein valmis, mutta sinun on mukautettava muutamia koodinpätkiä tiettyyn kokoonpanoon.

Ensimmäinen asia on muuttaa rivin 34 ip -osoite (Arduino -editorissa koodirivit on numeroitu) Hue -siltaasi. Jos et tiedä Hue Bridgen IP -osoitetta, käy osoitteessa https://discovery.meethue.com/ ja oikea IP -osoite näkyy heti selaimessasi. IP -osoite on pisteviiva, jota edeltää "internalipaddress".

Jotta voit kommunikoida Hue -valojen kanssa, sinun on luotava Hue API -käyttäjä Wemos D1 minille, jotta Wemot voivat kommunikoida Hue -valon kanssa Hue API: n kautta. Voit tehdä tämän noudattamalla ohjeita osoitteessa https://developers.meethue.com/develop/get-started-2/ ja kopioimalla/liittämällä luotu (melko pitkä) käyttäjänimi Arduino-koodi-ikkunaan. Korvaa vain jokainen "YOUR HUE API USERNAME" luotu API -käyttäjätunnus.

Sitten sinun on valittava oikea Hue -valo vaihtaaksesi väriä. Hue -sovellusliittymässä jokaisella valolla on numero, joten sinun on selvitettävä numero, joka vastaa valoa, jota haluat käyttää tässä projektissa. Yksi helpoimmista tavoista selvittää, mikä numero tietyllä valolla on, on ladata Hue Viewer -sovellus Androidille tai iOS: lle. Korvaa teksti "YOUR LIGHT NUMBER" oikealla numerolla kaikkialla Arduino -koodiikkunassa.

Viimeinen asia on asettaa Wemot muodostamaan yhteys wifi -verkkoon. Tämä tehdään lataamalla koodi Wemosiin ja kytkemällä kannettava tietokone toiseen wifi -verkkoon: AutoConnectAP -järjestelmään. Selaimesi näyttää sitten sivun, jossa voit lisätä wifi -verkon SSID: n (nimen) ja salasanan, joita Wemos -ohjain käyttää muodostaessaan yhteyden wifi -verkkoon (ja Hue -siltaan).

Huomaa: Jos koodin lataaminen Wemos D1 mini -laitteeseemme USB -liitännän kautta ei toimi, sinun on ehkä ladattava ohjain Wemos -laitteen USB -sirulle. Alustasi (Windows, Mac) ohjaimen voi ladata osoitteesta

Nyt olet valmis testaamaan luomustasi!

// ESP8266 Hue Magic Wand // Richard van Kampen - 2018 // Tämä koodi on testattu Wemos D1 mini -laitteella, mutta toimii todennäköisesti myös muilla ESP8266 -pohjaisilla kehityskorteilla // Tuen lisääminen Wemos D1 minille ja muille ESP8266 -levyille Arduino editoriin, toimi seuraavasti: // - Käynnistä Arduino ja avaa Asetukset -ikkuna. // - Anna https://arduino.esp8266.com/stable/package_esp8266com_index.json Hallituksen ylimääräiset URL -osoitteet -kenttään. Voit lisätä useita URL -osoitteita erottamalla ne pilkuilla. // - Avaa Boards Manager Työkalut> Hallitus -valikosta ja asenna esp8266 -alusta (äläkä unohda valita ESP8266 -korttiasi Työkalut> Hallitus -valikosta asennuksen jälkeen). // käytetyt kirjastot: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Paikallinen DNS -palvelin, jota käytetään kaikkien pyyntöjen uudelleenohjaamiseen WiFiManager -määritysportaaliin, jos WIFI -asetuksia (SSID, salasana) ei ole ei ole vielä asetettu. #include "ESP8266WebServer.h" // WiFiManager -määritysportaalin palvelemiseen käytetty paikallinen verkkopalvelin #include "WiFiManager.h" // WiFi Configuration Magic -kirjasto, jos sitä ei ole vielä asennettu, katso https://github.com/tzapu/WiFiManager #install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, tarvitaan Philips Hue -sovellusliittymän käyttöön (katso https://developers.meethue.com/develop/ hue-api/). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, jota tarvitaan Hue -sovellusliittymän vastauksen analysointiin, asenna versio 5.x Arduinon kirjastonhallinnan kautta (Valikko "Luonnos"> Sisällytä kirjasto> Hallinnoi Kirjastot> etsi ArduinoJson ja vaihda versio uusimpaan 5.x). Versio 6 (tällä hetkellä beta -versio) aiheuttaa virheen. // muuttujat ja init: Merkkijonovaste; const int redPin = 13; // Wemosissa tämä on d7 const int greenPin = 12; // Wemosissa tämä on d6 const int bluePin = 14; // Wemosissa tämä on d5 const int touchSensor = 5; // Wemosissa on d1 const int aktivointiPin = 4; // Wemosissa tämä on d2 bool -aktivointi = HIGH; bool touch = LOW; const char* aan_restore; int bri_restore; kaksinkertainen x_restore; kaksinkertainen y_restore; kaksinkertainen x_magic; kaksinkertainen y_magic; bool ensin = totta; allekirjoittamaton pitkä käynnistysMillis; allekirjoittamaton pitkä virtaMillis; allekirjoittamaton pitkä kestoMillis; RestClient -asiakas = RestClient ("192.168.178.23"); // "Hue Bridgen IP -osoitteesi" // Jos et tiedä Hue Bridgen IP -osoitetta, käy osoitteessa https://discovery.meethue.com ja se näkyy heti selaimessasi. IP -osoite on pisteviiva, jota edeltää "internalipaddress" void setup () {analogWriteRange (255); Sarja.alku (9600); // Aloita LED -valon ollessa sammutettuna. pinMode (aktivointiPin, INPUT_PULLUP); pinMode (touchSensor, INPUT); startMillis = millis (); checkWand (); } void loop () {// mitään tekemistä täällä, jätä tyhjäksi…} void checkWand () {int rgbColour [3]; // James Hartonin RGB -värikoodi, https://gist.github.com/jamesotron/766994 // Aloita punaisella. rgbVäri [0] = 255; rgbVäri [1] = 0; rgbVäri [2] = 0; aktivointi = digitalRead (aktivointiPin); // LOW tarkoittaa, että sauvaa käytetään. touch = digitalRead (touchSensor); // HIGH tarkoittaa, että sauvaa käytetään sormella, mikä ei saisi olla. while (aktivointi == LOW && touch == LOW) {// Valitse värit, joita haluat lisätä ja pienentää. for (int decColour = 0; decColour <3; decColour += 1) {int incColour = decColour == 2? 0: decColour + 1; // = kolmiosainen operaattori, tarkoittaa: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // häivytä kaksi väriä. for (int i = 0; i <255; i += 1) {rgbColour [decColour] -= 1; rgbColour [incColour] += 1; // Koska RGB -ledissämme on yhteinen anodi katodin sijasta (joten meidän on muodostettava yhteys +3,3 V: een maan sijasta), tarvitsemme käänteiset arvot RGB: lle: int red = 255 - rgbColour [0]; int vihreä = 255 - rgbColour [1]; int sininen = 255 - rgbVäri [2]; analogWrite (punainenPin, punainen); analogWrite (vihreäPin, vihreä); analogWrite (sininenPin, sininen); viive (8); aktivointi = digitalRead (aktivointiPin); if (aktivointi == KORKEA) {// HIGH tarkoittaa, että sauva nostetaan. goto stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - startMillis); if (durationMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } else {// laita Wemos lepotilaan: ESP.deepSleep (0); }} tyhjä RGBtoxy (int punainen, int vihreä, int sininen) {// katso https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = kartta (punainen, 0, 255, 0, 1000); R /= 1000; kaksinkertainen G = kartta (vihreä, 0, 255, 0, 1000); G /= 1000; kaksinkertainen B = kartta (sininen, 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); kaksinkertainen X = R * 0,649926f + G * 0,103455f + B * 0,197109f; kaksinkertainen Y = R * 0,234327f + G * 0,743075f + B * 0,022598f; kaksinkertainen Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; kaksinkertainen x = X / (X + Y + Z); kaksinkertainen y = Y / (X + Y + Z); // muunnos ei ole täysin valmis, mutta luultavasti tarpeeksi hyvä siihen, mitä haluamme saavuttaa, joten jätä se tähän ja lähetä XY -arvot lampulle: sendtoHue (x, y); } void sendtoHue (kaksinkertainen a, kaksinkertainen b) {// todellinen värinmuutos sauvan taikuudesta, jos (ensimmäinen) {// ensimmäinen siirto: saat lampun nykyisen tilan getCurrentValues (); } // lähetä sitten taikasauvan värit: // odota oikeinkirjoitusta: pitkä odotus; x_magia = a; y_magic = b; // lamppu palaa taikasauvan värissä: response = ""; int temp = satunnainen (2, 9); const char* tila = "tosi"; for (int i = 1; i <= temp; i ++) {// luo char -matriisi, joka lähetetään siltaan: String temp_body1 = "{" on / ":" + String (state) + ", \" bri / ": 220, / "xy \": [" + merkkijono (x_magic) +", " + merkkijono (y_magic) +"], / "siirtymisaika \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // nyt meillä on post_body1 char -matriisina; // soita lepopuhelu: int statusCodePut1 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body1, & response); odota = satunnainen (100, 600); viive (odota); if (state == "true") {state = "false"; } else {state = "true"; }} // vähentää kirkkautta…: response = ""; lämpötila = satunnainen (4, 17); // luo char -matriisi lähetettäväksi siltaan: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" siirtymisaika / ":" + Jono (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // nyt meillä on post_body2 char -matriisina; // soita lepopuhelu: int statusCodePut2 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body2, & response); odota = satunnainen (1000, 2500); viive (odota); //..ja kirkastaa jälleen: response = ""; lämpötila = satunnainen (4, 17); // luo char -matriisi lähetettäväksi siltaan: String temp_body3 = "{" bri_inc / ": 100, \" siirtymisaika / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // nyt meillä on post_body3 char -matriisina; // soita lepopuhelu: int statusCodePut3 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body3, & response); odota = satunnainen (2500, 5000); // odota 2-5 sekunnin viive (odota); // ja häivy takaisin vanhaan arvoon: response = ""; // luo char -matriisi lähetettäväksi siltaan: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": [" + Merkkijono (x_restore) +", " + merkkijono (y_restore) +"], / "siirtymäaika \": " + merkkijono (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // nyt post_body4 on char -taulukko; // soita lepopuhelu: int statusCodePut4 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body4, & response); ESP.deepSleep (0); // mennään taas nukkumaan … } unsigned int getCurrentValues () {connectWifi (); // muodosta ensin yhteys Wifi -vastaukseen = ""; // soita lepopuhelu: int statusCodeGet = client.get ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER", & response); Serial.print ("Tilakoodi palvelimelta GET: n jälkeen"); Serial.println (statusCodeGet); Serial.print ("Response body from server:"); Serial.println (vastaus); StaticJsonBuffer jsonBuffer; // Json -vastauksen jäsentäminen // Objektipuun juuri. // // Se on viittaus JsonObjectiin, todelliset tavut ovat // jsonBufferin sisällä kaikkien muiden objektipuun solmujen kanssa. // Muisti vapautuu, kun jsonBuffer poistuu laajuudesta. JsonObject & root = jsonBuffer.parseObject (vastaus); JsonObject & state = root ["state"]; // Testaa, onnistuuko jäsennys. jos (! root.success ()) {Serial.println ("parseObject () epäonnistui"); } // Hae arvot. aan_restore = tila ["päällä"]; Serial.println (aan_restore); bri_restore = tila ["bri"]; x_restore = tila ["xy"] [0]; y_restore = tila ["xy"] [1]; first = false;} void connectWifi () {// Paikallinen alustus. Kun sen liiketoiminta on valmis, sitä ei tarvitse pitää WiFiManager wifiManagerin ympärillä; // nollaa asetukset - testausta varten: //wifiManager.resetSettings (); // aseta takaisinsoitto, joka soitetaan, kun yhteys edelliseen WiFi -verkkoon epäonnistuu, ja siirtyy tukiasematilaan wifiManager.setAPCallback (configModeCallback); // hakee SSID: n ja passin ja yrittää muodostaa yhteyden // jos se ei muodosta yhteyttä, se aloittaa tukiaseman määritetyllä nimellä // tässä "AutoConnectAP" // ja siirtyy estosilmukkaan, joka odottaa määritystä, jos (! wifiManager.autoConnect ()) {Serial.println ("yhdistäminen epäonnistui ja aikakatkaisu epäonnistui"); // nollaa ja yritä uudelleen, tai ehkä laita se nukkumaan ESP.reset (); viive (1000); } // jos tulet tänne, olet muodostanut yhteyden WiFi -sarjaan.println ("kytketty… joo:)"); Serial.print ("Yhdistetty:"); Serial.println (WiFi. SSID ()); Serial.print ("IP -osoite:"); Serial.println (WiFi.localIP ()); // ESP: lle määritetty IP -osoite (Wemos) // tulosta vastaanotetun signaalin voimakkuus: pitkä rssi = WiFi. RSSI (); Serial.print ("signaalin voimakkuus (RSSI):"); Sarja.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Asetettu kokoonpanotila"); Serial.println (WiFi.softAPIP ()); // jos käytit automaattisesti luotua SSID: tä, tulosta se Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Suositeltava: