Taula de continguts:

Hue Magic: 4 passos (amb imatges)
Hue Magic: 4 passos (amb imatges)

Vídeo: Hue Magic: 4 passos (amb imatges)

Vídeo: Hue Magic: 4 passos (amb imatges)
Vídeo: СВИСТОК СМЕРТИ ночью НА КЛАДБИЩЕ / Призрак ребёнка в видео / Aztec Death Whistle 2024, Desembre
Anonim
Image
Image

Benvinguts bruixots!

Fa un parell de mesos vaig crear una petita caixa màgica amb vareta per al meu fill de 3 anys. Quan toqui la caixa amb la vareta, començarà a emetre-se una llum de color canviant. Quan veu un color que li agrada especialment, pot apuntar la vareta cap al llum de taula (amb una bombeta Philips Hue a l’interior), llançar un encanteri i el color de la caixa saltarà màgicament al llum. De sobte, la llum i la llum de la caixa tenen el mateix color …

Al cap d’uns segons, el color s’esvaeix i el llum de taula torna al seu estat abans de l’encanteri. Fins que es llança un nou encanteri …

Pas 1: què necessiteu per crear aquest projecte

Què necessiteu per crear aquest projecte
Què necessiteu per crear aquest projecte
Què necessiteu per crear aquest projecte
Què necessiteu per crear aquest projecte
Què necessiteu per crear aquest projecte
Què necessiteu per crear aquest projecte

Per crear aquest projecte, necessitareu els materials següents:

    • 1 (o més) bombeta de color Philips Hue i un pont Hue
    • 1 microcontrolador Wemos D1 mini o similar basat en esp8266
    • 1 sensor tàctil (Arduino) (per exemple, TTP223R)
    • 1 botó momentani (Arduino)
    • 1 condensador de 10uF
    • 1 LED RGB (tipus d'ànode comú)
    • 5 resistències (10, 22 i 47 Ohm, 2x 10K Ohm)
    • 2 PCB de prototipatge petits (2x3 polzades o aproximadament 5x7 cm han de ser prou grans)
    • alguns cables (pont)
    • un soldador
    • una vareta màgica (es pot comprar com a feta a la botiga de joguines o la podeu fer vosaltres mateixos)
    • una caixa petita de cartró o fusta (pot ser una caixa existent, però també es pot construir una caixa des de zero)
    • una mica de cinta
    • una mica de cola i / o femelles i cargols per muntar els PCB a la caixa.
    • opcional: paper d'embalatge per a la caixa

NB: Una mica d’experiència en la lectura de diagrames de circuits és útil quan es passa per aquesta instrucció. El meu diagrama no és massa complex: si podeu diferenciar un condensador d’una resistència, probablement estareu bé.

Alguna experiència amb la programació d’Arduino mitjançant l’IDE Arduino també és útil. L’experiència més aviat bàsica hauria de ser suficient, ja que us proporcionaré el codi complet perquè pugueu copiar / enganxar. Tot i així, haureu d’adaptar algunes coses perquè funcioni en la vostra configuració particular (per exemple, la configuració de xarxa i alguns detalls de la configuració de Hue). Si us sembla una mica intimidatori, no us preocupeu, us ajudaré a recuperar tota la informació que necessiteu.

Pas 2: The Box & Wand

La caixa i la vareta
La caixa i la vareta
La caixa i la vareta
La caixa i la vareta

Els primers passos solen ser els més difícils, però no en aquest instructiu. Per començar fàcilment, només podeu comprar una vareta màgica en una botiga de joguines i, per a la caixa, podeu tornar a utilitzar una caixa petita que ja teniu al voltant. Assegureu-vos que la caixa no sigui de metall, ja que bloquejarà els senyals wifi i els necessitarem per a la màgia;-).

Quan reutilitzeu una caixa existent, l'únic que heu de fer és fer dos forats a la part superior de la caixa: 1 forat petit (mida 5 mm = 0,2 ") per al led RGB i un forat més gran (al voltant de 12 14 mm o aproximadament 0,5 ") per al sensor tàctil.

La ubicació exacta dels forats no és crítica, només cal que els col·loqueu segons el vostre sentit estètic, però tingueu en compte algunes coses:

  • Mantingueu una certa distància entre els dos forats per assegurar-vos que els components que es muntaran sota els forats (el led RGB i el sensor tàctil) puguin ocupar prou espai per al muntatge i el cablejat.
  • El forat més gran és per al sensor tàctil. Aquest sensor es muntarà just a sota del forat, de manera que pugui ser tocat (i fins i tot una mica pressionat) per la vareta. Així que assegureu-vos que la vareta que compreu no sigui massa gruixuda.

Opcionalment, podeu utilitzar pintura (esprai) o paper d’embalar i tapar plàstic per fer la caixa una mica més bonica i per protegir-la dels vessaments d’aliments i de les mans brutes.

Si aquest primer pas és una mica massa poc ambiciós per al vostre gust, seguiu endavant i creeu una caixa i vareteu completament des de zero. Hi ha diversos tipus d’instructibles que us ajudaran a crear una bella vareta

Sigui quin sigui el camí que trieu, ara és hora d’explorar l’interior del quadre.

Pas 3: el maquinari a dins

El maquinari a dins
El maquinari a dins
El maquinari a dins
El maquinari a dins
El maquinari a dins
El maquinari a dins

Utilitzeu un soldador per connectar els components electrònics segons el diagrama del circuit anterior. Hi ha un parell de coses a les quals cal prestar especial atenció:

  • Els cables entre el Wemos D1 Mini i el LED RGB haurien de ser prou llargs perquè el LED RGB es pugui muntar al forat que heu fet a la tapa de la caixa.
  • El mateix compte per als cables connectats a l’interruptor momentani i al sensor tàctil, ja que haurien de ser accessibles per l’altre forat de la tapa.
  • El botó de l’interruptor momentani s’ha d’enganxar a la part inferior (el costat no sensible) del sensor tàctil, de manera que pugui tornar a posar el botó a l’interruptor momentani amb el sensor tàctil enganxat a la part superior (vegeu la imatge). El sensor tàctil està muntat a la part superior del commutador momentani per detectar les pulsacions de botó fetes amb un dit, en aquest cas s’ignorarà la pulsació de botó. Només quan es prem el botó amb la vareta màgica (que no hauria de ser conductora, de manera que els plàstics i la fusta estan bé), començarà el cicle màgic.
  • Munteu el botó momentani amb el sensor tàctil a la part superior, no massa a sota del forat de la tapa, perquè ha de ser accessible per la vareta màgica per posar en marxa la màgia.
  • Assegureu-vos d’observar la polaritat del condensador en soldar-lo. Si inverteix els conductors positius i negatius, és probable que el condensador emeti fum màgic i posi el vostre circuit en un son etern.
  • Enganxeu, tapeu o cargoleu el suport de la bateria i els PCB en el seu lloc. No ha de ser ordenat, ja que no serà a la vista. Només hauria de ser una prova de caiguda.

Accediu al programari.

Pas 4: el programari

Assegureu-vos que teniu l’editor de programari Arduino (gratuït) més recent, que es pot descarregar a https://www.arduino.cc/en/Main/Software. Per afegir compatibilitat amb el Wemos D1 mini i altres plaques basades en ESP8266, seguiu els passos següents:

  • Després de la instal·lació, inicieu el programari Arduino i obriu la finestra Preferències.
  • Introduïu https://arduino.esp8266.com/stable/package_esp8266com_index.json al camp "URL addicionals del gestor de taules". Podeu afegir diversos URL separant-los amb comes.
  • Obriu el Gestor de taules des del menú Eines> Tauler i instal·leu la plataforma esp8266 (i no oblideu seleccionar la vostra placa ESP8266 des del menú Eines> Tauler després de la instal·lació. "LOLIN (WEMOS) D1 R2 & mini" funciona millor per a Wemos D1 mini v2 i v3 taulers.

Si necessiteu més ajuda per instal·lar Arduino i configurar els controladors, podeu consultar

A l'editor Arduino, obriu un fitxer nou (Fitxer> Nou) i copieu / enganxeu el codi següent a la finestra que s'acaba d'obrir. Només heu de sobreescriure les línies que ja són presents a la finestra nova (configuració buida i bucle buit).

Ara ja esteu a punt, però haureu d’adaptar algunes peces del codi per a la vostra configuració particular.

El primer que heu de fer és canviar l'adreça IP de la línia 34 (a l'editor Arduino les línies de codi estan numerades) per l'adreça IP del vostre pont Hue. Si no coneixeu la vostra adreça IP de Hue Bridge, visiteu https://discovery.meethue.com/ i l'adreça IP adequada apareixerà immediatament al vostre navegador. L'adreça IP és el número de punts que va precedit per "internalipaddress".

Per comunicar-vos amb els llums Hue, haureu de crear un usuari de l'API Hue per al Wemos D1 mini, de manera que Wemos pugui comunicar-se amb el llum Hue mitjançant l'API Hue. Per fer-ho, seguiu les instruccions a https://developers.meethue.com/develop/get-started-2/ i copieu / enganxeu el nom d'usuari generat (força llarg) a la finestra del codi Arduino. Només cal que substituïu tots els "NOM D'USUARI DE L'API HUE HUE" pel nom d'usuari de l'API generat.

A continuació, heu de seleccionar la llum Hue adequada per canviar de color. A l'API Hue cada llum té un número, de manera que heu d'esbrinar el número que correspon a la llum que voleu utilitzar per a aquest projecte. Una de les maneres més senzilles d’esbrinar quin número té una llum concreta és descarregar l’aplicació Hue Viewer per a Android o iOS. Substituïu el text "EL VOSTRE NÚMERO LLUM" pel número correcte a tot arreu a la finestra del codi Arduino.

L'últim que cal fer és configurar els Wemos per connectar-se a la vostra xarxa wifi. Això es fa carregant el codi a Wemos i al portàtil canvieu a una altra xarxa wifi: a "AutoConnectAP". El navegador mostrarà una pàgina on podeu afegir el SSID (nom) i la contrasenya de la vostra xarxa wifi que el controlador Wemos utilitzarà per connectar-vos a la vostra xarxa wifi (i al pont Hue).

Nota: si no pengeu el codi al nostre Wemos D1 mini per USB, és possible que hàgiu de descarregar un controlador per al xip USB del Wemos. Es pot descarregar un controlador per a la vostra plataforma (Windows, Mac) a

Ara esteu a punt per provar la vostra creació.

// Vareta màgica ESP8266 Hue // Richard van Kampen - 2018 // Aquest codi es prova en un Wemos D1 mini, però probablement també funcionarà en altres plaques de desenvolupament basades en ESP8266 // Per afegir suport per a Wemos D1 mini i altres plaques ESP8266 a l'editor Arduino, seguiu els passos següents: // - Inicieu Arduino i obriu la finestra Preferències. // - Introduïu https://arduino.esp8266.com/stable/package_esp8266com_index.json al camp URL del gestor de taules addicionals. Podeu afegir diversos URL separant-los amb comes. // - Obriu el Gestor de taules des del menú Eines> Tauler i instal·leu la plataforma esp8266 (i no us oblideu de seleccionar el tauler ESP8266 des del menú Eines> Tauler després de la instal·lació). // biblioteques usades: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Servidor DNS local utilitzat per redirigir totes les sol·licituds al portal de configuració WiFiManager si no hi ha cap configuració WIFI (SSID, contrasenya) encara no s'ha definit. #include "ESP8266WebServer.h" // Local WebServer utilitzat per servir el portal de configuració de WiFiManager #include "WiFiManager.h" // Biblioteca de configuració de WiFi Magic, si encara no està instal·lat, consulteu https://github.com/tzapu/WiFiManager # install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, necessari per utilitzar l'API Philips Hue (vegeu https://developers.meethue.com/develop/ tonalitat-api /). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, necessari per analitzar la resposta de l'API Hue, instal·leu la versió 5.x mitjançant el gestor de la biblioteca a Arduino (menú "Sketch"> Inclou biblioteca> Gestiona Biblioteques> cerqueu ArduinoJson i canvieu la versió a la darrera versió 5.x). La versió 6 (actualment en versió beta) genera un error. // variables i init: resposta de cadena; const int redPin = 13; // a Wemos això és d7 const int greenPin = 12; // a Wemos això és d6 const int bluePin = 14; // a Wemos això és d5 const int touchSensor = 5; // a Wemos això is d1 const int activationPin = 4; // on Wemos this is d2 bool activation = HIGH; tacte bool = BAIX; const char * aan_restore; int bri_restore; doble x_restore; doble y_restore; doble x_magic; doble y_magic; bool primer = cert; inici llarg sense signar Millis; llarg sense signar currentMillis; Millis de llarga durada sense signar; RestClient client = RestClient ("192.168.178.23"); // "la vostra adreça IP de Hue Bridge" // Si no coneixeu la vostra adreça IP de Hue Bridge, visiteu https://discovery.meethue.com i apareixerà immediatament al navegador. L'adreça IP és el número de punts que ve precedit per "internalipaddress" void setup () {analogWriteRange (255); Serial.begin (9600); // Comenceu amb el LED apagat. pinMode (activationPin, INPUT_PULLUP); pinMode (touchSensor, INPUT); startMillis = millis (); checkWand (); } void loop () {// res a fer aquí, deixeu-lo en blanc …} void checkWand () {int rgbColour [3]; // Codi de color RGB de James Harton, https://gist.github.com/jamesotron/766994 // Comenceu amb el vermell. rgbColour [0] = 255; rgbColour [1] = 0; rgbColour [2] = 0; activation = digitalRead (activationPin); // LOW significa que s’utilitza la vareta. touch = digitalRead (touchSensor); // HIGH significa que s’utilitza el dit en lloc de vareta, cosa que no hauria de ser el cas. while (activació == BAIX && touch == BAIX) {// Trieu els colors que voleu incrementar i disminuir. for (int decColour = 0; decColour <3; decColour + = 1) {int incColour = decColour == 2? 0: decColour + 1; // = operador ternari, significa: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // esvaeix els dos colors. for (int i = 0; i <255; i + = 1) {rgbColour [decColour] - = 1; rgbColour [incColour] + = 1; // com que el nostre LED RGB té un ànode comú en lloc de càtode (per tant, hem de connectar-nos a + 3,3 V en lloc de terra), necessitem valors inversos per a RGB: int red = 255 - rgbColour [0]; int green = 255 - rgbColour [1]; blau int = 255 - color rgb [2]; analogWrite (redPin, vermell); analogWrite (greenPin, green); analogWrite (bluePin, blau); retard (8); activation = digitalRead (activationPin); if (activació == HIGH) {// HIGH significa que la vareta s'aixeca. anar a stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (Milla actual - Milla inicial); if (durationMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } else {// posa Wemos al mode de repòs: ESP.deepSleep (0); }} void RGBtoxy (int vermell, int verd, blau int) {// vegeu https://developers.meethue.com/documentation/color-conversions-rgb-xy doble R = mapa (vermell, 0, 255, 0, 1000); R / = 1000; doble G = mapa (verd, 0, 255, 0, 1000); G / = 1000; doble B = mapa (blau, 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); doble X = R * 0.649926f + G * 0.103455f + B * 0.197109f; doble Y = R * 0.234327f + G * 0.743075f + B * 0.022598f; doble Z = R * 0,0000000f + G * 0,053077f + B * 1,035763f; doble x = X / (X + Y + Z); doble y = Y / (X + Y + Z); // la conversió no s'ha completat completament, però probablement sigui prou bona per al que volem aconseguir, així que deixeu-la així i envieu els valors XY a lamp: sendtoHue (x, y); } void sendtoHue (doble a, doble b) {// canvi de color real de màgia de vareta si (primer) {// primer pas: obtingueu l'estat actual de la llum getCurrentValues (); } // a continuació, envieu els colors de la vareta màgica: // espereu l’encís: espera llarga; x_magic = a; y_magic = b; // llum en color de vareta màgica: resposta = ""; int temp = aleatori (2, 9); const char * state = "true"; for (int i = 1; i <= temp; i ++) {// crea una matriu de caràcters per enviar al pont: String temp_body1 = "{" on / ":" + String (state) + ", \" bri / ": 220, / "xy \": ["+ String (x_magic) +", "+ String (y_magic) +"], / "transitiontime \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // ara tenim post_body1 com a matriu de caràcters; // fer una trucada de repòs: int statusCodePut1 = client.put ("/ api / YOUR HUE API USERNAME / lights / YOUR LIGHT NUMBER / state", post_body1, & response); espera = aleatori (100, 600); retard (esperar); if (state == "true") {state = "false"; } else {state = "true"; }} // redueix la brillantor …: resposta = ""; temp = aleatori (4, 17); // crear una matriu de caràcters per enviar al pont: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" transitiontime / ":" + String (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // ara tenim post_body2 com a matriu de caràcters; // fer una trucada de repòs: int statusCodePut2 = client.put ("/ api / YOUR HUE API USERNAME / lights / YOUR LIGHT NUMBER / state", post_body2, & response); espera = aleatori (1000, 2500); retard (esperar); //..i torna a ser més brillant: resposta = ""; temp = aleatori (4, 17); // crear una matriu de caràcters per enviar-la al pont: String temp_body3 = "{" bri_inc / ": 100, \" transitiontime / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // ara tenim post_body3 com a matriu de caràcters; // fer una trucada de repòs: int statusCodePut3 = client.put ("/ api / YOUR HUE API USERNAME / lights / YOUR LIGHT NUMBER / state", post_body3, & response); espera = aleatori (2500, 5000); // espereu 2-5 segons de retard (espereu); // i retrocedeix al valor anterior: resposta = ""; // crear una matriu de caràcters per enviar al pont: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": ["+ String (x_restore) +", "+ String (y_restore) +"], / "transitiontime \": "+ String (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // ara tenim post_body4 com a matriu de caràcters; // fer una trucada de repòs: int statusCodePut4 = client.put ("/ api / YOUR HUE API USERNAME / lights / YOUR LIGHT NUMBER / state", post_body4, & response); ESP.deepSleep (0); // tornar a dormir … } unsigned int getCurrentValues () {connectWifi (); // primer connectar-se a la resposta de Wifi = ""; // fer una trucada de repòs: int statusCodeGet = client.get ("/ api / YOUR HUE API USERNAME / lights / YOUR LIGHT NUMBER", & resposta); Serial.print ("Codi d'estat del servidor després de GET:"); Serial.println (statusCodeGet); Serial.print ("Cos de resposta del servidor:"); Serial.println (resposta); StaticJsonBuffer jsonBuffer; // Anàlisi de la resposta Json // Arrel de l'arbre d'objectes. // // És una referència a JsonObject, els bytes reals es troben dins del // jsonBuffer amb tots els altres nodes de l'arbre d'objectes. // La memòria s’allibera quan jsonBuffer surt de l’abast. JsonObject & root = jsonBuffer.parseObject (resposta); JsonObject & state = root ["state"]; // Prova si l'anàlisi té èxit. if (! root.success ()) {Serial.println ("parseObject () ha fallat"); } // Obtén valors. aan_restore = state ["on"]; Serial.println (aan_restore); bri_restore = estat ["bri"]; x_restore = state ["xy"] [0]; y_restore = state ["xy"] [1]; first = false;} void connectWifi () {// Intialització local. Un cop realitzat el seu negoci, no cal mantenir-lo al voltant de WiFiManager wifiManager; // restableix la configuració: per provar: //wifiManager.resetSettings (); // defineix la devolució de trucada que es crida quan es connecta a una connexió WiFi anterior i entra al mode de punt d'accés wifiManager.setAPCallback (configModeCallback); // obté ssid i passa i intenta connectar-se // si no es connecta, inicia un punt d’accés amb el nom especificat // aquí "AutoConnectAP" // i entra en un bucle de bloqueig esperant configuració si (! wifiManager.autoConnect ()) {Serial.println ("no s'ha pogut connectar i ha passat el temps d'espera"); // restableix i torna-ho a provar, o potser posa-ho a dormir profundament ESP.reset (); retard (1000); } // si arribeu aquí us heu connectat al WiFi Serial.println ("connectat … yeey:)"); Serial.print ("Connectat a:"); Serial.println (WiFi. SSID ()); Serial.print ("adreça IP:"); Serial.println (WiFi.localIP ()); // Adreça IP assignada al vostre ESP (Wemos) // imprimiu la intensitat del senyal rebut: long rssi = WiFi. RSSI (); Serial.print ("intensitat del senyal (RSSI):"); Serial.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Mode de configuració introduït"); Serial.println (WiFi.softAPIP ()); // si heu utilitzat SSID generat automàticament, imprimiu-lo Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Recomanat: