This post shows how to interface Arduino uno board with DS1621 digital temperature sensor where temperature values (in degrees Celsius and degrees Fahrenheit) are printed on 1602 LCD screen.
About the DS1621 (from datasheet):
The DS1621 Digital Thermometer and Thermostat from Analog Devices provides 9-bit temperature readings, which indicate the temperature of the device. The thermal alarm output, TOUT, is active when the temperature of the device exceeds a user-defined temperature TH. The output remains active until the temperature drops below user defined temperature TL, allowing for any hysteresis necessary.
Benefits and features:
- Measures temperatures from – 55 °C to +125 °C in 0.5 °C increments. Fahrenheit equivalent is -67 °F to 257 °F in 0.9 °F increments.
- Temperature is read as a 9-Bit value (2-byte transfer).
- Converts temperature to digital word in less than 1 second.
- Thermostatic settings are user definable and nonvolatile.
- Power supply range (2.7V to 5.5V).
- Data is read from/written via a 2-wire serial interface (open drain I/O lines).
- Saves space.
- Temperature measurements require no external components.
- 8-pin DIP or SO package (208-mil) packages.
Hardware Required:
- Arduino UNO board —> Board details —> ATmega328P datasheet
- 1602 LCD screen
- DS1621 temperature sensor —-> datasheet
- 2 x 4.7k ohm resistor
- 330 ohm resistor
- 10k ohm variable resistor or potentiometer
- Breadboard
- Jumper wires
Interfacing Arduino with DS1621 Temperature Sensor Circuit:
Project circuit diagram is shown below.
The 1602 LCD screen (2 rows and 16 columns) is used to display temperature values in degrees Celsius and degrees Fahrenheit where:
RS —> Arduino digital pin 2
E —> Arduino digital pin 3
D4 —> Arduino digital pin 4
D5 —> Arduino digital pin 5
D6 —> Arduino digital pin 6
D7 —> Arduino digital pin 7
VSS, RW, D0, D1, D2, D3 and K are connected to Arduino GND,
VEE to the 10k ohm variable resistor (or potentiometer) output,
VDD to Arduino 5V and A to Arduino 5V through 330 ohm resistor.
VEE pin is used to control the contrast of the LCD. A (anode) and K (cathode) are the back light LED pins.
The DS1621 sensor SDA (serial data) and SCL (serial clock) pins are respectively connected to Arduino A4 and A5 pins (ATmega328P hardware I2C module pins). It is is supplied with 5V from the Arduino board.
The three pins: A0, A1 and A2 are slave address select pins which are connected to ground, therefore the DS1621 takes an address of 0x48 (1001+A2+A1+A0).
Arduino with DS1621 Temperature Sensor and 16×2 LCD Code:
Hints:
Since the address pins of the DS1621 (A2, A1 and A0) are connected to Arduino GND its I2C slave address is 0x48, it’s defined in the code as shown below:
1 2 3 | // define DS1621 I2C slave address (1001+A2+A1+A0) // A2, A1 & A0 connected to GND --> 1001000 = 0x48 #define DS1621_ADDRESS 0x48 |
A function named get_temperature() in the Arduino code is used to read raw temperature values from the DS1621 sensor and convert it to tenths degrees Celsius (output value of “135” equals 13.5 °Celsius).
This functions returns a signed integer number (2 bytes).
The temperature in tenths degrees Fahrenheit = (tenth °Celsius) x 9/5 +320 (because: °F = °Cx9/5 + 32).
To get the actual value of each quantity we’ve to divide it by 10. The line below shows an example for temperature in °C:
1 | sprintf(c_buffer, " %02u.%1u%cC", c_temp / 10, c_temp % 10, 223); |
We get the first 2 digits by dividing the tenths value by 10, and the tenths number (number after the decimal point) of the actual temperature value is equal to the reminder of that division (tenths value % 10).
The resolution of this thermometer is 0.5°C.
Full Arduino code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | /*********************************************************************** * * Interfacing Arduino with DS1621 temperature sensor. * Temperature values are printed on 16x2 LCD screen. * This is a free software with NO WARRANTY. * https://simple-circuit.com/ * ***********************************************************************/ #include <Wire.h> // include Arduino Wire library (required for I2C devices) #include <LiquidCrystal.h> // include Arduino LCD library // LCD module connections (RS, E, D4, D5, D6, D7) LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // define DS1621 I2C slave address (1001+A2+A1+A0) // A2, A1 & A0 connected to GND --> 1001000 = 0x48 #define DS1621_ADDRESS 0x48 void setup(void) { lcd.begin(16, 2); // set up the LCD's number of columns and rows lcd.setCursor(0, 0); // move cursor to column 0, row 0 [position (0, 0)] lcd.print("Temp ="); Wire.begin(); // join i2c bus // initialize DS1621 sensor Wire.beginTransmission(DS1621_ADDRESS); // connect to DS1621 (send DS1621 address) Wire.write(0xAC); // send configuration register address (Access Config) Wire.write(0); // perform continuous conversion Wire.beginTransmission(DS1621_ADDRESS); // send repeated start condition Wire.write(0xEE); // send start temperature conversion command Wire.endTransmission(); // stop transmission and release the I2C bus } // variables char c_buffer[8], f_buffer[8]; // main loop void loop() { delay(1000); // wait a second // get temperature in tenths °C int16_t c_temp = get_temperature(); // convert tenths °C to tenths °F int16_t f_temp = c_temp * 9/5 + 320 ; if(c_temp < 0) { // if temperature < 0 °C c_temp = abs(c_temp); // absolute value sprintf(c_buffer, "-%02u.%1u%cC", c_temp / 10, c_temp % 10, 223); } else { if (c_temp >= 1000) // if temperature >= 100.0 °C sprintf(c_buffer, "%03u.%1u%cC", c_temp / 10, c_temp % 10, 223); else sprintf(c_buffer, " %02u.%1u%cC", c_temp / 10, c_temp % 10, 223); } if(f_temp < 0) { // if temperature < 0 °F f_temp = abs(f_temp); // absolute value sprintf(f_buffer, "-%02u.%1u%cF", f_temp / 10, f_temp % 10, 223); } else { if (f_temp >= 1000) // if temperature >= 100.0 °F sprintf(f_buffer, "%03u.%1u%cF", f_temp / 10, f_temp % 10, 223); else sprintf(f_buffer, " %02u.%1u%cF", f_temp / 10, f_temp % 10, 223); } lcd.setCursor(6, 0); // move cursor to position (6, 0) lcd.print(c_buffer); // print c_buffer (temperature in °C) lcd.setCursor(6, 1); // move cursor to position (6, 1) lcd.print(f_buffer); // print f_buffer (temperature in °F) } int16_t get_temperature() { Wire.beginTransmission(DS1621_ADDRESS); // connect to DS1621 (send DS1621 address) Wire.write(0xAA); // read temperature command Wire.endTransmission(false); // send repeated start condition Wire.requestFrom(DS1621_ADDRESS, 2); // request 2 bytes from DS1621 and release I2C bus at end of reading uint8_t t_msb = Wire.read(); // read temperature MSB register uint8_t t_lsb = Wire.read(); // read temperature LSB register // calculate full temperature (raw value) int16_t raw_t = (int8_t)t_msb << 1 | t_lsb >> 7; // convert raw temperature value to tenths °C raw_t = raw_t * 10/2; return raw_t; } // end of code. |
Arduino with DS1621 Sensor and 16×2 LCD Proteus Simulation Video:
We can easily simulate this project with Proteus ISIS software. The following video shows how does it work:
Proteus simulation file download link is below:
Arduino + DS1621 + LCD
Related Project:
Arduino with DS1631 Temperature Sensor and LCD
Discover more from Simple Circuit
Subscribe to get the latest posts sent to your email.