I decide to mix up a few existing toys to make a simple temperature and humidity indicator. ESP8266 reads temperature and humidity from an HTU21D sensor, and displays the numbers on a 4-digit 7-segment LED display. Since a 4-digit display isn't wide enough for both temperature and humidity, the display cycles between temperature, humidity, and a blank state.
Hardware
Bill of materials
- Adafruit HUZZAH Feather (paid link), containing an ESP8266
- HTU21D sensor breakout (paid link)
- RobotDyn 4-digit 7-segment LED display (paid link), based on TM1637 controller
- Breadboard and jumper wires (paid link)
Wiring
peripheral | peripheral pin | Feather pin | ESP8266 GPIO |
---|---|---|---|
HTU21D | + | 3V | |
HTU21D | - | GND | |
HTU21D | DA | SDA | 4 |
HTU21D | CL | SCL | 5 |
4-digit | 5V | 3V | |
4-digit | GND | GND | |
4-digit | DIO | 14 | 14 |
4-digit | CLK | 12 | 12 |
Breadboard placement
Although an Adafruit HUZZAH Feather is larger than a NodeMCU, the whole project can still fit on a half-size breadboard. The trick is that, the Feather is 7 columns wide on the breadboard, and does not have any pins under its LiPo battery connector on the right side. After putting the Feather closer to the left, there's just enough space to squeeze in an HTU21D board next to the LiPo connector.
board | top-left pin | bottom-right pin |
---|---|---|
Feather | b2 | h17 |
HTU21D | j1 | j4 |
4-digit | e24 | e27 |
Arduino Code
// https://github.com/adafruit/Adafruit_HTU21DF_Library/
// commit 98e68720fe6df28d6033f9f8f54805433b0e9998
#include <Adafruit_HTU21DF.h>
// https://github.com/avishorp/TM1637/
// commit 1337247015fa3a15e7ce0aa10e2d1010b89cc3ab
#include <TM1637Display.h>
Adafruit_HTU21DF htu;
TM1637Display display(12, 14);
void
setup()
{
Serial.begin(115200);
Serial.println();
if (!htu.begin()) {
Serial.println("HTU21D not found");
ESP.restart();
}
// set a low brightness to avoid disturbing sleep at night
display.setBrightness(0);
}
void
loop()
{
// read and display temperature
float tem = htu.readTemperature();
display.showNumberDecEx(static_cast<int>(tem * 100), 0x40);
delay(500);
// read and display humidity
float hum = htu.readHumidity();
display.showNumberDecEx(static_cast<int>(hum * 100), 0x40);
delay(500);
// print both to serial console
Serial.printf("%2.2fC %2.2f%%\n", tem, hum);
// display a blank state
static uint8_t blank[4] = {0, 0, 0, 0};
display.setSegments(blank);
delay(500);
}
Later in 2018, I reproduced this project with Air602 development board instead of ESP8266.