Fork me on GitHub

20/02/13

Arduino: Leitura do sensor DS18S20 e DS18B20

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.
ds.read() - lê um byte do sensor.

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


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.

Veja o código:
Arduino IDE



EXEMPLO COM DS18S20 E POSSUINDO SEU ENDEREÇO ROM
Arduino IDE



11 comentários:

  1. Parabé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?

    ResponderExcluir
  2. Na verdade o numero que indica o caractere º é o 176 // Observação.

    ResponderExcluir
  3. 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.


    Acho 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;
    }

    ResponderExcluir
  4. 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.


    Acho 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;
    }

    ResponderExcluir
  5. Ola, por favor, estou tentando testar o primeiro código, mas acho que faltam linhas.
    Entre a linha 2 e 3.
    Será que pode passar ele completo?
    Obrigado

    ResponderExcluir
  6. 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?

    ResponderExcluir
  7. Com 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)

    #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");
    }

    ResponderExcluir
  8. Nã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

Postagens Relacionadas!!