Arduino: Leitura do sensor DS18S20 e DS18B20

1

Demonstração de leitura do sensor DS18S20 e DS18B20 utilizando o arduino. Esses sensor utiliza a comunicação 1-Wire, que possui vantagens em releção ao I2C, pois permite a integração de vários sensores utilizando apenas um fio.
Eu utilizei a biblioteca OneWire, que pode ser baixada aqui.
Funções principais da biblioteca OneWire:
OneWire ds( pin ); – Cria o objeto onewire e define o pino a ser utilizado.
ds.search( addr );  – recupera o endereço de todos no barramento.
ds.reset(); – reset no barramento.
ds.select( addr ); – seleciona o sensor.
ds.write( byte ); – envia um byte ao sensor.
ds.read() – lê um byte do sensor.

DOWNLOAD:
Arquivo de simulação do Proteus: DS18x20_Arduino.DSN;

CóDIGO-FONTE:
2
#include <LiquidCrystal.h>
#include <OneWire.h>

OneWire ds(2); // pino 2
LiquidCrystal lcd(13,12,11,10,9,8);

void setup(void) {
lcd.begin(16,2);
lcd.print(“DS18S20: “);
lcd.setCursor(0,1);
lcd.print(“DS18B20: “);
}

void loop(void) {
byte i = 0;
byte data[9];
byte addr[8];
int temp;
boolean type;

//recupera o endereço dos sensores e armazena em “addr”
if(!ds.search(addr)){
return;
}

switch(addr[0]){
case 0x10: type = 1; break;//DS18S20
case 0x22: type = 0; break;//DS1822
case 0x28: type = 0; break;//DS18B20
default: break;
}

ds.reset();//sinal de reset
ds.select(addr);//envia o endereço do sensor
ds.write(0x44);//inicializa conversao de temperatura
delay(750);//espera 750ms para calcular a temperatura

ds.reset();//sinal de reset
ds.select(addr);//envia o endereço do sensor atual
ds.write(0xBE);//inicia a leitura do scratchpad ( 9 bytes )

//Leitura
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}

if(!type){//DS18B20 ou DS1822

lcd.setCursor(9,1);

if((data[1]>>7)==1){//verifica se a temperatura é negativa
data[1] = ~data[1];
data[0] = (~data[0]) + 1;
lcd.print(“-“);
}
else{
lcd.print(“+”);
}
temp = (data[1]<<4) | (data[0]>>4);
lcd.print(temp);
lcd.print(“.”);
temp = (data[0] & 0x0F) * 625;//casas decimais
if(temp>625){
lcd.print(temp);
}
else{
lcd.print(“0”);
lcd.print(temp);
}
}
else{//DS18S20

lcd.setCursor(9,0);

if((data[1]>>7)==1){//verifica se a temperatura é negativa
data[0] = ~data[0];
lcd.print(“-“);
}
else{
lcd.print(“+”);
}
temp = data[0]>>1;
lcd.print(temp);
lcd.print(“.”);
lcd.print((data[0] & 0x01)*5);//casa decimal

}
lcd.print(” “);
lcd.write(223);//imprime o caracter (°)
lcd.print(“C “);
}

3
UTILIZANDO APENAS UM SENSOR

Caso utilize apenas um sensor no barramento, não há necessidade de fazer a procurar do endereço ROM do dispositivo, pois o mesmo nem será usado.

Ao invés disso envie o comando SKIP ROM(0xCC).
Veja o código como ficou, utilizando apenas o DS18B20:
2
#include <LiquidCrystal.h>
#include <OneWire.h>

OneWire ds(2); // pino 2
LiquidCrystal lcd(13,12,11,10,9,8);

void setup(void) {
lcd.begin(16,2);
lcd.print(“DS18S20: “);
}

void loop(void) {
byte data[9];
int temp;

ds.reset();//sinal de reset
ds.write(0xCC);//skip rom
ds.write(0x44);//inicia conversão de temperatura
delay(750);//espera 750ms para calcular a temperatura
ds.reset();//sinal de reset
ds.write(0xCC);//skip rom
ds.write(0xBE);//inicia a leitura do scratchpad ( 9 bytes )

//Leitura
for (byte i = 0; i < 9; i++) {
data[i] = ds.read();
}
lcd.setCursor(9,0);

if((data[1]>>7)==1){//verifica se a temperatura é negativa
data[1] = ~data[1];
data[0] = (~data[0]) + 1;
lcd.print(“-“);
}
else{
lcd.print(“+”);
}
temp = (data[1]<<4) | (data[0]>>4);
lcd.print(temp);
lcd.print(“.”);
temp = (data[0] & 0x0F) * 625;
if(temp>625){
lcd.print(temp);
}
else{
lcd.print(“0″);
lcd.print(temp);
}
lcd.print(” “);
lcd.write(223);//imprime o caracter (°)
lcd.print(“C “);
}

3

RECUPERANDO O ENDEREÇO ROM
Caso você queira saber o endereço ROM do sensor, é preciso enviar o comando READ ROM(0x33). Veja que so poderá ter apenas um sensor no barramento, para que não ocorra uma colisão de dados.

Você verá no monitor serial algo do tipo: 10 30 C5 B8 0 0 0 C3;
o código em azul: indica a familia do sensor (0x10 – DS18S20, 0x28 – DS18B20, 0x22 – DS1822)
o código em verde: é o número serial (possui 6 bytes, do menos significativo ao mais significativo)
o código em vermelho: é o CRC(verificador de redundância cíclica), usado para a verificar se os dados enviados ao arduino não possuem erros.

Veja o código:
2
#include <OneWire.h>

OneWire ds(2); // pino 2

void setup(void) {
Serial.begin(9600);
}

void loop(void) {
byte i = 0;
byte data[8];
int temp;

ds.reset();//sinal de reset
ds.write(0x33);//read rom

//Leitura
for ( i = 0; i < 8; i++) {
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(” “);
}

Serial.println();

delay(100);
}

3
EXEMPLO COM DS18S20 E POSSUINDO SEU ENDEREÇO ROM
2
#include <OneWire.h>

OneWire ds(2); // pino 2

void setup(void) {
Serial.begin(9600);
}

void loop(void) {
byte data;
byte signal;
int temp;
byte addr[8]={0x10,0x30,0xC5,0xC8,0,0,0,0xC3};//endereço rom do ds18s20

ds.reset();//sinal de reset
ds.select(addr);//envia o endereço rom
ds.write(0x44);//inicia a conversão da temperatura
delay(750);
ds.reset();//sinal de reset
ds.select(addr);//envia o endereço rom
ds.write(0xBE);//leitura da temperatura
data = ds.read();//byte 0 – temperatura
signal = ds.read();//byte 1 – sinal de negativo/positivo
if(signal){//se a temp. for negativa
data = (~data);
Serial.print(“-“);
}
Serial.print(data>>1);
Serial.print(“.”);
Serial.print((data & 0x01)*5);
Serial.println();

delay(100);
}

3
Ligação do Sensor DS18S20 e DS18B20:
DS18B20 - 2 sensores
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s