Spisu treści:

Hue Magic: 4 kroki (ze zdjęciami)
Hue Magic: 4 kroki (ze zdjęciami)

Wideo: Hue Magic: 4 kroki (ze zdjęciami)

Wideo: Hue Magic: 4 kroki (ze zdjęciami)
Wideo: RESET ŻARÓWKI PHILIPS HUE za pomocą pilota lub aplikacji 2024, Wrzesień
Anonim
Image
Image

Witamy czarodziejów!

Kilka miesięcy temu stworzyłam małe magiczne pudełko z różdżką dla mojego 3-letniego synka. Kiedy dotknie pudełka różdżką, z pudełka zacznie emitować zmieniające się kolorowe światło. Kiedy zobaczy kolor, który szczególnie mu się podoba, może skierować różdżkę w stronę lampy stołowej (z żarówką Philips Hue w środku), rzucić zaklęcie, a kolor z pudełka magicznie przeskoczy do lampy! Lampa i światło z pudełka nagle mają ten sam kolor…

Po kilku sekundach kolor znika, a lampa stołowa powraca do stanu sprzed zaklęcia. Dopóki nie zostanie rzucone nowe zaklęcie…

Krok 1: Czego potrzebujesz do stworzenia tego projektu

Czego potrzebujesz do stworzenia tego projektu
Czego potrzebujesz do stworzenia tego projektu
Czego potrzebujesz, aby stworzyć ten projekt
Czego potrzebujesz, aby stworzyć ten projekt
Czego potrzebujesz do stworzenia tego projektu
Czego potrzebujesz do stworzenia tego projektu

Do stworzenia tego projektu potrzebne będą następujące materiały:

    • 1 (lub więcej) kolorowa żarówka Philips Hue i mostek Hue
    • 1 Wemos D1 mini lub podobny mikrokontroler oparty na esp8266
    • 1 (Arduino) czujnik dotykowy (np. TTP223R)
    • 1 przycisk chwilowy (Arduino)
    • 1 kondensator 10uF
    • 1 dioda RGB (wspólny typ anody)
    • 5 rezystorów (10, 22 i 47 Ohm, 2x 10K Ohm)
    • 2 małe płytki do prototypowania (2x3 cale lub około 5x7 cm powinny być wystarczająco duże)
    • niektóre przewody (zworki)
    • lutownica
    • magiczna różdżka (można kupić jako gotowy w sklepie z zabawkami lub możesz zrobić to sam)
    • małe pudełeczko wykonane z tektury lub drewna (może być istniejącym pudełkiem, ale można też zbudować pudełeczko oczywiście od podstaw)
    • trochę taśmy
    • trochę kleju i/lub nakrętek i śrub do montażu płytek drukowanych w pudełku.
    • opcjonalnie: papier pakowy do pudełka

Uwaga: Podczas przechodzenia przez tę instrukcję pomocne jest odrobina doświadczenia w czytaniu schematów obwodów. Mój schemat nie jest zbyt skomplikowany: jeśli potrafisz odróżnić kondensator od rezystora, prawdopodobnie wszystko będzie dobrze.

Pomocne jest również doświadczenie z programowaniem Arduino przy użyciu Arduino IDE. Raczej podstawowe doświadczenie powinno wystarczyć, ponieważ udostępnię kompletny kod do skopiowania/wklejenia. Musisz jednak dostosować kilka rzeczy, aby działały w Twojej konkretnej konfiguracji (np. Ustawienia sieciowe i niektóre szczegóły z konfiguracji Hue). Jeśli brzmi to trochę onieśmielająco, nie martw się, pomogę ci odzyskać wszystkie potrzebne informacje.

Krok 2: Pudełko i różdżka

Pudełko i różdżka
Pudełko i różdżka
Pudełko i różdżka
Pudełko i różdżka

Pierwsze kroki są zwykle najtrudniejsze, ale nie w tym instruktażowym! Na początek możesz po prostu kupić magiczną różdżkę w sklepie z zabawkami, a do pudełka możesz po prostu ponownie użyć istniejącego małego pudełka, które już leżeć. Tylko upewnij się, że pudełko nie jest wykonane z metalu, ponieważ zablokuje to sygnały Wi-Fi, a te są nam potrzebne do magii;-).

Kiedy zmieniasz przeznaczenie istniejącego pudełka, jedyną rzeczą, którą musisz zrobić, to zrobić dwa otwory w górnej części pudełka: 1 mały otwór (rozmiar 5mm = 0,2 ) na diodę RGB i większy otwór (około 12- 14 mm lub około 0,5 cala dla czujnika dotykowego.

Dokładne rozmieszczenie otworów nie ma kluczowego znaczenia, po prostu umieść je zgodnie ze swoim poczuciem estetyki, ale pamiętaj o kilku rzeczach:

  • Zachowaj pewną odległość między obydwoma otworami, aby upewnić się, że elementy, które zostaną zamontowane pod otworami (dioda RGB i czujnik dotykowy), mogą zająć wystarczająco dużo miejsca do montażu i okablowania.
  • Największy otwór przeznaczony jest na czujnik dotyku. Czujnik ten zostanie zamontowany tuż pod otworem, w taki sposób, aby można go było dotknąć (a nawet lekko przycisnąć) różdżką. Upewnij się więc, że różdżka, którą kupujesz, nie jest zbyt gruba!

Opcjonalnie możesz użyć farby (sprayu) lub papieru pakowego i przykryć plastikiem, aby pudełko było trochę ładniejsze i ochronić je przed rozlaniem jedzenia i brudnymi rękami.

Jeśli ten pierwszy krok jest dla Ciebie trochę zbyt mało ambitny, śmiało stwórz pudełko i różdżkę całkowicie od podstaw! Istnieje kilka instrukcji, które pomogą Ci stworzyć piękną różdżkę

Niezależnie od wybranej ścieżki, nadszedł czas, aby zbadać wnętrze pudełka.

Krok 3: Wewnątrz sprzętu

Sprzęt wewnątrz
Sprzęt wewnątrz
Sprzęt wewnątrz
Sprzęt wewnątrz
Sprzęt wewnątrz
Sprzęt wewnątrz

Użyj lutownicy, aby połączyć elementy elektroniczne zgodnie z powyższym schematem obwodu. Należy zwrócić szczególną uwagę na kilka rzeczy:

  • Przewody między Wemos D1 Mini a diodą RGB powinny być wystarczająco długie, aby diodę RGB można było zamontować w otworze, który zrobiłeś w pokrywie pudełka.
  • To samo dotyczy przewodów podłączonych do przełącznika chwilowego i czujnika dotykowego, ponieważ powinny być one dostępne przez drugi otwór w pokrywie.
  • Przycisk przełącznika chwilowego należy przykleić do spodu (strona niewrażliwa) czujnika dotykowego w taki sposób, aby można było ponownie umieścić przycisk na przełączniku chwilowym z naklejonym czujnikiem dotykowym (patrz rysunek). Czujnik dotykowy jest zamontowany na górze przełącznika chwilowego, aby wykryć naciśnięcia przycisku wykonane palcem, w takim przypadku naciśnięcie przycisku zostanie zignorowane. Dopiero gdy przycisk zostanie wciśnięty za pomocą magicznej różdżki (która powinna być nieprzewodząca, więc plastik i drewno są w porządku), rozpocznie się magiczny cykl.
  • Zamontuj chwilowy przycisk z czujnikiem dotykowym na górze, niezbyt głęboko pod otworem w pokrywie, ponieważ musi być dostępny za pomocą magicznej różdżki, aby wprawić magię w ruch.
  • Upewnij się, że podczas lutowania przestrzegasz biegunowości kondensatora. Jeśli zamienisz przewody dodatnie i ujemne, kondensator prawdopodobnie wyemituje magiczny dym i wprawi obwód w wieczny sen.
  • Przyklej, taśmę i/lub przykręć uchwyt baterii i PCB na swoim miejscu. Nie musi być schludny, bo nie będzie go widać. Powinien być po prostu odporny na upadek.

Do oprogramowania!

Krok 4: Oprogramowanie

Upewnij się, że masz najnowszy (bezpłatny) edytor oprogramowania Arduino, który można pobrać ze strony https://www.arduino.cc/en/Main/Software. Aby dodać obsługę Wemos D1 mini i innych płyt opartych na ESP8266, wykonaj następujące czynności:

  • Po instalacji uruchom oprogramowanie Arduino i otwórz okno Preferencje.
  • Wpisz https://arduino.esp8266.com/stable/package_esp8266com_index.json w polu „Additional Board Manager URLs”. Możesz dodać wiele adresów URL, oddzielając je przecinkami.
  • Otwórz Menedżera tablic z menu Narzędzia > Tablica i zainstaluj platformę esp8266 (i nie zapomnij wybrać płyty ESP8266 z menu Narzędzia > Tablica po instalacji. "LOLIN(WEMOS) D1 R2 i mini" działa najlepiej dla Wemos D1 mini v2 i v3 deski.

Jeśli potrzebujesz więcej pomocy przy instalacji Arduino i konfiguracji sterowników, możesz zajrzeć na

W edytorze Arduino otwórz nowy plik (Plik>Nowy) i skopiuj/wklej poniższy kod w oknie, które właśnie się otworzyło. Po prostu nadpisz linie, które są już obecne w nowym oknie (ustawienie void i pętla void).

Teraz jesteś już prawie gotowy, ale będziesz musiał dostosować kilka fragmentów kodu do swojej konkretnej konfiguracji.

Pierwszą rzeczą do zrobienia jest zmiana adresu IP w linii 34 (w edytorze Arduino wiersze kodu są ponumerowane) na adres IP twojego mostka Hue. Jeśli nie znasz swojego adresu IP Hue Bridge, odwiedź https://discovery.meethue.com/, a właściwy adres IP pojawi się od razu w przeglądarce. Adres IP to liczba wykropkowana poprzedzona słowem „internalipaddress”.

Aby komunikować się ze światłami Hue, musisz utworzyć użytkownika interfejsu API Hue dla Wemos D1 mini, aby Wemos mógł komunikować się ze światłem Hue za pośrednictwem interfejsu API Hue. Aby to zrobić, postępuj zgodnie z instrukcjami na https://developers.meethue.com/develop/get-started-2/ i skopiuj/wklej wygenerowaną (dość długą) nazwę użytkownika w oknie kodu Arduino. Wystarczy zastąpić każdą „TWOJA NAZWA UŻYTKOWNIKA API HUE” wygenerowaną nazwą użytkownika API.

Następnie musisz wybrać odpowiednie światło Hue, aby zmienić kolor. W Hue API każde światło ma swój numer, więc musisz znaleźć numer, który odpowiada lampie, której chcesz użyć w tym projekcie. Jednym z najłatwiejszych sposobów sprawdzenia, jaki numer ma dana lampa, jest pobranie aplikacji Hue Viewer na Androida lub iOS. Zastąp tekst „TWÓJ NUMER ŚWIATŁA” poprawnym numerem w całym oknie kodu Arduino.

Ostatnią rzeczą do zrobienia jest skonfigurowanie Wemos, aby połączyć się z siecią Wi-Fi. Odbywa się to poprzez przesłanie kodu do Wemos i na laptopie przełącz się na inną sieć Wi-Fi: do „AutoConnectAP”. Twoja przeglądarka wyświetli stronę, na której możesz dodać identyfikator SSID (nazwę) i hasło swojej sieci Wi-Fi, której kontroler Wemos będzie używał do łączenia się z siecią Wi-Fi (i z mostkiem Hue).

Uwaga: Jeśli wgrywanie kodu do naszego Wemos D1 mini przez USB nie działa, może być konieczne pobranie sterownika do układu USB na Wemos. Sterownik dla Twojej platformy (Windows, Mac) można pobrać pod adresem

Teraz jesteś gotowy do przetestowania swojego dzieła!

// ESP8266 Hue Magic Wand// Richard van Kampen - 2018 // Ten kod jest testowany na Wemos D1 mini, ale prawdopodobnie będzie działał również na innych płytkach rozwojowych opartych na ESP8266 // Aby dodać obsługę Wemos D1 mini i innych płyt ESP8266 do edytora Arduino wykonaj następujące czynności: // - Uruchom Arduino i otwórz okno Preferencje. // - Wpisz https://arduino.esp8266.com/stable/package_esp8266com_index.json w polu Dodatkowe adresy URL menedżera tablicy. Możesz dodać wiele adresów URL, oddzielając je przecinkami. // - Otwórz Menedżera tablic z menu Narzędzia > Tablica i zainstaluj platformę esp8266 (i nie zapomnij wybrać płyty ESP8266 z menu Narzędzia > Tablica po instalacji). // używane biblioteki: #include "ESP8266WiFi.h" // ESP8266 Core WiFi Library #include "DNSServer.h" // Lokalny serwer DNS używany do przekierowywania wszystkich żądań do portalu konfiguracyjnego WiFiManager, jeśli nie ma żadnych ustawień WIFI (SSID, hasło) jeszcze nie został ustawiony. #include "ESP8266WebServer.h" //Local WebServer używany do obsługi portalu konfiguracyjnego WiFiManager #include "WiFiManager.h" // Biblioteka WiFi Configuration Magic, jeśli jeszcze nie jest zainstalowana, przejdź do https://github.com/tzapu/WiFiManager #install-through-library-manager #include "RestClient.h" // https://github.com/fabianofranca/ESP8266RestClient, wymagany do korzystania z API Philips Hue (patrz https://developers.meethue.com/develop/ hue-api/). #include "ArduinoJson.h" // https://github.com/bblanchon/ArduinoJson, potrzebne do analizy odpowiedzi interfejsu API Hue, zainstaluj wersję 5.x za pomocą menedżera bibliotek w Arduino (menu "Sketch" > Include Library > Manage Biblioteki > wyszukaj ArduinoJson i zmień wersję na najnowszą 5.x). Wersja 6 (obecnie w fazie beta) zgłasza błąd. // zmienne i init: Odpowiedź ciągu; const int redPin = 13;//na Wemos to jest d7 const int greenPin = 12;//na Wemos to jest d6 const int bluePin = 14;//na Wemos to jest d5 const int touchSensor = 5;//na Wemos to is d1 const int aktywacjaPin = 4;//na Wemos to jest aktywacja d2 bool = WYSOKA; dotyk logiczny = LOW; const char* aan_restore; int bri_restore; podwójne x_restore; podwójne y_restore; podwójne x_magic; podwójne y_magic; bool pierwszy = prawda; długi start bez znaku Millis; unsigned long currentMillis; długi czas trwania bez znaku Millis; Klient RestClient = Klient Rest("192.168.178.23"); // "Twój adres IP Hue Bridge" // Jeśli nie znasz swojego adresu IP Hue Bridge, odwiedź stronę https://discovery.meethue.com, a pojawi się on od razu w Twojej przeglądarce. Adres IP to liczba wykropkowana poprzedzona przez „internalipaddress” void setup() { analogWriteRange(255); Serial.początek(9600); // Zacznij od wyłączonej diody LED. pinMode(aktywacjaPin, INPUT_PULLUP); pinMode (czujnik dotykowy, WEJŚCIE); startMillis = mili(); checkRóżdżka(); } void loop() { // nic do zrobienia, zostaw puste… } void checkWand() { int rgbColour[3]; // Kod koloru RGB autorstwa Jamesa Hartona, https://gist.github.com/jamesotron/766994 // Zacznij od koloru czerwonego. rgbKolor[0] = 255; rgbKolor[1] = 0; rgbKolor[2] = 0; aktywacja = digitalRead(activationPin);// NISKI oznacza użycie różdżki. touch = digitalRead(touchSensor);// HIGH oznacza, że zamiast różdżki używany jest palec, co nie powinno mieć miejsca. while (aktywacja == LOW && touch == LOW) { // Wybierz kolory do zwiększania i zmniejszania. for (int decColour = 0; decColour < 3; decColour += 1) { int incColour = decColour == 2 ? 0: deKolor + 1; //= operator trójargumentowy, oznacza: int incColour;if (decColour == 2) {incColour = 0;} else {incColour = decColour +1;} // przenikanie dwóch kolorów. for (int i = 0; i <255; i += 1) { rgbKolor[decKolor] -= 1; rgbKolor[incKolor] += 1; // ponieważ nasz led RGB ma wspólną anodę zamiast katody (więc musimy podłączyć do +3,3V zamiast masy), potrzebujemy odwrotnych wartości dla RGB: int red = 255 - rgbColour[0]; int zielony = 255 - rgbKolor[1]; int niebieski = 255 - rgbKolor[2]; zapis analogowy(redPin, czerwony); analogZapis(zielonyPin, zielony); zapis analogowy (niebieski pin, niebieski); opóźnienie(8); aktywacja = digitalRead(aktywacjaPin); if (aktywacja == HIGH) { // HIGH oznacza podniesienie różdżki. idź do stopColorCycling; } } } } stopColorCycling: currentMillis = millis(); czas trwaniaMillis = (bieżącyMillis - startMillis); if (durationMillis> 1000) { RGBtoxy(rgbColour[0], rgbColour[1], rgbColour[2]); } else { //przełącz Wemos w tryb uśpienia: ESP.deepSleep(0); } } void RGBtoxy(int red, int green, int blue) { //zobacz https://developers.meethue.com/documentation/color-conversions-rgb-xy double R = map(red, 0, 255, 0, 1000); R /= 1000; podwójne G = mapa(zielony, 0, 255, 0, 1000); G /= 1000; podwójne B = mapa(niebieski, 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); podwójne X = R * 0,649926f + G * 0,103455f + B * 0,197109f; podwójne Y = R * 0,234327f + G * 0,743075f + B * 0,022598f; podwójne Z = R * 0,00000000f + G * 0,053077f + B * 1,035763f; podwójne x = X / (X + Y + Z); podwójne y = Y / (X + Y + Z); // konwersja nie w pełni ukończona, ale prawdopodobnie wystarczająco dobra do tego, co chcemy osiągnąć, więc zostaw to i wyślij wartości XY do lampy: sendtoHue(x, y); } void sendtoHue(double a, double b) {// rzeczywista zmiana koloru z magii różdżki if (pierwsze) { //pierwsze przejście: pobierz aktualny stan lampy getCurrentValues(); }// następnie wyślij kolory magicznej różdżki: // czekaj na zaklęcie: długo czekaj; x_magia = a; y_magia = b; // lampa w kolorze magicznej różdżki: response = ""; int temp = losowo (2, 9); const char* state = "prawda"; for (int i = 1; i <= temp; i++) { // utwórz tablicę znaków do wysłania do mostka: 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);// teraz mamy post_body1 jako tablicę char; // wykonaj wywołanie spoczynkowe: int statusCodePut1 = client.put("/api/TWOJA NAZWA UŻYTKOWNIKA API HUE/lights/TWÓJ NUMER ŚWIATŁA/stan", post_body1, &response); czekaj = losowo (100, 600); opóźnienie (czekaj); if (stan == "prawda") { stan = "fałsz"; } else { stan = "prawda"; } } // zmniejsz jasność…: odpowiedź = ""; temp = losowy (4, 17); // utwórz tablicę znaków do wysłania do mostka: 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);// teraz mamy post_body2 jako tablicę char; // wykonaj pozostałe wywołanie: int statusCodePut2 = client.put("/api/TWÓJ HUE API NAZWA UŻYTKOWNIKA/lights/TWÓJ NUMER ŚWIATŁA/stan", post_body2, &response); czekaj = losowo (1000, 2500); opóźnienie (czekaj); //..i rozjaśnij ponownie: response = ""; temp = losowy (4, 17); // utwórz tablicę znaków do wysłania do mostka: String temp_body3 = "{"bri_inc\": 100, \"transitiontime\": }"; int str_len3 = temp_body3.length() + 1; znak post_body3[str_len3]; temp_body3.toCharArray(post_body3, str_len3);// teraz mamy post_body3 jako tablicę char; // wykonaj pozostałe wywołanie: int statusCodePut3 = client.put("/api/TWOJA NAZWA UŻYTKOWNIKA API HUE/lights/TWÓJ NUMER ŚWIATŁA/stan", post_body3, &response); czekaj = losowo (2500, 5000); // czekaj 2-5 sekund delay(wait);//i wróć do starej wartości: response = ""; // utwórz tablicę znaków do wysłania do mostka: String temp_body4 = "{"on\": " + String(aan_restore) + ", \"bri\": " + String(bri_restore) + ", \"xy\": [" + String(x_restore) + ", " + String(y_restore) + "], \"czas przejścia\": " + String(20) + "}"; int str_len4 = temp_body4.length() + 1; znak post_body4[str_len4]; temp_body4.toCharArray(post_body4, str_len4);// teraz mamy post_body4 jako tablicę char; // wykonaj wywołanie spoczynkowe: int statusCodePut4 = client.put("/api/TWOJA NAZWA UŻYTKOWNIKA API HUE/lights/TWÓJ NUMER ŚWIATŁA/stan", post_body4, &response); ESP.deepSleep(0); //Znowu zasypiam…. } unsigned int getCurrentValues() { connectWifi();// najpierw połącz się z Wifi response = ""; // wykonaj pozostałe wywołanie: int statusCodeGet = client.get("/api/TWOJA NAZWA UŻYTKOWNIKA API HUE/lights/TWÓJ NUMER ŚWIATŁA", &odpowiedź); Serial.print("Kod stanu z serwera po GET: "); Serial.println(statusCodeGet); Serial.print("Treść odpowiedzi z serwera: "); Serial.println(odpowiedź); StaticJsonBuffer jsonBuffer; // Analiza odpowiedzi Json // Katalog główny drzewa obiektów. // // Jest to odwołanie do JsonObject, rzeczywiste bajty znajdują się wewnątrz // jsonBuffer ze wszystkimi innymi węzłami drzewa obiektów. // Pamięć jest zwalniana, gdy jsonBuffer wychodzi poza zakres. JsonObject& root = jsonBuffer.parseObject(odpowiedź); JsonObject& state = root["stan"];// Sprawdź, czy parsowanie się powiodło. if (!root.success()) { Serial.println("parseObject() nie powiodło się"); } // Pobierz wartości. aan_restore = stan["włączony"]; Serial.println(aan_restore); bri_restore = stan["bri"]; x_restore = stan["xy"][0]; y_restore = stan["xy"][1]; first = false;} void connectWifi() { //Inicjalizacja lokalna. Po zakończeniu działalności nie ma potrzeby trzymania go w pobliżu WiFiManager wifiManager; //resetuj ustawienia - do testowania: //wifiManager.resetSettings(); //ustaw wywołanie zwrotne, które zostanie wywołane, gdy połączenie z poprzednim Wi-Fi nie powiedzie się i przejdzie w tryb punktu dostępu wifiManager.setAPCallback(configModeCallback); //pobiera ssid i pass i próbuje się połączyć //jeśli się nie łączy, uruchamia punkt dostępu o określonej nazwie //tutaj "AutoConnectAP" //i przechodzi w pętlę blokującą oczekującą na konfigurację if (!wifiManager.autoConnect()) { Serial.println("nie udało się połączyć i przekroczyć limit czasu"); //resetuj i spróbuj ponownie, a może uśpij go ESP.reset(); opóźnienie (1000); } //jeśli się tu pojawiłeś, połączyłeś się z WiFi Serial.println("connected…yeey:)"); Serial.print("Połączony z: "); Serial.println(WiFi. SSID()); Serial.print("adres IP: "); Serial.println(WiFi.localIP()); //adres IP przypisany do twojego ESP (Wemos) // drukuj siłę odbieranego sygnału: long rssi = WiFi. RSSI(); Serial.print("siła sygnału (RSSI):"); Serial.println(rssi); } void configModeCallback (WiFiManager * myWiFiManager) { Serial.println("Wszedł tryb konfiguracji"); Serial.println(WiFi.softAPIP()); //jeśli użyłeś automatycznie wygenerowanego identyfikatora SSID, wydrukuj go Serial.println(myWiFiManager->getConfigPortalSSID()); }

Zalecana: