ESP8266 (NodeMCU) + 1.8 Inch TFT LCD Display Modul 128X160 SPI Serial ST7735B

Some notes how to connect a "1.8 Inch TFT LCD Display Modul 128X160 SPI Serial ST7735B IC SD Card für Arduino" to a ESP8266 running with NodeMCU.

You need a NodeMCU firmware with (at least) the modules bit and UCG (with st7735 display option).

NodeMCU custom build options.


The display has a 8-pin and 16-pin interface. The TFT interface in both are the same. You can choose either of the two interfaces for wiring.

     ESP8266 --             DISP             -- ESP8266
     OPTION 1                                   OPTION 2
                |      ST7735B 1.8 TFT     |
                |                          |
         GND -- | GND  (1)                 |
         3V3 -- | VCC  (2)                 |
                | NC   (3)                 |
         3V3 -- | BL   (4)         (1) RST | -- GPIO16 (D0)
                | NC   (5)         (2) CS  | -- GPIO15* (D8) 
GPIO16  (D0) -- | RST  (6) TFT     (3) D/C | -- GPIO02 (D4)
GPIO02  (D4) -- | RS   (7) TFT     (4) DIN | -- GPIO13 (D7)
GPIO13  (D7) -- | SDA  (8) TFT     (5) CLK | -- GPIO14 (D5)
GPIO14  (D5) -- | SCK  (9) TFT     (6) VCC | -- 3V3
GPIO15* (D8) -- | CS   (10)TFT     (7) BL  | -- 3V3
                | CLK  (11)SD      (8) GND | -- GND
                | MISO (12)SD              |
                | MOSI (13)SD              |
                | CS   (14)SD              |
                | NC   (16)                |
                | NC   (15)                |

*) pull-down 10k to GND

ESP8266 NodeMCU dev board connected to 16pin interface of TFT
ESP8266 NodeMCU dev board connected to 8pin interface of TFT


I use the GraphicsTest.lua to test the connection. GraphicsTest is part of the NodeMCU examples (you have to upload also all GT_*.lua files to run the test).


Flash ESP8266-12/12E

Steps to flash new firmware:
  1. (optional) Backup flash
    esptool.py --port port-of-esp8266 --baud 115200 read_flash 0x000 4194304 fw_backup.bin
  2. Erase flash
    esptool.py --port port-of-esp8266 --baud 115200 erase_flash
  3. Write esp init data (see SDK Init Data)
    esptool.py --port port-of-esp8266 --baud 115200 write_flash 0x3fc000 esp_init_data_default.bin
  4. Write firmware
    esptool.py --port port-of-esp8266 --baud 115200 write_flash 0x0000 fw.bin


ESP-01 + DHT22: Send data to influxdb

My first ESP-01 "system" is running now. It measures temperature and humidity using a DHT22 every 20 seconds and send the data to an influxdb database.

The influxdb is then used by a Grafana instance where I define a panel for the temperature and humidity. Here are the first measurements:

Looks like there where a glitch at about 12:30 - I will have a look how often this happen.
And here is the corresponding ESP code:


First Steps with ESP-01 on OS X El Capitan - Part 2

In part 1 I described how I setup my my environment. In this part I will show my first lua programming steps with the ESP8266 using the Lua based NodeMCU firmware.

First I create an init script (init.lua). This will be loaded by the firmware after each boot/restart.
As last step in the boot/restart process the firmware loads and executes the script init.lua (you can see a corresponding error message in the last screenshot in part 1).
It is recommended to provide an opportunity to interrupt the execution of init.lua to be able to change anything. Otherwise it may happen e.g. if your code contains a fatal error which cause a reboot that you are unable to deactivate/fix the code - and finally have to reflash the firmware to be break the loop.

I'm looking around an found a post about Methods of Interrupting init.lua during boot. My init.lua code based mainly on the ideas described there. But here it is:
  1. it calls firmwareInfo() to output information about the firmware. For the moment it just inform if it is a FLOAT or INTEGER version
  2. after a delay of BootTimeout ms (to give the NodeMCU some time to initialize it self) init() is called
  3. in init() the serial port is initialized and configured to watch for a transmitted ENTER key
  4. if an ENTER is received the function abort() is called, which set the abortFlag to true.
  5. After AbortTimeoutms startup() is called. There the abortFlag is checked and the startup is canceled or executed by trying to load and execute 'user.lua'
The output of such a run without interrupt is shown below:

Next step was to wrote a script to read out a DHT22 sensor. The user_dht22.lua script shown below reads temperature and humidity every 2 sec and prints both values. Depending on the used firmware the output is generated using different format and in case of integer also further values.

Output running the script