Interfacing NodeMCU with DS1631 Sensor and I2C LCD

This post shows how to interface ESP8266 NodeMCU board (ESP-12E) with DS1631 digital temperature sensor where temperature values (in degrees Celsius and degrees Fahrenheit) are printed on 1602 LCD screen.
The 1602 LCD used in this project is connected to PCF8574 I2C I/O expander which allows it to communicate with NodeMCU board via I2C bus, this minimizes number of pins required and also may simplify the circuit.
The I2C bus uses only two pins: SDA (serial data) and SCL (serial clock).
This interfacing should also work with DFRobot I2C LCD displays.

About the DS1631 (from datasheet):
The DS1631 digital thermometer and thermostat from Maxim Integrated provide 9, 10, 11, or 12-bit temperature readings over a -55 °C to +12 °C range. The DS1631 thermometer accuracy is ±0.5 °C from 0 °C to +70 °C with 3.0V ≤ VDD ≤ 5.5V. The thermostat on DS1631 provides custom hysteresis with user-defined trip points (TH and TL). The TH and TL registers and thermometer configuration settings are stored in NV EEPROM so they can be programmed prior to installation.

Benefits and features:

  • Operating temperature range: -55 °C to +125 °C (-67 °F to +257 °F).
  • ±0.5 °C Accuracy over 0 °C to +70 °C range.
  • User-Selectable output resolution from 9 bits to 12 bits.
  • Reduce cost with no external components.
  • Up to eight devices can operate on a 2-wire bus.
  • Flexible and nonvolatile user-defined thermostatic modes with custom hysteresis.
  • Available in 8-Pin μSOP, SO and DIP packages.

DS1621 pin assignment

The I2C LCD display and the DS1631 sensor can be connected to the same I2C bus where the NodeMCU board microcontroller can talk with both devices (one at a time).

Hardware Required:

  • ESP8266 NodeMCU board (LoLin)
  • DS1631 temperature sensor   —->   datasheet
  • 1602 LCD screen
  • PCF8574 I/O expander (or PCF8574A)   —->   PCF8574 datasheet
  • 3 x 10k ohm resistor
  • 2 x 4.7k ohm resistor
  • 330 ohm resistor
  • 10k ohm variable resistor or potentiometer
  • micro USB cable (for programming and powering the circuit)
  • Breadboard
  • Jumper wires

NodeMCU with DS1631 sensor and 1602 LCD circuit:
Project circuit diagram is shown below.

ESP8266 NodeMCU I2C LCD DS1631 sensor circuit

The PCF8574 I/O expander is powered with 3.3V that comes from the NodeMCU board (PCF8574 VDD pin is connected to NodeMCU 3V3 pin and VSS is connected to GND).
SDA and SCL pins of the PCF8574 are respectively connected to NodeMCU pins D1 and D2.

A0, A1 and A2 pins of the PCF8574 are address select pins, they decide the I2C address of the chip. In this example each pin is connected to VDD (3.3V) through a 10k ohm resistor (placing the 10k resistor is optional, each pin can be connected directly to VDD).
The I2C address of the PCF8574 is: 0x20 | A2+A1+A0
In the circuit above the three pins A2, A1 and A0 are connected to VDD ( each one through 10k resistor). That means the I2C address is equal to 0x20 | 7 = 0x27.

If the PCF8574A is used instead of the PCF8574 then the I2C address is: 0x38 | 7 = 0x3F.

LCD data pins are connected to the PCF8574 where: RS, RW, E, D4, D5, D6 and D7 are respectively connected to P0, P1, P2, P4, P5, P6 and P7.
The 1602 LCD is powered with 5V from the NodeMCU board where its VDD pin is connected to NodeMCU pin VU and VSS is connected to GND.
The 1602 LCD operating voltage range is 4.5V – 5.5V and it may not work with 3.3V. The good thing is it accepts 3.3V on its I/O pins.

Other LCD pins are connected as follows:
VSS, RW, D0, D1, D2, D3 and K are connected to NodeMCU GND pin,
VEE to the 10k ohm variable resistor (or potentiometer) output,
A is connected to NodeMCU VU pin (5V) through 330 ohm resistor.
VEE pin is used to control the contrast of the LCD. A (anode) and K (cathode) are backlight LED pins.

The DS1631 temperature sensor SDA (serial data) and SCL (serial clock) pins are respectively connected to NodeMCU board pins D1 and D2 (PCF8574 and DS1631 are connected to the same I2C bus). The DS1631 is supplied with 3.3V from the NodeMCU board.
The three pins: A0, A1 and A2 are slave address select pins, they are connected to ground, therefore the DS1631 takes an address of 0x48 (1001+A2+A1+A0).

NodeMCU with DS1631 sensor and 1602 LCD code:
To be able to compile project code with no error, a library for the I2C LCD display is required, download link is below:

LiquidCrystal_I2C Library   —->   direct link

After the download, go to Arduino IDE —> Sketch —> Include Library —> Add .ZIP Library … and browse for library .zip file (previously downloaded).

Hints:
The I2C LCD library is initialized with address of 0x27, 2 rows and 16 columns:

Since the address pins of the DS1631 sensor (A2, A1 and A0) are connected to NodeMCU GND, its I2C slave address is 0x48 and it is defined in the code as shown below:

In the Arduino code below there is a function named ds1631_temperature(), it is used to read temperature values from the DS1631 sensor.
The previous function returns a signed 2-byte number which is actual temperature value (in °C) multiplied by 16 (why 16? —> because we’re working with 12-bit resolution).
For example if the returned value equals to 209, this means actual temperature is equal to 209/16 = 13.0625 °C.

To get the value of temperature in degrees Fahrenheit (°F), I used the function below:

This function is just from the common one: °F = °C x 9/5 + 32.
Since the temperature in °C is multiplied by 16 the constant number 32 also needs to be multiplied by 16.
To get the °F temperature with no floating number, I multiplied every thing by 10.
This function gives the actual value of the temperature in °F multiplied by 160 (actual °F = f_temp/160).

Since the DS1631 is used with 12-bit resolution, we get the temperature in °C as shown below (example):

Again, why 16 and 625? —> Because we are working with 12-bit resolution (step = ± 0.0625).

The resolution of this thermometer is 0.0625°C (0.1125°F).

Full Arduino code:

NodeMCU with 1602 LCD and DS1631 temperature sensor

Related Project:
NodeMCU with I2C LCD and DS1621 Temperature Sensor

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.