Chciałem się pochwalić projektem, który ostatnio skończyłem.
Zrobiłem własny czujnik temperatury, wilgotności i ciśnienia działający na Zigbee, takie nowe dziecko dla bramki Z2S.
Hardware:
- ESP32-C6 (Zigbee)
- BME280 (T/H/P)
- zasilanie bateryjne/akumulatorowe oraz przez USB
- Zigbee Sleepy End Device
- działa od razu z Suplą oraz Home Assistant (ZHA, Zigbee2MQTT)
- standardowe klastry:
- temperatura (0x0402)
- wilgotność (0x0405)
- ciśnienie (0x0403)
- bateria
- konfigurowalny czas deep sleep (ustawiany przez USB/Serial)
- zapis ustawień we Flash (pamięta po resecie)
- factory reset z komendy
- czytelny debug na Serialu (T/H/P + bateria)
- możliwość wysyłania ciśnienia zredukowanego do poziomu morza (opcja)
- temperatura
- wilgotność
- ciśnienie
- bateria
Tytułem wstępu
Szukałem przez długi czas termometru, który umieszczę na zewnątrz, w pewnej odległości od domu i będzie mi pokazywać temperaturę, wilgotność i ciśnienie na zewnątrz oraz w innych wolnostojących obiektach (np. w szklarni).
Miało być zasilanie bateryjne (akumulatorowe), długi czas pracy i maksymalny zasięg.
Chciałem również, aby mierzyło również ujemne temperatury (takie, jak tej zimy).
Kupowałem markowe produkty i różne wynalazki. No i nic się nie sprawdzało. Jak było jedno, to brakowało drugiego. Przy okazji polecam fajną, dodatkową obudowę na zewnątrz do Xiaomi https://www.thingiverse.com/thing:4620242/files
No to sobie sam zmajstrowałem coś takiego. Przy okazji dodałem kilka opcji.
Platforma
ESP32-C6 - testowane na Xiao 4MB, na innych modułach (N4, N8, N16, SuperMini) podłączenie akumulatora może wiązać się z koniecznością podłączenia dodatkowego układu (stabilizatora LDO - np. MCP1700-3302E lub gotowej płytki "18650 Battery Shield" integrującej koszyk na baterię, ładowarkę USB oraz stabilizator 5V/3V3), w celu uzyskania funkcjonalności Xiao.
Generalnie działa na każdym C6 (najlepiej na Xiao).
Na Xiao jest domyślnie włączona antena zewnętrzna.
Domyślnie ZZ THP pracuje z Suplą i bramką Z2S (od wersji 1.4.18-10/02/26).
Obsługa ekranu
W tej chwili brak (dla tego urządzenia nie widzę większego sensu), znacznie podnosi zużycie energii.
Jeśli będzie takie zapotrzebowanie, to mogę dodać ekran działający na sterowniku SH1106 lub SD1306
Obsługa wbudowanej diody LED
Wykorzystuje wbudowaną diodę LED (miga – łączy, świeci na stałe – przesyła dane, dioda czerwona miga – ładowanie akumulatora). Dioda RGB w C6, które je posiadają jest obecnie wyłączona.
Pomiar temperatury, wilgotności i ciśnienia
Wykorzystuje układ BME280 - dość precyzyjny, zintegrowany czujnik środowiskowy firmy Bosch Sensortec, zaprojektowany do pomiaru trzech parametrów: temperatury, wilgotności powietrza oraz ciśnienia atmosferycznego.
Zakresy i dokładność Pomiarów
Temperatura:
- Zakres pracy: -40°C do +85°C
- Dokładność: ±0,5°C do ±1,0°C (typowa)
- Zakres: 0% do 100% wilgotności względnej
- Dokładność: ±3% RH (typowa)
- Czas reakcji (τ63%): 1 s
- Zakres: 300 hPa do 1100 hPa
- Dokładność absolutna: ±1,0 hPa
- Dokładność względna: ±0,12 hPa (odpowiednik ±1 m różnicy wysokości)
Code: Select all
float seaLevelPressure(float pressure, float altitude) {
return pressure / pow(1.0 - (altitude / 44330.0), 5.255);
}Ustawienia Zigbee
Po wgraniu softu (i ewentualnym resecie, jeśli nie wykonał się samoczynnie) urządzenie jest w trybie parowania i czeka na połączenie z bramką.
Jeśli w bramce włączymy parowanie, to po chwili w cloud i w aplikacji powinniśmy zobaczyć 2 kanały: T/H i Pomiar ciśnienia. Przy kanałach powinna być też widoczna ikona baterii. Domyślna nazwa urządzenia w bramce to: ZIBI::ESP32C6_THP_Sensor. Urządzenie będzie od tej pory co 30 sekund wysyłać pomiary do Supli. Dopiero w tym momencie możemy przystąpić do zasadniczej konfiguracji. Opcji nie ma wiele (są dwie): ustawienie odstępu między pomiarami (a właściwie czasu głębokiego uśpienia układu) oraz reset do ustawień fabrycznych. W celu skorzystania z tych opcji wystarczy podłączyć moduł pod komputer (tak, jak wgrywamy soft) i włączyć dowolny serial monitor. Co ok. 30 sekund będziemy mieli okienko z możliwością wpisania odpowiedniego ciągu znaków.
Jeśli wpiszemy liczbę (od 10 do 86400) będzie ona traktowana jako czas (w sekundach), na jaki układ przejdzie w tzw. deep sleep. Wartości w granicach 10-15 sekund można traktować, jako tzw. pomiar ciągły.
Jeśli wpiszemy wyraz factory, to zresetujemy układ do ustawień fabrycznych (po resecie automatycznie przejdzie w tryb parowania).
Inne:
Do testowania załączam binarkę (plik „merged”). Soft wgrywamy standardowo czymkolwiek, co potrafi wgrać do ESP32-C6. Jeśli jest konieczność podania adresu, to wgrywamy od adresu 0x0.
Uwaga! Jeżeli byśmy chcieli wgrać ponownie soft na ESP, to może się to nie udać, gdy układ będzie w deep sleep. Jak to ominąć? Wystarczy podczas podłączania modułu do komputera przytrzymać BOOT. Można go puścić po podłączeniu zasilania i spokojnie flashować.
Czy można wymusić pomiar? Normalnie nie, ponieważ układ jest w deep sleep. Ale można go wybudzić i wtedy wykona pomiar. Najprościej zresetować moduł. Wykona pomiar i przejdzie znowu w deep sleep (ustawiony czas liczy się od nowa).
Ile wytrzyma bateria/akumulator? Trudno powiedzieć. Wszystko zależy od pojemności modułu i ustawionego czasu deep sleep. Układ w uśpieniu pobiera ok. 15μA, podczas przesyłania potrafi dojść do 90-100mA, zazwyczaj ok. 70mA (na tyle, na ile potrafiłem zmierzyć). Co do BME, to patrząc na dane techniczne, wychodzi, że zużywa 0,1 μA w trybie czuwania i parę mA podczas wykonywania pomiaru. Trzeba go wcześniej skonfigurować i ustawić mu tryb „Forced”. Biblioteka pod Arduino robi to automatycznie (sprawdziłem). Dioda (w Xiao) miga i świeci tylko kiedy potrzeba (parowanie i przesyłanie danych), normalnie jest wyłączona. Moje testy na układzie prototypowym pokazują, że przy wykorzystaniu akumulatora o pojemności ok. 3000mAh i pomiarze co 30 minut powinien wytrzymać przynajmniej rok. Będę testował i co pewien czas dzielił się informacjami co do pozostałej pojemności baterii.
Czy można podłączyć urządzenie z innymi bramkami? Tak, ale nie z komercyjnymi (Tuya, eWelink). Pod ZHA i Z2M będzie działać. Wystarczy przypisać, bo wykorzystuje standardowe klastry.
Co daje antena? Dla mnie sporo. Zasięg był dla mnie najbardziej istotny. Testy pokazały, że jeśli bramkę (z anteną zewnętrzną) mam przy oknie, a pokazane tutaj urządzenie posiada bezpośrednią widoczność (ew. jakieś małe krzaczki, czy inne rośliny), to osiągnięcie 60 metrów zasięgu nie jest problemem.
Czy można zrobić podobne urządzenie na WiFi bezpośrednio pod Suplę? Oczywiście! Sam nawet takie zrobiłem (z wykorzystaniem dokładnie tych samych elementów). I nawet działała. Soft można wygenerować bez problemów w nowym GG (link w moim podpisie). Nie trzeba posiadać umiejętności programowania. Są trzy minusy (dla mnie). Supla potrzebuje trochę więcej czasu na nawiązanie połączenia (nie zawsze łączy się za pierwszym razem), szybciej zużywa akumulator i jest… tylko pod Suplę.
Czy nie lepiej kupić gotowe urządzenie Zigbee? Oczywiście, że tak! Jeśli tylko znajdzie się takie, które spełni warunki wymienione na wstępie, to sam chętnie zakupię kilka sztuk. Do tej pory nic takiego nie znalazłem (co nie znaczy, że nie ma).
W planach:
Dodanie korekty pomiaru ciśnienia (pomysłów jest kilka). Najprostszy, to poproszenie kolegi @vajera, aby pomiar ciśnienia z tego czujnika przeniósł na GPM. Wtedy można z nim zrobić co się w zasadzie chce. Do tego jest historia.
Możliwość ustawienia parametru „deep slip time” w cloud, albo przynajmniej w GUI bramki (C&A).
Kolejne urządzenia końcowe współpracujące z bramką Z2S i Suplą.
OTA - jeśli będzie potrzeba, to dorobię. W tej chwili takiej nie widzę.
Informacje dodatkowe (wykonanie):
Jak to poskładać, skąd wziąć części?
Poniżej zdjęcia poglądowe z przykładu wykonania mojego prototypu. W związku z pierwotnymi założeniami wykorzystałem Xiao C6. Nie jest to najtańszy układ, co prawda pokazują mi się już oferty promocyjne po kilkanaście złotych, ale należy przyjąć, że raczej wydamy na niego w granicach 25-30 zł (z Chin, na polskim portalu widzę w tej chwili za 33zł)). Sam czujnik BME280 to koszt ok. 10 złotych (z Chin), dochodzi jeszcze antenka (też kilka złotych), no i akumulator. Akurat tutaj zastosowałem aku 18650 o pojemności ok. 3000mAh (z demontażu baterii od laptopa). Temat zasilania Xiao był już omawiany na Forum, także w innych moich zabawach (np. tutaj: viewtopic.php?t=17555).
I tutaj ważna uwaga. Aby prawidłowo dokonywać pomiaru napięcia akumulatora należy zastosować dwa rezystory (dzielniki) podłączone pod pin analogowy (A0). Dokładnie, jak tutaj https://wiki.seeedstudio.com/XIAO_ESP32 ... ry-voltage

BME280 podłączamy standardowo do domyślnego I2C (w Xiao jest to GPIO22 /SDA/ i 23 /SCL/). Zasilanie (VIN/VCC) do 3,3V (powinno wystarczyć, chyba, że mamy moduł tylko 5V, który nie chce działać na niższym napięciu) i GND do masy C6.
W każdym razie gotowe urządzenie będzie nas kosztować wyraźnie więcej niż przyzwyczaili nas do tego Chińczycy oferując gotowe rozwiązania (urządzenia Zigbee).
Obudowa to sprawa indywidualna. Ciężko mi było znaleźć gotowy projekt 3d (ale też jakoś specjalnie długo nie szukałem). W prototypie wykorzystałem case na dwa aku 18650, który delikatnie przerobiłem. Może ktoś tutaj podrzuci gotowy projekt, albo jak znajdę trochę czasu, to zaprojektuję coś swojego. W każdym razie jest tutaj pole do popisu.
Uwaga! Projekt powstał jako ciekawostka, w ramach walki z bezsennością (jet lag). Nikogo nie namawiam na budowę i wgrywanie oprogramowania. Nie biorę też odpowiedzialności za sposób działania. Ewentualnej pomocy i wsparcia udzielam tylko w ramach tego tematu (i posiadanego wolnego czasu). Osobiście uważam, że lepiej zakupić gotowe urządzenie, jeśli potrzebujemy je tylko do pomiaru temperatury w pomieszczeniu lub na zewnątrz w niewielkiej odległości od domu. Tutaj wybór jest spory a ceny niewygórowane. Ja potrzebowałem do konkretnych zastosowań i jestem zadowolony z osiągniętego rezultatu.
Aktualna wersja: 0.3b – 11/02/2026
Soft oparty na:
https://docs.espressif.com/projects/ard ... ensor.html
https://docs.espressif.com/projects/ard ... ensor.html
W projekcie wykorzystano kod na licencji Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0). Więcej info w pliku Notice.txt dołączonym do archiwum ze wsadem.

