Arduino: Leitura do sensor DS18S20 e DS18B20
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.
CóDIGO-FONTE:
Arduino IDE
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:
Arduino IDE
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.
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:
Arduino IDE
EXEMPLO COM DS18S20 E POSSUINDO SEU ENDEREÇO ROM
Arduino IDE
Obrigadoooo
ResponderExcluirParabéns!! Muito legal, estava precisando de informações sobre o 18B20. Se possível você pode tirar uma duvida? Como deixo a saída da temperatura com apenas um ou dois dígitos após a vírgula/ponto?
ResponderExcluirNa verdade o numero que indica o caractere º é o 176 // Observação.
ResponderExcluirDepende do modelo de display LCD...
ExcluirFinalmente um codigo que deu pa testar no proteus, assim como o projeto, Sé nao entendi como selecionarei um terceiro sensor, pois a temperatura de cada sensor armazeno numa varialvel diferente::: temp1, temp2, temp3.... etc.
ResponderExcluirAcho que é nessa parte do codigo aki, mas,
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
if (!type) { //DS18B20 ou DS1822
temp = (data[1] << 4) | (data[0] >> 4);
temp1 = temp;
}
else { //DS18S20
temp = data[0] >> 1;
minimo = temp;
}
Finalmente um codigo que deu pa testar no proteus, assim como o projeto, Sé nao entendi como selecionarei um terceiro sensor, pois a temperatura de cada sensor armazeno numa varialvel diferente::: temp1, temp2, temp3.... etc.
ResponderExcluirAcho que é nessa parte do codigo aki, mas,
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
if (!type) { //DS18B20 ou DS1822
temp = (data[1] << 4) | (data[0] >> 4);
temp1 = temp;
}
else { //DS18S20
temp = data[0] >> 1;
minimo = temp;
}
Ola, por favor, estou tentando testar o primeiro código, mas acho que faltam linhas.
ResponderExcluirEntre a linha 2 e 3.
Será que pode passar ele completo?
Obrigado
Como posso fazer para o sensor analisar durante 1 minuto e caso temperatura varie em >=6 graus para mais durante 1 minuto ele faz determinado comando que eu vou fazer. É possível isso?
ResponderExcluirCom o codigo abaixo consegui de forma simples e bem limpa obter temperatura de 2 sensores, DESDE QUE saibamos os endereços de cada um (o que é facil de se conseguir)
ResponderExcluir#include
#include
// QUAL PORTA ESTAO LIGADOS OS SENSORES NO ARDUINO
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
//abaixo faz-se necessario informar os enderecos de cada sensor
DeviceAddress CanalA = { 0x28, 0xFF, 0x91, 0xB1, 0x00, 0x16, 0x02, 0xD6 };
DeviceAddress CanalB = { 0x28, 0xFF, 0xE1, 0xC8, 0x00, 0x16, 0x01, 0x62 };
void setup(void)
{
// iniciando a porta serial
Serial.begin(9600);
// iniciando a biblioteca
sensors.begin();
// configurando a resolucao para 10 bit
sensors.setResolution(CanalB, 10);
sensors.setResolution(CanalB, 10);
}
void loop(void)
{
delay(2000);
sensors.requestTemperatures();
float TempCanalA = sensors.getTempC(CanalA);
float TempCanalB = sensors.getTempC(CanalB);
Serial.print("Temperatura do Canal A: ");
Serial.print(TempCanalA);
Serial.print("\n\r");
Serial.print("Temperatura do Canal B: ");
Serial.print(TempCanalB);
Serial.print("\n\r\n\r");
}
Funcionou perfeitamente e bem mais simples... parabéns
ExcluirNão consigo fazer que o Arduíno encontre o Sensor Ds18B20 no barramento, sai este resultado: FF FF FF FF FF FF FF. O que pode ser?
ResponderExcluir