ESP8622 z wyświetlaczem SSD1306 (OLED) DHT22, BH1750 pod ESPEasy

Domoticz cz. 3.1: ESP Easy na ESP8266 – zdalny i lokalny wyświetlacz OLED, temperatura, wilgotność, światło – stacja pogodowa

W poprzednim wpisie podłączyliśmy wyświetlacz OLED typu SSD1306 do Raspberry Pi. Twórca ESP Easy – Richard ten Klooster (https://github.com/ESP8266nu/ESPEasy) – rozwija projekt pozwalając na uzupełnianie bezprzewodowego czujnika o nowe elementy. Dziś w bardzo prosty sposób uzupełnimy nasz czujnik o wyświetlacz oraz miernik natężenia światła. Nasza stacja „kontroli” pogodoy dostanie zdalny wyświetlacz.

Połączenie takich elementów pomiarowych powstało ponieważ czujnik ma mierzyć temperaturę i wilgotność w domku z drewnem, a dodatkowa lampka oświetlająca drogę – ma zapalać się po zmroku. Poza tym, chciałem przetestować stabilność I2C przy dwóch urządzeniach na ESPEasy.

Czego będziemy potrzebować?

Software & Hardware

Do dzieła

Podobnie jak poprzednio, ale nawet nie używając tej wiedzy – podłączenie wyświetlacza OLED jest równie łatwe jak w Raspberry Pi. Po zalogowaniu się na adres ESPEasy – wybieramy które PINy będą służyły za szynę I2C. W przykładzie, są to domyślne: GPIO 4 & 5. Podłączamy nasz zasilacz do +3,3V, GND, oraz SDL i SCL do GPIO 4 & 5. Konfiguracja wygląda następująco:

ESP Easy - SSD1306
ESP Easy – SSD1306

Dla przypomnienia – tak nazywała się czujka oraz wartości jakie definiowaliśmy – musimy je podać ponownie, tak samo dla wyświetlacza, aby ESP pobrało właściwe dane:

ESPEasy DHT22 - config
ESPEasy DHT22 – config

Zauważmy, że jedną z pierwszych opcji jest adres na szynie I2C – aby zweryfikować wartość adresu, udajemy się do Tools->I2C Skan, który powinien nam dać wartość adresu – w przykładzie pojawia się już dodatkowo – korzystający z tej samej szyny, podłączony równolegle – czujnik natężenia światła BH1750:

ESP Easy - Scan i2c
ESP Easy – Scan i2c

Mamy więc poprawny adres (szesnastkowo): 0x3c!
Jeśli wszystko uzupełniliśmy dobrze, to po uruchomieniu ESPEasy, powinniśmy na ekranie otrzymać: „ESP Easy”.

Teraz należy skonfigurować sposób prezentacji na ekranie (normalny, odwrócony), oraz wybrać które linie wyświetlacza będą prezentowały dane,  jednak najpierw – spróbujmy wyświetlić coś z zewnątrz

Zdalny i lokalny wyświetlacz

ESPEasy umożliwia nie tylko wyświetlanie danych z lokalnych czujników – ale pozwala także wyświetlić dowolny tekst poprzez bardzo prostą kontrolę (bez uwierzytelnienia), a wszystko co potrzebne do wyświetlenia przekazujemy za pomocą URL.
Po pierwsze – możemy włączać i wyłączać nasz wyświetlacz. W przykładzie adresem IP naszego czujnika ESP Easy jest 10.20.30.40. Możemy wyłączyć ekran (bo zbyt mocno świeci w nocy)

Następnie go włączyć:

Możemy wyczyścić:

Gdy jednak chcemy wyświetlić jakąś wartość albo tekst – używamy w linii komend – na przykład na naszym Raspberry Pi curl’a:

na przykład:

Na koniec użyjemy tej funkcji aby wyświetlić wartość z domoticza na wyświetlaczu naszego czujnika (a więc – jakby w drugą stronę)

Wracajmy jednak do wyświetlania naszych zmiennych z DHT22 i czujnika natężenia światła – zaczynamy od statycznego tekstu – przedstawiającego naszą czujkę w Line 1. Line 2 oraz zgodnie z sugestią z wiki może zawierać uptime – oraz czas – wiemy że urządzenie działa.

Pamiętajmy, że czas ustawiamy z serwera NTP w Tools.

Jak widać aby ESPEasy wyświetliło czas lub wartość uptime, należy pobrać wartość ze zmiennej – aby to zrobić należy ją umieścić w znakach procentu (%). Wiki pokazuje, które wartości są dostępne do wyświetlnia.

Następnie wyświetlamy zmienne z naszych czujek – na początek DHT22. Jak pamiętamy w konfiguracji DHT22 nadaliśmy jej nazwę

ESPEasy DHT22 - config
ESPEasy DHT22 – config

– stąd też bierze się nazwa zmiennej AmicaTempHum. Konstrukcja wygląda trochę inaczej – tym razem zmienna jest okalana nawiasami kwadratowymi, a konkretna wartość czujnika – mamy przecież dwie w DHT 22, jest rozdzielana znakiem hash (#): [AmicaTempHum#Humidity]. Tym razem widoczny na końcu znak % służy do informowania o procentowej wilgotności.

Podobnie postępujemy z temperaturą. Po zadanym czasie raportowania ekran zostanie uzupełniony o nowe dane:

ESP8622 z wyświetlaczem SSD1306 (OLED) pod ESPEasy
ESP8622 z wyświetlaczem SSD1306 (OLED) pod ESPEasy

Pozostaje nam opcjonalnie podłączyć równolegle – a więc VCC 3,3V do VCC, SDA i SCL do SDA & SCL i GND do GND – czujnik natężenia światła BH1750. Podobnie jak DHT22 potrzebuje szczątkowych prądów do pracy, a płytka Amica NodeMCU ma odpowiedni zapas wydajności prądowej. Jeśli podłączymy ją poprawnie – będzie pokazywała po zaświeceniu – poprawną wartość natężenia w luksach:

ESP8622 z wyświetlaczem SSD1306 (OLED) DHT22, BH1750 pod ESPEasy
ESP8622 z wyświetlaczem SSD1306 (OLED) DHT22, BH1750 pod ESPEasy

Przy następnym pomiarze – dostajemy informację ile światła mamy do wykonania tego zdjęcia:
ESP8622 z wyświetlaczem SSD1306 (OLED) DHT22, BH1750 pod ESPEasy

Jeśli otrzymacie stałe wartości rzędu 54612 lux – to czujnik jest niepoprawnie podłączony.

To wszystko – po dodaniu odpowiednich wirtualnych sensorów (DHT22 już mamy, dodajemy natężenie światła) Domoticz dostanie informację o natężeniu światła. Wtedy przykładowo – dzięki prostemu skryptowi (tak jak w przypadku otwierania garażu) zapali lampę w odpowiednim czasie, gdy jest ciemno. Dzięki ‚Events’ w domoticzu jest to dość łatwe do zrobienia. Jednak w komentarzu do wpisu pojawił się ciekawy wątek!

Wyświetlamy wartości z domoticz na ekranie czujnika

Patrząc na przykład – widzimy, że linia 7 jest całkowicie pusta. Ponieważ posiadam czujnik ciśnienia i temperatury – chciałem go podłączyć jeszcze do ESP8266, ale ponieważ nie został wysłany na czas – sklep skasował zamówienie. Pozostaje czekać na kolejny… albo wykorzystać ten który już mam podłączony do domoticza! BMP180 o którym mowa – informuje mnie o temperaturze wokół domoticza oraz o ciśnieniu atmosferycznym w hPa. O ile temperatura nie jest aż tak interesująca – to zdecydowanie chciałbym na wyświetlaczu mieć ciśnienie. Jeśli pamiętacie wpis o otwieraniu garażu za pomocą skryptu LUA w domoticzu to pamiętacie, że można dzięki niemu pobrać wartość i wykonać dowolną „akcję”. Należy:

  • pobrać wartość ciśnienia
  • obciąć nieinteresujące miejsca po przecinku
  • wyświetlić wartość na SSD1306 naszego czujnika

Skrypt w LUA dostanie więc funkcję zaokrąglania do 1 miejsca po przecinku, a ponieważ wywoływać go wystarczy raz na minutę (można też przy zmianie – jak kto woli – wtedy if z devicechanged) wybieramy opcję time.

Miernik ciśnienia w domoticzu ma nazwę ‚TemperaturaCisnienie’ a więc nazwa skryptu to:

Adres IP należy oczywiście zmienić, a skrypt umieszczamy w /home/pi/domoticz/scripts/lua:

Po chwili w linii numer 7 dostaniemy informację o ciśnieniu!

Dodatkowo przykład z komentarzy:
Jeśli nadal macie podłączony termometr z poprzedniego wpisu o termometrze dla Domoticza – to odpowiedni skrypt wygląda następujaco (pamiętajcie o odpowiedniej nazwie!)

Tym razem uaktualniamy wartość tylko wtedy jeśli się zmieni.




  • huczas

    Załóżmy że mamy ekran podłączony tylko do ESP-01, jak powinien wyglądać skrypt w domoticzu który wyśle temperaturę z innego czujnika z zewnątrz? Czy można prosić o jakiś przykład?

    • Łukasz C. Jokiel

      ESP-01 ma wyprowadzone GPIO 0 i 1, aby efektywnie stosować ESP Easy musiałbyś dolutować odpowiednie nóżki z chipa ESP. Ale – dla samej temperatury wystarczy przykład z DS18B20 i on jest do dopalenia na ESP-01 (bez ESP Easy, po prostu na NodeMCU i LUA): https://blog.jokielowie.com/2016/02/domoticz-cz-3-esp-easy-prosty-i-szybki-czujnik-na-esp8266/

      • huczas

        Tak, ale mi chodzi o jakiś przykładowy skrypt który pokaże przez espeasy na ekranie oled np temperature z innego czujnika nie podłączonego bezpośrednio z esp-01.
        W sensie taki ekran wifi standalone który będzie wyświetlał temperaturę z zewnątrz.

        • Łukasz C. Jokiel

          Zakładając, że podłączysz wyświetlacz do ESP-01 (lutowanie!) – wystarczy np: z linii komend curlem: curl http://192.168.21.13/control?cmd=oled,1,1,Temperatura: 12C

          • huczas

            Bez lutowania, GPIO 0 i 1 używam jako linię I2C, i teoretycznie można tam wyświetlić wszystko z pozycji RPi, (czytałem wiki EspEasy) problem jaki mam to jak przekazać konkretne wyniki pomiaru temperatury z zewnątrz które są w domoticzu dostępne.

          • Łukasz C. Jokiel

            Cóż, to fajny pomysł, a ponieważ BMP180 – zrobiłem przykład we wpisie (na końcu)

          • huczas

            Załóżmy że moja nazwa czujnika temperatury to Outside(jest to 1 wire DS18B20 bezpośrednio do RPi podłączony). Nie działa mi ten skrypt lua, co źle robię co poprawić?

            temperatura=(otherdevices_thermometer[‚Outside’],1)
            commandArray = {}
            commandArray[‚OpenURL’]=’192.168.1.8/control?cmd=oled,3,1,Outside:’..temperatura..’C ‚
            return commandArray

          • Łukasz C. Jokiel

            Dodałem swój działający przykład dla termometru we wpisie

          • huczas

            Hej, nie podziękowałem, a skrypt u mnie działa już ze dwa tygodnie bez problemów 🙂 Dzięki za nieocenioną pomoc! W pierwszej chwili nie zauważyłem a miałem w nazwie pliku literówkę – dlatego nie działał z początku, ale jak już się zorientowałem i poprawiłem to ruszyło z kopyta. Jeszcze raz dziękuję.

            BTW, widziałem na grupie że szykujesz coś z tanim modemem gsm, też mam taki(ciut inna płytka). Czekam na artykuł co z nim ciekawego zbudujesz, może też zaimplementuję u siebie. Na razie z pomysłów jakie mam na ten moduł to czujka ruchu przy drzwiach i uzbrajanie alarmu w postaci wysłania smsa, a po wykryciu ruchu zwrotka z taką informacją, ale możliwości jest dużo więcej… 🙂

          • Łukasz C. Jokiel

            Dzięki, planuję wysyłanie SMS z konsoli, chyba na tajtańszym mododule – Neoway, bo SIM800L ma niepotrzebnie głos – chociaż można by go w alarmie użyć do podsłuchu co się dzieje – ale jak wyłączysz syrenę 😉

  • jendrush

    Czy istnieje możliwość aby oprócz wysyłania temperatury z noda z podłączonym DS18B20 do Domoticza, wysyłać to również na wyświetlacz podłączony do innego ESP, ale wyświetlać tylko jedną wartość większą czcionką?

    • Łukasz C. Jokiel

      Zakładając, ze nowa wersja ESPEasy ma taką funkcję – tak. Alternatywnie można szukać innych implementacji, niemniej ESPEasy wygrywa na razie stabilnością.

      • jendrush

        Chyba spróbuję to zrealizować za pomocą arduino i podłączonego ESP8266. Nadal będzie wysyłało dane do Domoticza po wifi, ale również łatwo będę mógł przesyłać dane do lokalnego wyświetlacza za pomocą np. modułu 433MHz – zasięg dobry, a komunikacja dwukierunkowa akurat w tym przypadku nie jest potrzebna.

        • Łukasz C. Jokiel

          Brzmi ciekawie – stacja pogodowa z zdalnym wyświetlaczem. Daj znać jak poszło!

          • jendrush

            Tak naprawdę to ja w domu mam mysensors działające z Domoticzem. Komunikują się one za pomocą nRF24L01+. Przy wykorzystaniu mysensors prosto jest wysyłać wybrane dane z jednego czujnika gdzieś w inne miejsce gdzie jest wyświetlacz. Tak mam zrobione teraz dosyłanie temperatury zewnętrznej z czujnika poza domem do wyświetlacza który jest w kuchni i pokazuje temperatury z lodówki/zamrażarki/pomieszczenia. Tutaj jednak mam sytuację że czujnik temperatury jest dużo dalej, a dane są przesyłane przez internet. Oprócz monitorowania tego chcę aby ktoś na miejscu miał podgląd na aktualną temperaturę niezależnie od tego czy połączenie internetowe działa, czy nie.

          • Łukasz C. Jokiel

            ESP8266 z ESPEasy wygląda najlepiej. Do prezentacji wyników ze stacji pogodowej używam ImperiHome.

          • jendrush

            Ja lubię mysensors bo mogę to dowolnie modyfikować. I tak w jednym punkcie mam np. 3 DS18B20, czunik ruchu, oraz wyświetlacz. W innym nodzie mam sterowanie przekaźnikiem i gniazdkami bezprzewodowymi po 433MHz. ESP Easy jest fajne bo działa na jednym układziku i po wifi, szkoda że nie da się tego łatwo modyfikować(a może o czymś nie wiem?).

          • Łukasz C. Jokiel

            Wolę ESP8266 ze względu na cenę, domyślną pracę przez WiFi a obsługuje te peryferia jakie powinno. Do dziwniejszych zastosowań jest trochę ale niewiele droższe Raspberry Pi Zero.

  • Coby Bryan

    Hej, witam wszystkich.
    Widzę, że grupa ma doświadczenie z esp easy dla nodemcu dlatego zapytam:
    czy podłączał ktoś z Was do płytki nodemcu przekaźnik i wyłącznik do sterowania np: oświetleniem?
    Oczywiście chodzi o soft esp easy + domoticz.
    Ja próbuje ale efekt jest na tą chwilę niezadowalający tzn.
    a) urządzenie po restarcie zasilania nie pamięta stanu sprzed wyłączenia,
    b) wyłącznik nie działa póki urządzenie nie uzyska połączenia z domoticzem
    Dla mnie szczególnie pkt. b jest nieakceptowalny bo chciałbym używać wyłącznika również jako awaryjnego załaczenia światła w przypadku np. awarii routera

    • Łukasz C. Jokiel

      Nie ma prostej drogi, oprócz obsługi tego w firmware ESPEasy. Do tego zadań stosuje z-wave w domoticzu.

  • jendrush

    Możliwość podłączenia wyświetlacza w ten sposób widziałem już jakiś czas temu, ale interesuje mnie jedna kwestia. Dało by się osiągnąć to samo, tylko z wyświetlaniem np. jednej temperatury dużymi znakami? Wiem że jak czytałem jakiś czas temu o tym to problemem była zdaje się zbyt małą pamięć.

    • Łukasz C. Jokiel

      Hej, wyobraź sobie – o tym samym myślałem. Na RPi, możemy po prostu użyć fontu bitmapowego, tutaj mamy wbudowany. Źródła ESPEasy są dostępne, więc można zapewne przekompilować je pod własne potrzeby, poświęcejąc np: część innego kodu. Może wystarczą bitmapy cyfr?

      • jendrush

        Jeżeli faktycznym problemem była pamięć to może najprościej było by dokonywać tych zmian na ESP z większa jej ilością:)

        • Łukasz C. Jokiel

          RAM albo flash 🙂

  • Adam Nowak

    Cześć.
    W ESPEasy mega v7 zaimplementowano przewijanie ekranu, badałeś może jak w tym rozwiązaniu przesłać dane z domoticza aby pojawiały się na ekranie w odpowiednim momencie?

    • Łukasz C. Jokiel

      Ciekawe, jeszcze nie – dzięki za info, przyjrzę się!