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

Domoticz part 3.1: ESP Easy on ESP8266 – remote and local OLED display with temperature, humidity, light – weather station

In previous entry we connected the SSD1306 OLED display as side display for Raspberry Pi. Creator of ESP Easy – Richard ten Klooster (https://github.com/ESP8266nu/ESPEasy) – recently updated his project to include new sensors, so today we will update our DHT22 enabled remote sensor for Domoticz with display and light metering. Our weather station will get a remote display.

I’ve created such bundle of sensors to allow both temperature and humidity measurement small shack for chopped wood but also to light the way to it after dark via LED lamp. Also I was interested in stability of ESPEasy with DHT22, BH 1750 and OLED I2C display.

What will you need?

Software & Hardware

Let’s do it!

Connecting the display is very easy – event if you didn’t the previous example for Raspberry Pi. After logging in to ESP – ESPEasy – we choose the PINs that will work as I2C bus. This example uses the default: GPIO 4 & 5. Let’s connect our display to +3,3V, GND, and SDL & SCL to GPIO 4 & 5. The configuration is as follows:

ESP Easy - SSD1306
ESP Easy – SSD1306

Pay attention – this is how the sensor was called and the values that we defined – we need to enter them again just the same for the display for ESPEasy to get data and to display them correctly:

ESPEasy DHT22 - config
ESPEasy DHT22 – config

The first value is the address on the I2C bus – to find out if we have correct one go to Tools->I2C Scan, which gives you the address – and notice that example shows another – connected to the I2C bus sensor – Lux – BH1750.:

ESP Easy - Scan i2c
ESP Easy – Scan i2c

Out address is (hexadecimal): 0x3c!
If all is correct – we should see “ESPEasy” on the screen (upside down is still fine).

Next – we move to display configuration – direction, which line are used for displaying – but first let’s try to display some data from external source:

Remote and local display

ESPEasy allows you to display both local sensor dana or any other data via unprotected method – using just http URL.
What is possible – first we can turn on/off the display. In this example the IP address of ESP8266 running ESPEasy is 10.20.30.40. We can turn off the display (i.e. it’s too bright in the night)

Then to turn in on:

Clearing the display:

Now, to us it in our project – we should use the curl to send data from Raspberry Pi:

An example:

Finally, we will use this function to display data from other sensor that our Raspberry Pi has data of – the opposite of what we usually use the ESP for!

But first – we should get the data from our already connected DHT22 and lux sensor. Let’s type the name of our sensor in Line 1. The Line 2 could hold the info about uptime – and time – we know that device is working and has proper communications with NTP.

Where to set NTP ? Go to NTP in Tools and choose your favourite NTP server – i.e. pool.ntp.org.
We got time & uptime – that’s easy. Displaying variable takes more effort – we need to use the percentage as brackets (%). Take a peek at Wiki page for examples.
We’re ready to display the data from DHT22. It’s time to check what was it’s name in the configuration:

ESPEasy DHT22 - config
ESPEasy DHT22 – config

– and here it’s name is: AmicaTempHum. It’s a bit different we need “[ ]”, and the variables (we have two of them when talking to DHT 22) are separated by (#): [AmicaTempHum#Humidity]. This time the “%” is used to tell you that humidity is in % – so it’s supposed to be displayed.

The same approach should be used for temperature. Since by default we set 300 seconds of update time – we should get on the screen, after a while:

ESP8622 with SSD1306 (OLED) display working on ESPEasy
ESP8622 with SSD1306 (OLED) display working on ESPEasy

OPTIONAL: Since we can have quite a lot devices on I2C bus – let’s connect in paralel lux meter – BH1750. Meaning: VCC 3,3V to VCC, SDA & SCL to SDA & SCL finnaly GND to GND. Just like DHT22 it needs tiny amounts of power so the Amica NodeMCU can handle it safely. If we connected it properly we should get this info:

ESP8622 with SSD1306 (OLED) display, DHT22, BH1750 under ESPEasy
ESP8622 with SSD1306 (OLED) display, DHT22, BH1750 under ESPEasy

So, next photo show how much light I’m using here:

ESP8622 with SSD1306 (OLED) display, DHT22, BH1750 under ESPEasy

Beware – if you’re getting values like 54612 lux – the sensor is NOT working properly (check connections).

This is it – domoticz needs to be updated with new virtual Lux sensor (the virtuals for DHT22 have been added last time). So what to do with light intensity sensor ? Using the same approach as with the script for opening garage – we can turn on some LED lamps if it gets dark enough. Or use ‘Events’ in domoticzu if you like GUI approach.

But wait! People commenting this brought up interesting idea:

Displaying other values FROM domoticz on remote sensor

Looking at our example we see that Line 7 is empty. Originally I wanted to add the baraometer, but the shop canceled the order. I have other one on RPi – so why not use this data – atmospheric pressure cannot be that different, right? The BMP180 gives me temperature and pressure in hPa. I don’t care about the temperature, but the pressure is interesting. Since we already brought up the garage exampe  you might remember that a LUA script w domoticz can give you data and allows you to use it:

  • we need to get the pressure data
  • cut it (remove extra info)
  • display it on SSD1306 attached to ESP8266

The LUA script will use the round function – single digit, and will be launched every minute (or smarter – at any change then if with devicechanged) – so let’s use the time option.
In my system this sensor is named ‘TemperaturaCisnienie’ so remember the name of the script has to match it:

IP address needs to mathc you network and script goes to /home/pi/domoticz/scripts/lua:

So after a while you will get pressure on the screen.

Another example from comments discussion:
I you have the termometer from previous example about attaching termometers to domoticz – corresponding script is here (remember about the name!)

This time we only update on temperature CHANGE.




  • 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ę!