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.
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,
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
When everything is properly connected, there is a led on the module that blinks when the sensor is read.
#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
}
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.
setting up gpio:
First edit /boot/config.txt find dtoverlay and replace with dtoverlay=w1-gpio
save and reboot
after reboot execute:
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 !