[RESOLVIDO]Sensor 18b20 Temperatura e Código

Olá pessoal, estou engatinhando em arduinod ainda.

Peguei esse código para o sensor 18b20 na internet, mas nao consigo entender pq nao funciona como esperado

#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>

#define DS18S20_ID 0x10
#define DS18B20_ID 0x28

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

OneWire ds(2);

float tempAtual;
float getTemp() {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  float tempAtual;
  //Encontrando o Sensor
  if (!ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return false;
  }
  if (OneWire::crc8( addr, 7) != addr[7]) {
    return false;
  }
  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
    return false;
  }
  ds.reset();
  ds.select(addr);
  // Iniciar a conversa
  ds.write(0x44, 1);
  // Aguardando um tempo para conexão...
  delay(850);
  present = ds.reset();
  ds.select(addr);
  // envia o comando de leitura
  ds.write(0xBE);
  // Recebe 9 bytes
  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  // Calcular a temperature |  0.0625 transforma o valor do sensor em Graus Celsius
  //tempAtual = ( (data[1] << 8) + data[0] ) * 0.0625;
  
  unsigned int raw = (data[1]<<8)|data[0];
  tempAtual = (float)raw/16.0;
Serial.print(tempAtual);   
  return true;
}

void setup()
{

lcd.begin (20, 4);
Serial.begin(9600);
}

void loop() {
float tempAtual(getTemp());


Serial.print (tempAtual);


}

No primeiro Serial.print(tempAtual) antes do “Setup()”; a temperatura sai correta no Monitor

Dentro do “Loop()” mesmo chamando o “getTemp()”; sai a temperatura 0.00 e 1.00

Não estou conseguindo entender o motivo.

Tu queres isto:

float tempAtual = getTemp();

Explique lá esta lógica:

float getTemp() {
(...)
  return true;
}

Desde quando é que "true" é um float?

No entanto, não é esse o problema. O problema é resolvido fazendo:

void loop() {

getTemp();

Serial.print (tempAtual);

}

Não pode declarar uma nova variável "tempAtual" dentro do loop(), porque ela terá sempre o valor 0.0, uma vez que a variável que guarda o valor que resulta da leitura do sensor é a variável global (por acaso com o mesmo nome).

Uma vez que a função getTemp() não retorna "grande coisa", e principalmente por não retornar o tipo de dado que é indicado na sua assinatura, eu aconselhava-o a reformular isso. (ou passar a void, ou a boolean).

luisilva

Obrigado ela ajuda

Como sei o basico do basico de programação e quase nada de arduino

eu praticamente copiei o código completo desse local

https://tushev.org/articles/arduino/10

o código funcionou até eu querer buscar o valor dele dentro do loop();

Quando eu voltar para casa irei testar sua solução, e posto aqui

Agradeço novamente a ajuda :)

luisilva

Testei agora funcionou certinho, muito obrigado!! :)