Tutorial: como utilizar o Sensor de temperatura DS18B20 (prova de água) com Arduino

Adquira estes componentes na Loja do Lab de Garagem

Neste tutorial vamos mostrar como utilizar o sensor de temperatura DS18B20 à prova de água com Arduino. Este sensor utiliza o protocolo digital de apenas um fio (One Wire), portanto apenas uma porta digital para comunicação.

Para fazer as ligações, o sensor contém três fios: um vermelho (VCC), um preto (GND) e um branco (Dados). Conecte o vermelho no 5V do Arduino e o preto no GND do Arduino. Conecte o fio branco no pino digital 10 e um resistor de 4k7 ohm entre o fio branco e o VCC (resistor de Pull-Up). Para maiores informações sobre o sensor utilizado, clique aqui!

Agora que feito as ligações, baixe a biblioteca necessária aqui para fazer a leitura do sensor. Extraia a biblioteca OneWire para dentro da pasta "libraries" localizada dentro da pasta do Arduino. Abra a IDE do Arduino e cole a programação abaixo:

#include <OneWire.h>

int SensorPin = 10; 


OneWire ds(SensorPin); 

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

void loop(void) {
float temp = getTemp();
Serial.println(temp);

delay(100); 

}


float getTemp(){

byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1); 

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); 


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

ds.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float TRead = ((MSB 8) | LSB); 
float Temperature = TRead / 16;

return Temperature;

}

A programação acima adquire a temperatura em graus Celsius. O Arduino verifica se o sensor está conectado corretamente. Caso estiver, prossegue para a aquisição de dados. Para a aquisição de dados é necessário mandar um endereço para detectar o sensor, um endereço para a leitura dos dados do sensor. E depois o Arduino poder converter e mostrar a leitura exata no Serial Monitor.

Dentro da IDE do Arduino, selecione a versão da sua placa Arduino (UNO, Duemilanove, etc) e a porta (COMx, ttyUSBx, ttyACMx, etc) e depois clique em "UPLOAD". Ao terminar de fazer o "UPLOAD", abra a Serial Monitor e selecione "9600" de baud. Você verá o valor da temperatura adquirido pelo sensor em graus Celsius como mostra a figura abaixo:

E é isso! Esperamos que tenha gostado! Caso tenha dúvidas, poste aqui neste blog! Para sugestões de tutoriais, clique aqui! Para ver outros tutoriais e projetos desenvolvidos pela equipe LdG e por outros garagistas, clique aqui e aqui, respectivamente! Até a próxima!

Referências:

http://www.sparkfun.com/products/11050

http://bildr.org/2011/07/ds18b20-arduino/

http://www.arduino.cc/playground/Learning/OneWire

http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Temp/DS18B20...

Exibições: 56507

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Marcelo Mosczynski em 17 janeiro 2013 às 18:54

Usar a família do DS1820 tem alguns benefícios.

1. Você pode pendurar um grande número deles em apenas um pino do arduino

2. Já usei eles ligados ao arduino com um cabo de 20 metros, apenas tive que usar um resistor de 1k2R em vez do 4K7 que é o recomendado, com o LM35 acho que mais que um metro já dá problema...

3. No "parasite mode" (A alimentação vai pelo fio de dados)  você precisa de apenas um par (dois fios)

4. Leitura de temperaturas negativas sem "gambiarra", para fazer o mesmo com o LM35 tem que usar duas portas analógicas. 

Comentário de Ivan Seidel em 4 novembro 2012 às 10:01

Esqueceram de colocar um left shift no MSB! mas isso aconteceu, porque o código do LabDeGaragem BLOQUEIA o duplo caractere "<" (provavelmente para segurança)

Como não tenho como colocar eles literalmente, vou escrever MENOR MENOR no lugar onde deve ficar, rpresentando o duplo "<"

o certo é:

float TRead = ((MSB MENOR MENOR 8) | LSB); 

Comentário de Saulo Bonadiman Gelinski em 28 outubro 2012 às 23:22

vixi gente, alguem já encontrou a solução para esse erro, o meu acontece o mesmo. Grato..

Comentário de Rodrigo Paes em 10 julho 2012 às 13:29

Ola Diego, infelizmente o erro não é este, já estou a um tempinho aqui tentando encontrar este errinho (que acredito que sege minimo) mas não encontro.

Mas muito obrigado pela ajuda, se encontrar me conta :D.

Abras

Comentário de Diego Rodrigo Souza em 10 julho 2012 às 12:17

Olá Rodrigo, 

Creio que apenas está faltando um parênteses antes do ponto e virgula.

((MSB 8) | LSB));

Abraço

Comentário de Rodrigo Paes em 10 julho 2012 às 11:52

Ola, o código esta apresentando o seguinte erro, aguem poderia me dar uma mãozinha :)

Desde já agradeço.

Comentário de Sidney Alves Bastos em 5 julho 2012 às 18:18

Fiquei curioso em saber qual a diferença deste sensor com o LM35, além do fato de um ser digital e o outro analógico. A medida é a mesma? eu poderia usar um LM35 encapsulado para fazer a medida na água?

Comentário de Diego Rodrigo Souza em 4 julho 2012 às 22:51

Olá! Para quem quiser usar este sensor com o sensor de humidade HIH-4030, também vendido no LdG, pode usar o código abaixo:


http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1267245927

S
ó estou com um pequeno problema, quando a temperatura está entre 0 e -10 a saída está entre 0 a 10 positivos.

Até logo!



© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço