Съдържание:

Hue Magic: 4 стъпки (със снимки)
Hue Magic: 4 стъпки (със снимки)

Видео: Hue Magic: 4 стъпки (със снимки)

Видео: Hue Magic: 4 стъпки (със снимки)
Видео: Honor Magic 4 Pro - силно завръщане с Google услуги и топ камера! 2024, Септември
Anonim
Image
Image

Добре дошли магьосници!

Преди няколко месеца създадох малка магическа кутия с пръчка за моя 3 -годишен син. Когато докосне кутията с пръчката, променяща се цветна светлина ще започне да излъчва от кутията. Когато види цвят, който му харесва особено, той може да насочи пръчката към настолната лампа (с крушка Philips Hue вътре), да направи магия и цветът от кутията магически ще скочи към лампата! Лампата и светлината от кутията изведнъж имат същия цвят …

След няколко секунди цветът избледнява и настолната лампа се връща в състоянието си преди заклинанието. Докато не се направи ново заклинание …

Стъпка 1: Какво ви е необходимо, за да създадете този проект

Какво ви е необходимо, за да създадете този проект
Какво ви е необходимо, за да създадете този проект
Какво ви е необходимо, за да създадете този проект
Какво ви е необходимо, за да създадете този проект
Какво ви е необходимо, за да създадете този проект
Какво ви е необходимо, за да създадете този проект

За да създадете този проект, ще ви трябват следните материали:

    • 1 (или повече) цветна крушка Philips Hue и Hue Bridge
    • 1 Wemos D1 мини или подобен микроконтролер, базиран на esp8266
    • 1 (Arduino) сензор за докосване (например TTP223R)
    • 1 (Arduino) моментен бутон
    • 1 10uF кондензатор
    • 1 RGB светодиод (общ тип анод)
    • 5 резистора (10, 22 и 47 Ohm, 2x 10K Ohm)
    • 2 малки прототипирани платки (2x3 инча или около 5x7 cm трябва да са достатъчно големи)
    • някои (джъмперни) проводници
    • поялник
    • магическа пръчка (може да бъде закупена като готова в магазин за играчки или можете да я направите сами)
    • малка кутия, изработена от картон или дърво (може да бъде съществуваща кутия, но можете също така да изградите кутия от нулата, разбира се)
    • някаква лента
    • малко лепило и/или гайки и болтове за монтиране на печатни платки в кутията.
    • по избор: опаковъчна хартия за кутията

Забележка: Малко опит в четенето на електрически схеми е полезен при преминаване през тази инструкция. Моята диаграма не е прекалено сложна: ако можете да различите кондензатор от резистор, вероятно ще се оправите.

Известен опит с програмирането на Arduino с помощта на Arduino IDE също е полезен. По -скоро основният опит би трябвало да е достатъчен, тъй като ще ви предоставя пълния код, който да копирате/поставите. Ще трябва обаче да адаптирате няколко неща, за да може да работи във вашата конкретна настройка (напр. Вашите мрежови настройки и някои подробности от вашата конфигурация на Hue). Ако това звучи малко плашещо, не се притеснявайте, ще ви помогна да извлечете цялата информация, от която се нуждаете.

Стъпка 2: Кутията и пръчката

Кутията и пръчката
Кутията и пръчката
Кутията и пръчката
Кутията и пръчката

Първите стъпки обикновено са най -трудните, но не в тази инструкция! За лесен старт можете просто да си купите вълшебна пръчка от магазин за играчки, а за кутията можете просто да използвате повторно съществуваща малка кутия, която вече сте лежали. Просто се уверете, че кутията не е от метал, тъй като това ще блокира wifi сигналите и ние се нуждаем от тези за магията;-).

Когато пренастроите съществуваща кутия, единственото нещо, което трябва да направите, е да направите две дупки в горната част на кутията: 1 малък отвор (размер 5 мм = 0,2 ") за RGB светодиода и по-голям отвор (около 12- 14 мм или около 0,5 ") за сензора за докосване.

Точното разположение на дупките не е критично, просто ги поставете според вашето чувство за естетика, но имайте предвид няколко неща:

  • Запазете известно разстояние между двата отвора, за да сте сигурни, че компонентите, които ще бъдат монтирани под отворите (RGB светодиода и сензорът за докосване), могат да заемат достатъчно място за монтаж и окабеляване.
  • Най -големият отвор е за сензора за докосване. Този сензор ще бъде монтиран точно под отвора, по такъв начин, че да може да бъде докоснат (и дори леко натиснат) от пръчката. Затова се уверете, че пръчката, която купувате, не е твърде дебела!

По желание можете да използвате (спрей) боя или опаковъчна хартия и да покриете пластмаса, за да направите кутията си малко по -красива и да я предпазите от разливане на храна и мръсни ръце.

Ако тази първа стъпка е малко прекалено амбициозна по ваш вкус, моля, продължете и създайте кутия и пръчка изцяло от нулата! Има няколко инструкции, които ще ви помогнат да създадете красива пръчка

Какъвто и път да изберете, сега е време да проучите вътрешността на кутията.

Стъпка 3: Хардуерът вътре

Хардуерът отвътре
Хардуерът отвътре
Хардуерът отвътре
Хардуерът отвътре
Хардуерът отвътре
Хардуерът отвътре

Използвайте поялник, за да свържете електронните компоненти съгласно схемата по -горе. Има няколко неща, на които трябва да се обърне специално внимание:

  • Проводниците между Wemos D1 Mini и RGB светодиода трябва да са достатъчно дълги, за да могат RGB светодиодите да бъдат монтирани в отвора, който сте направили в капака на кутията.
  • Същото се отчита и за проводниците, прикрепени към превключвателя за моментни действия и сензора за докосване, тъй като те трябва да бъдат достъпни през другия отвор в капака.
  • Бутонът на моментния превключвател трябва да бъде залепен към долната страна (нечувствителната страна) на сензора за докосване, по такъв начин, че да можете да поставите бутона обратно върху превключвателя за момент, като сензорът за докосване е залепен отгоре (вижте снимката). Сензорът за докосване е монтиран отгоре на моментния превключвател, за да открие натискането на бутони, извършено с пръст, в този случай натискането на бутона ще бъде игнорирано. Само когато бутонът е натиснат от магическата пръчка (която трябва да е непроводима, така че пластмасите и дървото са добре), магическият цикъл ще започне.
  • Монтирайте моменталния бутон със сензор за докосване отгоре, не твърде дълбоко под отвора в капака, защото той трябва да бъде достъпен от магическата пръчка, за да задейства магията.
  • Не забравяйте да спазвате полярността на кондензатора, когато го запоявате. Ако обърнете положителните и отрицателните проводници, кондензаторът вероятно ще излъчи малко вълшебен дим и ще постави веригата ви в вечен сън.
  • Залепете, залепете или завийте държача на батерията и печатната платка (и). Не е задължително да е спретнато, тъй като няма да се вижда. Трябва да е само доказателство за падане.

Към софтуера!

Стъпка 4: Софтуерът

Уверете се, че имате най -новия (безплатен) софтуерен редактор на Arduino, който може да бъде изтеглен от https://www.arduino.cc/en/Main/Software. За да добавите поддръжка за Wemos D1 mini и други базирани на ESP8266 платки, направете следните стъпки:

  • След инсталирането стартирайте софтуера Arduino и отворете прозореца Предпочитания.
  • Въведете https://arduino.esp8266.com/stable/package_esp8266com_index.json в полето „Допълнителни URL адреси на мениджъра на борда“. Можете да добавите няколко URL адреса, като ги разделите със запетаи.
  • Отворете Boards Manager от Tools> Board menu и инсталирайте платформата esp8266 (и не забравяйте да изберете вашата ESP8266 board от Tools> Menu board след инсталирането. "LOLIN (WEMOS) D1 R2 & mini" работи най -добре за Wemos D1 mini v2 и v3 дъски.

Ако имате нужда от повече помощ при инсталирането на Arduino и настройването на драйверите, можете да разгледате

В редактора на Arduino отворете нов файл (File> New) и копирайте/поставете кода по -долу в току -що отворения прозорец. Просто презапишете редовете, които вече присъстват в новия прозорец (void setup и void loop).

Вече сте почти готови, но ще трябва да адаптирате няколко части от кода за вашата конкретна настройка.

Първото нещо, което трябва да направите, е да промените ip адреса на ред 34 (в редактора на Arduino редовете с код са номерирани) в ip адреса на вашия Hue мост. Ако не знаете вашия IP адрес на Hue Bridge, посетете https://discovery.meethue.com/ и десният IP адрес ще се появи веднага в браузъра ви. IP адресът е пунктираният номер, предшестван от "internalipaddress".

За да комуникирате със светлините на Hue, ще трябва да създадете Hue API потребител за Wemos D1 mini, така че Wemos да може да комуникира с Hue light чрез Hue API. За да направите това, следвайте инструкциите на https://developers.meethue.com/develop/get-started-2/ и копирайте/поставете генерираното (доста дълго) потребителско име в прозореца на кода на Arduino. Просто заменете всеки „ВАШ HUE API USERNAME“с генерираното потребителско име за API.

След това трябва да изберете правилната Hue светлина, за да промените цвета. В Hue API всяка светлина има номер, така че трябва да разберете номера, който съответства на светлината, която искате да използвате за този проект. Един от най -лесните начини да разберете кой номер има определена светлина, е да изтеглите приложението Hue Viewer за Android или iOS. Заменете текста „ВАШИЯТ СВЕТЛЕН НОМЕР“с правилния номер навсякъде в прозореца на кода на Arduino.

Последното нещо, което трябва да направите, е да настроите Wemos да се свързва с вашата wifi мрежа. Това става чрез качване на кода в Wemos и на вашия лаптоп превключете към друга wifi мрежа: към „AutoConnectAP“. След това вашият браузър ще покаже страница, където можете да добавите SSID (име) и парола на вашата wifi мрежа, която контролерът Wemos ще използва за свързване към вашата wifi мрежа (и към моста Hue).

Забележка: Ако качването на кода в нашия Wemos D1 mini чрез USB не работи, може да се наложи да изтеглите драйвер за USB чипа на Wemos. Драйвер за вашата платформа (Windows, Mac) може да бъде изтеглен на адрес

Вече сте готови да тествате своето творение!

// ESP8266 Hue Magic Wand // Ричард ван Кампен - 2018 // Този код е тестван на Wemos D1 mini, но вероятно ще работи и на други базирани на ESP8266 платки за разработка // За добавяне на поддръжка за Wemos D1 mini и други платки ESP8266 към редактора на Arduino, направете следните стъпки: // - Стартирайте Arduino и отворете прозореца Предпочитания. // - Въведете https://arduino.esp8266.com/stable/package_esp8266com_index.json в полето Допълнителни URL адреси на мениджъра на борда. Можете да добавите няколко URL адреса, като ги разделите със запетаи. // - Отворете Boards Manager от Tools> Board menu и инсталирайте платформата esp8266 (и не забравяйте да изберете вашата ESP8266 board от Tools> Board menu след инсталацията). // използвани библиотеки: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Локален DNS сървър, използван за пренасочване на всички заявки към конфигурационния портал на WiFiManager, ако няма настройки за WIFI (SSID, парола) все още не е настроено. #include "ESP8266WebServer.h" // Локален WebServer, използван за обслужване на конфигурационния портал на WiFiManager #include "WiFiManager.h" // WiFi Configuration Magic библиотека, ако все още не е инсталирана, моля, вижте https://github.com/tzapu/WiFiManager #install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, необходимо за използване на API на Philips Hue (вижте https://developers.meethue.com/develop/ оттенък-api/). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, необходимо за анализ на Hue API отговор, моля, инсталирайте версия 5.x чрез мениджъра на библиотеката в Arduino (Меню "Sketch"> Включване на библиотека> Управление Библиотеки> потърсете ArduinoJson и променете версията на най -новата версия 5.x). Версия 6 (в момента в бета версия) издава грешка. // променливи и init: String response; const int redPin = 13; // на Wemos това е d7 const int greenPin = 12; // на Wemos това е d6 const int bluePin = 14; // на Wemos това е d5 const int touchSensor = 5; // на Wemos това е d1 const int activationPin = 4; // на Wemos това е d2 bool активиране = HIGH; bool touch = LOW; const char* aan_restore; int bri_restore; двойно x_restore; двойно y_restore; двойно x_magic; двойна y_magic; bool first = true; неподписан дълъг стартMillis; неподписан дълъг токMillis; неподписана дълга продължителност Милис; RestClient клиент = RestClient ("192.168.178.23"); // "вашият IP адрес на Hue Bridge" // Ако не знаете вашия IP адрес на Hue Bridge, посетете https://discovery.meethue.com и той ще се появи веднага в браузъра ви. IP адресът е пунктираният номер, предшестван от "internalipaddress" void setup () {analogWriteRange (255); Serial.begin (9600); // Започнете с изключен светодиод. pinMode (activationPin, INPUT_PULLUP); pinMode (сензор за докосване, ВХОД); startMillis = millis (); checkWand (); } void loop () {// няма какво да правите тук, оставете празно…} void checkWand () {int rgbColour [3]; // RGB цветен код от Джеймс Хартън, https://gist.github.com/jamesotron/766994 // Започнете с червено. rgbColour [0] = 255; rgbColour [1] = 0; rgbColour [2] = 0; activation = digitalRead (activationPin); // LOW означава, че се използва пръчка. touch = digitalRead (touchSensor); // HIGH означава, че вместо пръчка се използва пръст, което не трябва да е така. while (активиране == LOW && touch == LOW) {// Изберете цветовете за увеличаване и намаляване. for (int decColour = 0; decColour <3; decColour += 1) {int incColour = decColour == 2? 0: decColour + 1; // = троичен оператор, означава: int incColour; if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // кръстосано избледняване на двата цвята. for (int i = 0; i <255; i += 1) {rgbColour [decColour] -= 1; rgbColour [incColour] += 1; // тъй като нашият RGB светодиод има общ анод вместо катод (затова трябва да се свържем към +3.3V вместо земя), имаме нужда от обратни стойности за RGB: int red = 255 - rgbColour [0]; int зелено = 255 - rgbColour [1]; int синьо = 255 - rgbColour [2]; analogWrite (redPin, червено); analogWrite (greenPin, зелен); analogWrite (bluePin, син); забавяне (8); activation = digitalRead (activationPin); if (активиране == HIGH) {// HIGH означава, че пръчката е вдигната. goto stopColorCycling; }}}} stopColorCycling: currentMillis = millis (); durationMillis = (currentMillis - startMillis); if (durationMillis> 1000) {RGBtoxy (rgbColour [0], rgbColour [1], rgbColour [2]); } else {// поставете Wemos в режим на заспиване: ESP.deepSleep (0); }} void RGBtoxy (int red, int green, int blue) {// вижте https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = map (red, 0, 255, 0, 1000); R /= 1000; двойно G = карта (зелено, 0, 255, 0, 1000); G /= 1000; двойно B = карта (синьо, 0, 255, 0, 1000); В /= 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); двойно X = R * 0.649926f + G * 0.103455f + B * 0.197109f; двоен Y = R * 0.234327f + G * 0.743075f + B * 0.022598f; двойно Z = R * 0.0000000f + G * 0.053077f + B * 1.035763f; двойно x = X / (X + Y + Z); двойно y = Y / (X + Y + Z); // преобразуването не е напълно завършено, но вероятно е достатъчно добро за това, което искаме да постигнем, затова го оставете на това и изпратете XY стойности към lamp: sendtoHue (x, y); } void sendtoHue (double a, double b) {// действителна промяна на цвета от магията на пръчката if (first) {// first pass: get current lamp state getCurrentValues (); } // след това изпратете цветове на вълшебна пръчка: // чакайте заклинание: дълго чакане; x_magic = a; y_magic = b; // включена лампа в цвят магическа пръчка: response = ""; int temp = случаен (2, 9); const char* state = "true"; for (int i = 1; i <= temp; i ++) {// създаване на масив от символи за изпращане до мост: String temp_body1 = "{" on / ":" + String (state) + ", \" bri / ": 220, / "xy \": [" + низ (x_magic) +", " + низ (y_magic) +"], / "преходно време \": 1} "; int str_len1 = temp_body1.length () + 1; char post_body1 [str_len1]; temp_body1.toCharArray (post_body1, str_len1); // сега имаме post_body1 като char масив; // направете повикване за почивка: int statusCodePut1 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body1, & response); чакане = произволно (100, 600); забавяне (изчакване); if (state == "true") {state = "false"; } else {state = "true"; }} // намаляване на яркостта …: response = ""; temp = случаен (4, 17); // създаване на масив от символи за изпращане до мост: String temp_body2 = "{" on / ": true, \" bri / ": 154, \" tranzitionntime / ":" + String (temp) + "}"; int str_len2 = temp_body2.length () + 1; char post_body2 [str_len2]; temp_body2.toCharArray (post_body2, str_len2); // сега имаме post_body2 като char масив; // направете повикване за почивка: int statusCodePut2 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body2, & response); чакане = произволно (1000, 2500); забавяне (изчакване); //..и направете отново по -ярка: response = ""; temp = случаен (4, 17); // създаване на масив от символи за изпращане до мост: String temp_body3 = "{" bri_inc / ": 100, \" transitionntime / ":}"; int str_len3 = temp_body3.length () + 1; char post_body3 [str_len3]; temp_body3.toCharArray (post_body3, str_len3); // сега имаме post_body3 като char масив; // направете повикване за почивка: int statusCodePut3 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body3, & response); чакане = произволно (2500, 5000); // изчакайте 2-5 секунди закъснение (чакане); // и избледняваме обратно към старата стойност: response = ""; // създаване на масив от символи за изпращане до мост: String temp_body4 = "{" on / ":" + String (aan_restore) + ", \" bri / ":" + String (bri_restore) + ", \" xy / ": [" + String (x_restore) +", " + String (y_restore) +"], / "transitionntime \": " + String (20) +"} "; int str_len4 = temp_body4.length () + 1; char post_body4 [str_len4]; temp_body4.toCharArray (post_body4, str_len4); // сега имаме post_body4 като char масив; // направете повикване за почивка: int statusCodePut4 = client.put ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER/state", post_body4, & response); ESP.deepSleep (0); // ще заспя отново …. } unsigned int getCurrentValues () {connectWifi (); // първо се свържете с Wifi отговор = ""; // направете повикване за почивка: int statusCodeGet = client.get ("/api/YOUR HUE API USERNAME/lights/YOUR LIGHT NUMBER", & response); Serial.print ("Код на състоянието от сървъра след GET:"); Serial.println (statusCodeGet); Serial.print ("Тяло на отговор от сървъра:"); Serial.println (отговор); StaticJsonBuffer jsonBuffer; // Разбор Json отговор // Корен на дървото на обектите. // // Това е препратка към JsonObject, действителните байтове са вътре в // jsonBuffer с всички останали възли на дървото на обектите. // Паметта се освобождава, когато jsonBuffer излезе от обхвата. JsonObject & root = jsonBuffer.parseObject (отговор); JsonObject & state = root ["state"]; // Проверява дали анализът е успешен. if (! root.success ()) {Serial.println ("parseObject () неуспешно"); } // Извличане на стойности. aan_restore = състояние ["включено"]; Serial.println (aan_restore); bri_restore = състояние ["bri"]; x_restore = състояние ["xy"] [0]; y_restore = състояние ["xy"] [1]; first = false;} void connectWifi () {// Локална инициализация. След като бизнесът му приключи, няма нужда да го държите около WiFiManager wifiManager; // нулиране на настройките - за тестване: //wifiManager.resetSettings (); // задава обратно повикване, което се извиква, когато свързването с предишна WiFi се провали, и влиза в режим на точка за достъп wifiManager.setAPCallback (configModeCallback); // извлича ssid и pass и се опитва да се свърже // ако не се свързва, стартира точка за достъп с посоченото име // тук „AutoConnectAP“// и влиза в блокиращ цикъл в очакване на конфигурация if (! wifiManager.autoConnect ()) {Serial.println ("неуспешно свързване и изчакване на изчакване"); // нулирайте и опитайте отново или може би го поставете в дълбок сън ESP.reset (); забавяне (1000); } // ако стигнете до тук, сте се свързали с WiFi Serial.println ("свързан … yeey:)"); Serial.print ("Свързан с:"); Serial.println (WiFi. SSID ()); Serial.print ("IP адрес:"); Serial.println (WiFi.localIP ()); // IP адрес, присвоен на вашия ESP (Wemos) // отпечатайте силата на получения сигнал: long rssi = WiFi. RSSI (); Serial.print ("сила на сигнала (RSSI):"); Serial.println (rssi); } void configModeCallback (WiFiManager * myWiFiManager) {Serial.println ("Въведен режим на конфигуриране"); Serial.println (WiFi.softAPIP ()); // ако сте използвали автоматично генериран SSID, отпечатайте го Serial.println (myWiFiManager-> getConfigPortalSSID ()); }

Препоръчано: