KY-001: Temperature sensor

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

  1. 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.
  2. 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.
  3. 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

  1. The DS18B20 and ordinary transistors look similiar, so be careful not to regard it as a generalPass transistor to avoid damage
  2. In order to prevent damage to the DS18B20 ensure that the powerLine and ground are not reversed.
  3. 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.
  4. There is a bus length limitation that should be taken in consideration when long-distance communications, consider bus distributed capacitance and resistance.
  5. 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 ?.

1.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 2.Raspberry pi tutorial and details about KY001 can be found here: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/ 3.in french (1): another link in french 4.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:

  1. sudo modprobe w1-gpio
  2. sudo modprobe w1_therm
  3. 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 !