Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'esp32'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Znaleziono 5 wyników

  1. 1. Wprowadzenie Podczas hobbystycznego majsterkowania może zdarzyć się, że zajdzie potrzeba zmierzenia, jakie dokładnie warunki atmosferyczne, czy jakość powietrza panuje w pomieszczeniu lub obszarze roboczym. Może być to na przykład "pojemnik" na drukarkę 3D, jak coś w stylu: Original Prusa i3 MK3 ENCLOSURE -Ikea Lack table - Prusa Research, IKEA Lack Enclosure Creality Ender 3 Compilation, IKEA LACK ENCLOSURE V1. Gdy chcemy sprawdzić jak bardzo nasza drukarka 3D nas truje, mimo, że możemy korzystać z pozornie bezpiecznego i biodegradowalnego PLA. Lub sprawdzić jaką temperaturę osiąga otoczenie podczas wielogodzinnej pracy i czy może to zagrażać elementom z tworzywa i konieczna jest dodatkowa wentylacja. Taki monitor może przydać się również do testów wydajności wyciągu lutowniczego, czyli urządzenia które powinno w sposób najlepiej całkowity odprowadzać z obszaru pracy szkodliwe opary. Zaprezentowany układ będzie oparty na czujnikach BME280 i MQ-135, a nie jak można było się spodziewać na GP2Y1010AU0F, czy też HM3301, lub czymś z rodziny PMS, jak PMS7003, PMS5003ST czy PMS3003. 2. Projekt i schemat Projekt będzie bazował na płytce deweloperskie ESP32, co zapewni dostęp do danych przez interfejs sieciowy, ale zostanie również wyposażony w wyświetlacz OLED. Za pomiary warunków odpowiadają wcześniej wspomniane BME280 i MQ-135. Całości dopełnia dzielnik napięcia dla wejścia analogowego MQ-135. Producent układu deklaruje, iż układ można zasilać w przedziale od 2.5V do 5V, to w dokumentacji widnieje jedynie wartość 5V jeśli chodzi o zasilanie czujnika i tego będziemy się trzymać. Komunikacja odbywa się po magistrali I2C. Całość zasilana jest napięciem 5V przy użyciu ładowarki impulsowej jakich pełno w naszych domach. Zasilanie można doprowadzić poprzez podwójny przewód microUSB lub pojedynczy i moduł z gniazdem microUSB. W drugim przypadku należy podać zasilanie na pin VIN o wartości od 7-12V poprzez przetwornicę Step-Up. 2.1. Schemat połączeń elektrycznych projektu. 3. Części i narzędzia Aby wykonać projekt będą nam potrzebne następujące elementy: ESP32 WiFi + BT 4.2- platforma z modułem ESP-WROOM-32 zgodny z ESP32-DevKit - 1 sztuka. BME280 - czujnik wilgotności, temperatury oraz ciśnienia 110kPa I2C/SPI - 3,3V - 1 sztuka. Czujnik alkoholu, benzyny, amoniaku - MQ-135 - 1 sztuka. Wyświetlacz OLED niebieski graficzny 1,3'' 128x64px I2C v2 - białe znaki - 1 sztuka. moduł z gniazdem microUSB - 1 sztuka, opcjonalnie. Przewód microUSB - 1 lub 2 sztuki, opcjonalnie. Zasilacz impulsowy 5V min. 1A - 1 sztuka. Lutownica, cyna, przewody i inne niezbędne narzędzia. Tu według własnego uznania i umiejętności. 4. Oprogramowanie Do ESP32 należy załadować kod z niewielką modyfikacją. Mianowicie w linii 17 i 18 należy wpisać nazwę swojej sieci i hasło: const char *ssid = "nazwa_sieci_wifi"; const char *password = "haslo_sieci_wifi"; Zapewni on możliwość korzystania z interfejsu sieciowego w sieci lokalnej pod adresem 192.168.0.150. Oczywiście wszelkie informacje zostaną również wyświetlone na ekranie OLED. KOD: #include <WiFi.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define mq135analogpin (4) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); Adafruit_BME280 bme; int h1, p1, jp1; float jp1v; const char *ssid = "nazwa_sieci_wifi"; const char *password = "haslo_sieci_wifi"; String header; WiFiServer server(80); void setup() { Serial.begin(115200); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("Nie ma OLED!")); for (;;); } bool status = bme.begin(0x76); if (!status) { Serial.println("Nie ma BME280!"); while (1); } Serial.print("Laczenie z siecia: "); Serial.println(ssid); IPAddress ip(192, 168, 0, 150); IPAddress gateway(192, 168, 0, 1); IPAddress subnet(255, 255, 255, 0); WiFi.config(ip, gateway, subnet); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.print("."); } // Wyświetlanie przydzielonego adresu IP w sieci lokalnej i uruchomienie serwera WWW Serial.println(""); Serial.println("WiFi podlaczone."); Serial.println("Adres IP: "); Serial.println(WiFi.localIP()); server.begin(); delay(2000); display.clearDisplay(); display.setTextColor(WHITE); } void loop() { WiFiClient client = server.available(); if (client) { Serial.println("Nowy klient."); String currentLine = ""; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); header += c; if (c == '\n') { if (currentLine.length() == 0) { client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html lang=\"pl\">"); client.println("<head>"); client.println("<title>Monitor warunków pomieszczeniowych</title>"); client.println("<meta charset=\"utf-8\">"); client.println("<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">"); client.println("<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">"); client.println("<meta name=\"robots\" content=\"none\">"); client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); client.println("<style>"); client.println("body {background: #313236; font: bold 42px Verdana, sans-serif; color: #fff; text-align: center; padding: 0; margin: 60px 0;}"); client.println("div {margin: 40px 0;}"); client.println("span {font-size: 24px; color: #999;}"); client.println("</style>"); client.println("</head>"); client.println("<body>"); client.println("<div>"); client.println("<span>TEMPERATURA</span><br>"); client.println(bme.readTemperature(), 1); client.println(" °C<br><span>± 1 °C</span>"); client.println("</div>"); client.println("<div>"); client.println("<span>WILGOTNOŚĆ</span><br>"); h1 = round(bme.readHumidity()); client.println(h1); client.println(" %<br><span>± 3 %</span>"); client.println("</div>"); client.println("<div>"); client.println("<span>CIŚNIENIE</span><br>"); p1 = round(bme.readPressure() / 100.0F); client.println(p1); client.println(" hPa<br><span>± 1 hPa</span>"); client.println("</div>"); client.println("<div>"); client.println("<span>JAKOŚĆ POWIETRZA</span><br>"); jp1 = analogRead(mq135analogpin); jp1v = (jp1/4095)*3; if (jp1v < 0.5) { client.println("DOBRA"); } else { client.println("ZLA!"); } client.println("</div>"); client.println("</body>"); client.println("</html>"); client.println(); break; } else { currentLine = ""; } } else if (c != '\r') { currentLine += c; } } } header = ""; client.stop(); Serial.println("Klient rozlaczony."); Serial.println(""); } display.clearDisplay(); display.cp437(true); // temperatura display.setTextSize(1); display.setCursor(0, 0); display.print("TEMPERATURA"); display.setTextSize(3); display.setCursor(0, 24); display.print(String(bme.readTemperature(), 1)); display.print(" "); display.setTextSize(2); display.write(248); display.setTextSize(3); display.print("C"); display.setCursor(0, 50); display.setTextSize(1); display.write(241); display.print("1 "); display.write(248); display.print("C"); display.display(); delay(2000); display.clearDisplay(); // wilgotnosc display.setTextSize(1); display.setCursor(0, 0); display.print("WILGOTNOSC"); display.setTextSize(3); display.setCursor(0, 24); h1 = round(bme.readHumidity()); display.print(String(h1)); display.print(" "); display.write(37); display.setCursor(0, 50); display.setTextSize(1); display.write(241); display.print("3 "); display.write(37); display.display(); delay(2000); display.clearDisplay(); // cisnienie display.setTextSize(1); display.setCursor(0, 0); display.print("CISNIENIE"); display.setTextSize(3); display.setCursor(0, 24); p1 = round(bme.readPressure() / 100.0F); display.print(String(p1)); display.print(" "); display.setTextSize(2); display.print("hPa"); display.setCursor(0, 50); display.setTextSize(1); display.write(241); display.print("1 "); display.print("hPa"); display.display(); delay(2000); display.clearDisplay(); // jakosc powietrza display.setTextSize(1); display.setCursor(0, 0); display.print("JAKOSC POWIETRZA"); display.setTextSize(3); display.setCursor(0, 28); jp1 = analogRead(mq135analogpin); jp1v = (jp1/4095)*3; if (jp1v < 0.5) { display.print("DOBRA"); } else { display.print("ZLA!"); } display.display(); delay(2000); } 5. Efekt końcowy Tak oto prezentuje się prototyp, efekt końcowy i interfejs sieciowy. 5.1. Pierwszy prototyp, jeszcze bez dzielnika napięcia i innych mniejszych zmian. 5.2. Gotowe urządzenie, prezentacje wszystkich wyników na ekranie OLED. 5.3. Zużycie energii elektrycznej podczas pracy urządzenia. 5.4. Interfejs sieciowy dostępny pod adresem 192.168.0.150
  2. Cześć! Od paru dni męczę się z odpaleniem czujnika BME/BMP280 - o takiego dokładnie: W międzyczasie przebrnąłem już przez, wydaje mi się, wszystkie czeluści internetu, ale może Wasze doświadczenie jeszcze mi pomoże. Generalnie wszystko starałem się konfigurować i robić analogicznie do tutorialu znajdującego się pod tym linkiem: https://randomnerdtutorials.com/esp32-bme280-arduino-ide-pressure-temperature-humidity/?fbclid=IwAR14vHOzVlIAiPvsUOxV-efDpnfCjG6Ms7q_sTuLk0ypwM-p3ousZU1yn_Y Sprawdzałem poprawność podłączeń, korzystałem z najnowszych bibliotek adafruit, później próbowałem korzystać z tych przedstawionych w tutorialu (zmieniając adres I2C w Adafruit_BME280.h). Zaczynam podejrzewać, że może czujnik jest w jakiś sposób uszkodzony. Może macie jakieś inne sposoby, żeby to sprawdzić? Bo jednak wolałbym się nie nadwrężać dodatkowymi kosztami. Również sugerowałem się filmikiem - niestety komentowanie (w moim przypadku _wire -> begin(); w Adafruit_BME280.cpp i dopisywanie kodu w Arduino IDE również nie pomogło.) Z góry bardzo Wam dziękuję za wszelkie rady Edit. żeby było prościej kod z którego korzystam: /********* Complete project details at http://randomnerdtutorials.com *********/ #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> /*#include <SPI.h> #define BME_SCK 18 #define BME_MISO 19 #define BME_MOSI 23 #define BME_CS 5*/ #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; // I2C //Adafruit_BME280 bme(BME_CS); // hardware SPI //Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI unsigned long delayTime; void setup() { Serial.begin(9600); Serial.println(F("BME280 test")); bool status; // default settings // (you can also pass in a Wire library object like &Wire2) status = bme.begin(0x76); if (!status) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } Serial.println("-- Default Test --"); delayTime = 1000; Serial.println(); } void loop() { printValues(); delay(delayTime); } void printValues() { Serial.print("Temperature = "); Serial.print(bme.readTemperature()); Serial.println(" *C"); // Convert temperature to Fahrenheit /*Serial.print("Temperature = "); Serial.print(1.8 * bme.readTemperature() + 32); Serial.println(" *F");*/ Serial.print("Pressure = "); Serial.print(bme.readPressure() / 100.0F); Serial.println(" hPa"); Serial.print("Approx. Altitude = "); Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA)); Serial.println(" m"); Serial.print("Humidity = "); Serial.print(bme.readHumidity()); Serial.println(" %"); Serial.println(); } I na monitorze dostaje błąd z setupu, "Cold not find a valid BME280 sensor, check wiring!". Przez chwilę myślałem, że to może coś z lokalizacją bibliotek i obiekt "bme" się w ogóle nie tworzy, ale samo IDE biblioteki wyświetla... Edit 2, further information I2C scanner daje mi adres 0x76 - czy w ogóle to, że znajduje jakieś urządzenie nie jest dowodem, że czujnik nie jest zepsuty? czy to leży po stronie ESP32? ESP32, z którego korzystam piny do I2C SDA na D21, i SCL na D22.
  3. Dostępne na rynku oczyszczacze powietrza nie kosztują mało. Sam filtr, który wydaje się najważniejszym elementem kosztuje najczęściej nie więcej niż 1/3 oczyszczacza. Postanowiłem więc zbudować własny oczyszczacz. Oczywiście czas poświęcony na budowę też ma wartość, ale nie traktuje tego jako roboczogodziny a po prostu zabawę . W moim przypadku, koszt całości wyniósł około 300zł. Dla porównania, gotowy oczyszczacz Xiaomi to wydatek około 500zł, jesienią było to minimum ~650zł . Kupiłem filtr Xiaomi z wkładem węglowym, który jest nieco droższy niż zwykły, który montowany w fabrycznych oczyszczaczach. Użyty przeze mnie wentylator posiada według producenta wydajność 150m³/h co jest wartością 2x mniejszą niż fabryczny oczyszczacz. Jest to jednak w zupełności wystarczające. Mechanika Oczyszczacz składa się z filtra powietrza, wentylatora 200mm, łącznika filtra z wentylatorem i sterownika. Łącznik został wydrukowany na drukarce 3D. Wentylator to najtańszy wentylator 200mm jaki znalazłem w sklepie komputerowym. Elektronika Całość bazuje na płytce z ESP32. Na niej znajduje się shield prototypowy Arduino, a do niego są zamontowane kolejne elementy. Używałem głównie gotowych modułów. Starałem się w miarę możliwości nie lutować ich bezpośrednio do PCB tylko umieszczać na listwach kołkowych. Schematu niestety nie mam. Wszystko było lutowane na bieżąco w przypływach weny Planuje jeszcze wyprowadzić drugą szynę I2C i podłączyć do niej drugi barometr który będzie umieszczony w wewnętrznej części filtra. Będę mógł w ten sposób zbadać zależność różnicy ciśnień od obrotów wentylatora. Czujniki Jako czujnik pyłu zastosowałem GP2Y1010AU0F. Kluczem była niska cena. Niestety wymaga on dość dokładnego synchronizowania w czasie załączania diody LED i pomiaru napięcia wyjściowego. Z czym miałem duże problemy o czym napiszę niżej. Dodatkowo, jako że jest to czujnik analogowy, jego wyjście skaluje się względem napięcia zasilania. A tak się składa że o ile ESP32 jest zasilane ze stabilnych 3.3V, to czujnik jest zasilany z szyny 5V. Tutaj występuje wyraźny rozstrzał między zasilaniem z zasilacza (wtedy szyna 5V jest zasilana przez diodę która powoduje spadek napięcia) a zasilaniem przez USB. Staram się to kompensować dodatkowym pomiarem napięcia szyny 5V. Nie jest to idealnie, choć daje dużo. Prawdopodobnie czujnik nie skaluje swojego wyjścia idealnie liniowo z napięciem zasilania, stąd ten problem. Oprócz tego na płytce znajduje się czujnik wilgotności HDC1080 oraz ciśnienia BMP280. Oba mają wbudowane termometry, więc nie potrzeba dodatkowego. Teraz prawdopodobnie użyłbym BME280. Interfejs W sterowniku użyłem wyświetlacza OLED. Wyświetlane są na nim aktualne parametry, takie jak: temperatura, wilgotność, poziom zanieczyszczeń, moc wentylatora i inne. Wyświetlacz jest sterowany za pomocą interfejsu I2C. Obok wyświetlacz znajduje się enkoder. Użyłem gotowego modułu bo akurat nie miałem pod ręką tego typu enkodera z przyciskiem. Można nim regulować moc oczyszczacza oraz przełączać między trybami: "auto" i "manual". Oczywiście jak na 2019 rok przystało, oczyszczaczem można sterować też po WiFi :) Na ESP32 jest uruchomiony webserver. Panel webowy wygląda tak: W kodzie znajdują się funkcje które utrzymują stałą łączność WiFi z routerem. Dane dostępowe do znanych nam WiFi należy umieścić w pliku "wifi_credentials.json" i wgrać wraz z innymi plikami. Niestety hasła należy umieścić w formie tekstowej. Biblioteka micropythona do obsługi WiFi nie obsługuje haseł w wersji zahashowanej (PSK). W przyszłości może dopiszę bardziej ludzką formie wprowadzania haseł Sterowanie wentylatorem Z racji tego że użyłem najtańszego wentylatora o tej średnicy, posiada on tylko 3 pinową wtyczkę. Taki wentylator można sterować jedynie napięciowo. Wymyśliłem więc sposób na regulację PWMem napięcia wyjściowego przetwornicy impulsowej. Polega to na podkradaniu lub wprowadzaniu dodatkowego prądu do wyjściowego dzielnika napięcia. Schemat tego wygląda następująco: Zauważyłem że im mniejsza częstotliwość sygnału PWM, tym bardziej nieliniowa jest zależność Vout=f(PWM). Dlatego częstotliwość PWM została ustawiona na 312kHz. Aproksymacje tej funkcji stworzyłem robiąc pomiary Vout w zależności od danego wypełnienia PWM, a następnie w arkuszu kalkulacyjnym wyznaczyłem współczynniki funkcji liniowej. Współczynniki te są na sztywno zapisane w kodzie. Micropython Zdecydowałem się użyć micropythona ze względu na chęć nauki czegoś nowego. Niestety, jak okazało się w trakcie, posiada on wiele ograniczeń. Największą wadą jest używanie blokującego dostępu do interfejsów komunikacyjnych. Przez co np.: w trakcie odświeżania wyświetlacza nie można dokonywać pomiarów czujnika pyłu czy obsługiwać żądań serwera. Ne można też używać drugiego rdzenia ESP32. Przez co interfejs użytkownika chodzi wyraźnie wolno, i nie wygląda na uruchomiony na czymś tak mocnym Cały kod jest dostępny na GitHubie: https://github.com/Harnas/ESP32_Airpurifier
  4. Większość osób pewnie zauważyła, że na forum znajdziemy kurs obsługi Raspberry Pi oraz jego kontynuację z opisem konkretnych projektów. Jednym z tematów, które mnie zainteresowały jest "inteligenty dom", czyli konfiguracja Domoticza: https://forbot.pl/blog/kurs-raspberry-pi-projekty-domoticz-ds18b20-maile-id27526 Bezpośrednie podłączanie czujników do malinki jest bardzo fajne, ma jednak pewne ograniczenia. Po pierwsze liczba dostępnych pinów może okazać się niewystarczająca. Drugi i poważniejszy problem to konieczność kładzenia kabli - powiedzmy do termometru za oknem, czy w innym pomieszczeniu. To prowadzi nie tylko do plątaniny kabli, kosztów remontu mieszkania, ale i do czysto elektrycznych problemów wynikających z długości przewodów. Spróbowałem więc do Domoticza działającego na Raspberry Pi podłączyć przykładowy czujnik (termometr DS18B20) za pomocą WiFi. Ponieważ ostatnio bardzo spodobała mi się zabawa z układami ESP32 wybrałem moduł z właśnie takim układem. Wybór platformy sprzętowej był prosty, jako serwer Raspberry Pi 3+, czujnik DS18B20 podłączony do modułu z ESP32. Do komunikacji używam WiFi, co chyba nie wymaga komentarza - wspomnę tylko, że moja sieć lokalna używa adresów 168.168.0.x. Trudniej było zdecydować się na odpowiedni protokół komunikacji między ESP32, a serwerem. Ostatnio interesowałem się protokołem MQTT, który jest wspierany przez Domoticz-a, więc postanowiłem go użyć. Jest to prosty protokół przeznaczony do telemetrii, czyli dokładnie tego co staram się uzyskać (więc powinno pójść łatwo). Na szczęście MQTT ma dobre wsparcie zarówno po stronie malinki, jak i ESP32 - nie trzeba więc pisać obsługi tego protokołu od podstaw, można wykorzystać gotowe narzędzia. Do obsługi MQTT po stronie serwera potrzebujemy tzw. broker. W tym celu wystarczy zainstalować na Raspberry Pi dwa pakiety: mosquitto oraz mosquitto-clients. Protokół MQTT opiera się na mechanizmie publikacji/subskrypcji danych. Dane przesyłane są w postaci tak zwanych tematów (ang. topic). ESP32 może więc publikować wyniki pomiarów z czujnika, a Domoticz je subskrybować. Może brzmi to dziwnie, więc na początek mały test. Raspberry Pi ma u mnie adres IP 192.168.0.150. Działa na nim serwer mosquitto na domyślnym porcie 1883. Aby zacząć subskrybować dane wpisuję np. mosquitto_sub -h 192.168.0.150 -v -t "forbot/test" Pierwsza opcja, czyli -h ustala adres serwera (poleceni można uruchomić ze zdalnego komputera), -v zwiększa gadatliwość programu (wyświetla nazwy tematów), a ostatni czyli -t określa nazwę tematu. Teraz z innego terminala, a nawet komputera mogę opublikować testowy komunikat: mosquitto_pub -h 192.168.0.150 -t "forbot/test" -m "Hello world!" Efekt wykonania tych poleceń wygląda następująco: Liczba dostępnych opcji jest znacznie większa, ale to co przetestowałem wystarczy na początek. Teraz mogę przejść do Domoticza i skonfigurować obsługę MQTT. Konfiguracja Domoticza Na początek zainstalowałem i skonfigurowałem Domoticz-a mniej-więcej według kursu. W każdym razie zaczynam bez podłączonych czujników z samą malinką oraz oczywiście mosquitto. Pierwszy krok w stronę MQTT to dodanie odpowiedniego urządzenia (opcja Setup->Hardware). Interfejs Domoticza jest dla mnie straszny, ale chociaż działa. W każdym razie opcje, które muszę wypełnić to: Name - nazwa urządzenia, nieistotna ale coś trzeba wpisać Type: "MQTT Client Gateway with LAN interface" Remote Adress - adres serwera, pewnie zadziała 127.0.0.1, ale ja wpisuję 192.168.0.150 Port: 1883 Teraz wystarczy przycisnąć "Add" i obsługa MQTT została dodana. Od razu ostrzeżenie - to co robię jest delikatnie mówiąc niezbyt bezpieczne. Należałoby dodać obsługę hasła oraz SSL, ale na razie nie będę się tym zajmować. Kolejny krok to dodanie urządzenia typu dummy (manekin?). Ponownie nazwa jest nieistotna, liczy się typ: "Dummy (Does nothing, use for virtual switches only)". Po dodaniu manekina pojawia się on na liście urządzeń. Ale co najważniejsze w kolumnie "Type" jest też przycisk "Create Virtual Sensors" - nie wiem czy tylko mnie interfejs Domoticza doprowadza do furii... ale jak już wspominałem ważne że działa. Naciskam ten jakże intuicyjnie umiejscowiony przycisk i pojawia się tym razem podejrzanie proste okienko dialogowe: Nazwa jak to nazwa, chociaż tym razem już nieco ważniejsza niż wcześniej, ale jak zwykle należy zwrócić uwagę na typa. Zacznę od przełącznika, skoro tak domoticz doradzał. Wybieram więc Switch i naciskam OK. Zgodnie z oczekiwaniem nowo dodane urządzenie będzie widoczne w zakładce Switches: Klikając myszą na ikonę żaróweczki można się takim przyciskiem bawić w nieskończoność - w końcu domoticz uprzedzał, że to nic nie robi... ale okazuje się że niezupełnie. Wracamy do linii poleceń i poznanego już mosquitto_sub. Tym razem uruchamiam nasłuchiwanie wszystkich tematów - w MQTT używany jest w tym celu znak #, coś jak * we wszystkich normalnych przypadkach. mosquitto_sub -h 192.168.0.150 -v -t "#" Na początku nic ciekawego się nie dzieje: Ale skoro wirtualny przycisk też nic nie robi to co szkodzi go przycisnąć: Wirtualna żaróweczka zaczyna świecić, ale co ważniejsze coś otrzymaliśmy przez MQTT: Dla osób nie lubiących oglądać obrazków poniżej kod: domoticz/out { "Battery" : 255, "RSSI" : 12, "description" : "", "dtype" : "Light/Switch", "id" : "00014051", "idx" : 1, "name" : "prztyczek", "nvalue" : 1, "stype" : "Switch", "svalue1" : "0", "switchType" : "On/Off", "unit" : 1 } domoticz/out to nazwa tematu, to co domoticz wysyła domyślnie wędruje właśnie tędy. Cała reszta to informacja o przyciśnięciu przycisku w formacie JSON. Można jeszcze raz nacisnąć przycisk i zobaczyć co się stanie: domoticz/out { "Battery" : 255, "RSSI" : 12, "description" : "", "dtype" : "Light/Switch", "id" : "00014051", "idx" : 1, "name" : "prztyczek", "nvalue" : 0, "stype" : "Switch", "svalue1" : "0", "switchType" : "On/Off", "unit" : 1 } Nie trzeba być szerlokiem, aby zrozumieć jak to działa - pole "nvalue" przesyła informację czy przycisk został włączony, czy wręcz przeciwnie. Teraz wystarczy takie dane sparsować i możemy mieć własny, zdalnie sterowany moduł. To działa bardzo ładnie na ESP32, ale chciałem na razie opisać własny czujnik. Dodawanie czujnika Poprzednio dodałem przycisk, teraz w bardzo podobny sposób dodaję wirtualny termometr. Na początek wracam do listy urządzeń (Setup->Hardware) oraz naciskam magiczny przycisk "Create Virtual Sensors": Tym razem dodaję urządzenie do pomiaru temperatury: Zanim przejdę dalej, warto wyświetlić listę zainstalowanych urządzeń. Znajdziemy ją wybierając Setup->Devices: Najważniejsza jest kolumna idx. Każde urządzenie ma swój identyfikator. W moim przypadku najpierw dodałem przycisk, który otrzymał numer 1 - stąd w kodzie JSON pole idx miało akurat taką wartość. Teraz gdy mam już dwa urządzenia identyfikatory stały się ważniejsze. A jak widać termometr ma idx równe 2. Czas zobaczyć jaką temperaturę wskazuje nowo zakupiony wirtualny termometr: Jak widać nie działa najlepiej. Spróbujmy więc wysłać do niego (o przepraszam - opublikować) jakąś wiadomość. mosquitto_pub -h 192.168.0.150 -t "domoticz/in" -m '{ "idx": 2, "nvalue": 0, "svalue": "3.14" }' Po chwili powinniśmy zobaczyć nasz odczyt z poziomu domoticz-a: Temat do wysyłania danych jest zawsze taki sam, czyli "domoticz/in", parametr "idx" identyfikuje nasz czujnik, a aktualna temperatura przesyłana jest jako napis w polu "svalue". Teraz wiemy już wszystko co konieczne, aby przygotować własny czujnik. Wystarczy na ESP32 połączyć się z WiFi, odczytać temperaturę z podłączonego termometru, a następnie używając MQTT wysłać komunikat o treści: { "idx": <ID_URZADZENIA>, "nvalue": 0, "svalue": "<TEMPERATURA>" } Do przygotowania takiego komunikatu nie potrzebujemy nawet biblioteki z obsługą JSON, wystarczy prosty sprintf. Na koniec jeszcze dwa słowa o parametrach przesyłanych w JSON oraz implementacji kodu na ESP32. Więcej o dostępnych opcja JSON znajdziemy np. tutaj: https://www.domoticz.com/wiki/Domoticz_API/JSON_URL's#Temperature Przy okazji zauważymy, że zamiast MQTT można byłoby użyć zwykłego http. Ja wybrałem MQTT, ale jak zwykle możliwości jest mnóstwo. Program na ESP32 implementowałem w IDF. Zarówno WiFi, jak i protokół MQTT obsługiwany jest przez standardowe biblioteki, przykład dla WiFI znajdziemy tutaj: https://github.com/espressif/esp-idf/tree/master/examples/wifi/getting_started/station, natomiast MQTT: https://github.com/espressif/esp-idf/tree/master/components/mqtt
  5. Mam pytanie jak w temacie wątku, czyli co wybrać jako bibliotekę do programowania ESP32: Arduino, czy ESP-IDF? Może ktoś ma doświadczenia z jedną, albo najlepiej obydwiema biblitekami? Pytam głównie z ciekawości, bo ESP-IDF wydaje się nieco trudniejsza na początek, więc kiedy i dlaczego warto jej używać? Czy jest sens poświęcić na nią czas, czy lepiej pozostać przy Arduino?
×
×
  • Utwórz nowe...