Arduino KY-001 Temperature sensor module
From
Buy on deal extreme sensor or kit
Source code from http://playground.arduino.cc/Learning/OneWire
Contents
Introduction
The Arduino has many uses, one of the more popular uses is with temperature sensors. For this the Dallas Onewire DS18B20 is most used. In this example we use this onewire chip and make a sketch for reading the temperature.
With this sensor you can get the temperature in your room, car, whatever.
Product
As in the past the temperature sensor output is analog, we need to add additional A / D And D / A chip into Line conversion, for Arduino resources are not abundant external interface is a big challenge at the same time Utilization is not high. The new DS18B20 Temperature Sensor Module is a good solution for this, it use a unique bus line and economic package that make this sensor a good DIY component,
Specifications
- the module uses a single-bus digital temperature sensor DS18B20, the external power supply voltage Range is 3.0 V to 5.5 V, No standby power. Measurement temperature range of -55 ° C to +125 ℃, Fahrenheit equivalent 67 ° F to 257 ° F, -10 °C to +85 ° C range accuracy of ± 0.5 ° C.
- the temperature sensor is a programmable resolution of 9 to 12 temperature conversion to 12-bit digital format With a maximum of 750 milliseconds formula User definable nonvolatile temperature alarm settings.
- each DS18B20 contains a unique serial number, can be with a plurality ds18b20s Exists in a bus. Temperature sensor can be placed at different places in the detected temperature.
Notes
- The DS18B20 and ordinary transistors look similiar, so be careful not to regard it as a generalPass transistor to avoid damage.
- in order to prevent damage to the DS18B20 ensure that the powerLine and ground are not reversed.
- the relevant technical data on the bus did not mention a single number that can be linked to how much DS18B20, But in practical applications are not as many, and we should pay attention to.
- There is a bus length limitation that should be taken in consideration when long-distance communications, consider bus distributed capacitance and resistance.
- Identify DS18B20 Temperature Sensor Module power line, ground, and data Line, power line and ground points connect to the Arduino test board +5 V, GND, Data bus connect to the digital port.
Raspberry pi 2
note about raspberry test: both 5v and 3.3v setup as described around the links below are working. when i was testing with my finger to elevate temperature, the ds18B20 stop working after few measure. It seems to be dead and not viewable from the pi. After waiting a little bit, i powered off and on the pi and the sensor start to answer again. It's perhaps it is a cheap module and the elevation speed too fast ?.
- the tuto that works for me (very simple and working well !): raspberry pi 2 detailed setup and python script with DS18B20 and raspberry pi 2
- Raspberry pi tutorial and details about KY001 can be found here: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/
- in french (1): another link in french
- in french (2)step by step setup in french
Preparation
- Arduino controller × 1
- DS18B20 Temperature Sensor Module × 1
- USB data cable × 1
- download and install the OneWire libary
Connecting
- Pin - = connect to Arduino GND
- Pin (middel) = connect to arduino +5V
- Pin S = Signal, in this example connect to Arduino Digital port 10
When everything is properly connected, there is a led on the module that blinks when the sensor is read.
Example Code
For arduino
#include <OneWire.h> // DS18S20 Temperature chip i/o OneWire ds(10); // on pin 10 void setup(void) { // initialize inputs/outputs // start serial port Serial.begin(9600); } void loop(void) { //For conversion of raw data to C int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds.search(addr)) { Serial.print("No more addresses.\n"); ds.reset_search(); return; } Serial.print("R="); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return; } if ( addr[0] == 0x10) { Serial.print("Device is a DS18S20 family device.\n"); } else if ( addr[0] == 0x28) { Serial.print("Device is a DS18B20 family device.\n"); } else { Serial.print("Device family is not recognized: 0x"); Serial.println(addr[0],HEX); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print("P="); Serial.print(present,HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print( OneWire::crc8( data, 8), HEX); Serial.println(); //Conversion of raw data to C LowByte = data[0]; HighByte = data[1]; TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; // test most sig bit if (SignBit) // negative { TReading = (TReading ^ 0xffff) + 1; // 2's comp } Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25 Whole = Tc_100 / 100; // separate off the whole and fractional portions Fract = Tc_100 % 100; if (SignBit) // If its negative { Serial.print("-"); } Serial.print(Whole); Serial.print("."); if (Fract < 10) { Serial.print("0"); } Serial.print(Fract); Serial.print("\n"); //End conversion to C }
Sample output to serial console
R=28 FF 54 87 36 16 4 B5 Device is a DS18B20 family device. P=1 5C 1 4B 46 7F FF C 10 D7 CRC=D7 21.75 No more addresses. R=28 FF 54 87 36 16 4 B5 Device is a DS18B20 family device. P=1 5C 1 4B 46 7F FF C 10 D7 CRC=D7 21.81 No more addresses.
For raspberry pi 2
setting up gpio:
First edit /boot/config.txt find dtoverlay and replace with dtoverlay=w1-gpio
save and reboot
after reboot execute:
- sudo modprobe w1-gpio
- sudo modprobe w1_therm
- ls -l /sys/bus/w1/devices/
from the output of the ls command, write down the unique number of your DS18B20 (like: 28-000006dfa76c)
write a python script like this one:
#original script from http://www.instructables.com/id/Read-temperature-with-DS18B20-Raspberry-Pi-2/?ALLSTEPS#intro #comments added by jjguazzo import time try: while True: #replace the value (28-000006dfa76c) below with yours tempfile = open("/sys/bus/w1/devices/28-000006dfa76c/w1_slave") #read the current temperature from DS18B20 thetext = tempfile.read() tempfile.close() #clean the raw data tempdata = thetext.split("\n")[1].split(" ")[9] temperature = float(tempdata[2:]) temperature = temperature / 1000 #display the temperature print temperature #wait 1 second before next read time.sleep(1) #prevent the running script to stop except if you press Ctrl+C except KeyboardInterrupt: pass
run and have fun !
For ESP8266 (with nodemcu firmware and arduino IDE)
ESP8266_TEMP_LOGGER real life project for less than 5 euros to trace temperature to a php server