Controlador de temperatura com DHT11

Bom dia pessoal, estou precisando de ajuda com um código de arduino. Estou tentando copilar, mas não dá certo. O programa é um controlador de temperatura com relé. O problema é editar o valor da temperatura máxima e mínima através de botões para ativar e desativar o relé. Alguém pode me ajudar?

#include <DHT.h>                        //Inclui a bilbioteca DHT
#include <LiquidCrystal.h>              //Inclui a biblioteca LiquidCrystal
#define DHTPIN 12                       //Define o pino do DHT no Arduino
#define DHTTYPE DHT11                   //Define modelo do DHT
#define pino_rele 13                    //Define o pino de ativação da relé
#define pino_aumenta_max 8              //Define o pino de entrada para aumentar a temperatura máxima
#define pino_diminui_max 9              //Define o pino de entrada para diminuir a temperatura máxima
#define pino_aumenta_min 10             //Define o pino de entrada para aumentar a temperatura mínima
#define pino_diminui_min 11             //Define o pino de entrada para diminuir a temperatura máxima

int temp_min = 20;                      //Define temperatura mínima
int temp_max = 22;                      //Define temperatura máxima
int tm;                                 //Define a variável temperatura como inteira 
int hm;                                 //Define a variável humidade como inteira
int aumenta_max, diminui_max;           //Lista as variáveis do botão de temperatura máxima
int aumenta_min, diminui_min;           //Lista as variáveis do botão de temperatura mínima
LiquidCrystal lcd(1, 3, 4, 5, 6, 7);    //Define os pinos do LCD (RS, E, D4, D5, D6, D7)
DHT dht (DHTPIN, DHTTYPE);
 
byte grau[8] ={ B00001100,              //Montagem do simbolo "grau"
                B00010010,              //Montagem do simbolo "grau"
                B00010010,              //Montagem do simbolo "grau"
                B00001100,              //Montagem do simbolo "grau"
                B00000000,              //Montagem do simbolo "grau"
                B00000000,              //Montagem do simbolo "grau"
                B00000000,              //Montagem do simbolo "grau"
                B00000000,};            //Montagem do simbolo "grau"

unsigned long previousMillis = 0;
const long interval = 2000;             //Intervalo de tempo da medida

void draw()
{
  lcd.setCursor(0,0);                   //Posiciona o cursor no canto superior esquerdo do display
  lcd.print("Temp: ");                  //Mostra o texto "Temp" no LCD
  lcd.print(" ");                       //Adiciona um caractere de espaço
  lcd.setCursor(8,0);                   //Posiciona a informação de temperatura aferida pelo sensor
  lcd.print(tm,1);                      //Inclui a informação de temperatura aferida pelo sensor
  lcd.setCursor(11,0);                  //Posiciona o símbolo de grau formado pelo array
  lcd.write((byte)0);                   //Mostra o símbolo de grau formado pelo array
  lcd.print("C");                       //Mostra o símbolo da unidade Celsius
  lcd.print(" ");                       //Adiciona um caractere de espaço
  lcd.print(temp_max,1);                //Inclui a informação de temperatura máxima setada
  lcd.setCursor(15,0);                  //Posiciona a informação da temperatura máxima setada
 
 
  lcd.setCursor(0,1);                     //Posiciona o cursor no canto inferior esquerdo do display
  lcd.print("Umid : ");                   //ostra o texto "Umid" no LCD
  lcd.print(" ");                         //Adiciona um caractere de espaço
  lcd.setCursor(8,1);                     //Posiciona a informação de umidade aferida pelo sensor
  lcd.print(hm,1);                        //Inclui a informação de umidade aferida pelo sensor
  lcd.setCursor(11,1);                    //Posiciona o símbolo de porcentagem
  lcd.print("%");                         //Mostra o símbolo de porcentagem de umidade
  lcd.print("  ");                        //Adiciona um caractere de espaço
  lcd.print(temp_min,1);                  //Inclui a informação de temperatura mínima setada
  lcd.setCursor(15,1);                    //Posiciona a informação da temperatura mínima setada

    if (tm >= temp_min && tm <= temp_max)   //Condição para acionamento do módulo Relé

    {                                       //Se tm (temp. medida) for maior/igual que temp_min (temp. minima)
      digitalWrite(pino_rele, LOW);         //O módulo Relé liga
    }
    else
    {                                       //Se tm (temp. medida) for menor que temp_min (temp. minima)
      digitalWrite(pino_rele, HIGH);        //O módulo Relé desliga
    }
}
 
void setup(void) 
{ 
 Serial.begin(9600);                    //Iniciliza a porta serial
 lcd.begin(16,2);                       //Inicializa o LCD e especifica sua dimensao
 lcd.clear();                           //Limpa o LCD
 lcd.createChar(0, grau);               //Cria o caractere de grau
 pinMode(pino_rele, OUTPUT);            //Seta o pino como saída 
 pinMode(pino_aumenta_max, INPUT);      //Seta o pino como entrada
 pinMode(pino_diminui_max, INPUT);      //Seta o pino como entrada
 pinMode(pino_aumenta_min, INPUT);      //Seta o pino como entrada
 pinMode(pino_diminui_min, INPUT);      //Seta o pino como entrada
}
 
void loop(void)
{
    unsigned long currentMillis = millis();      //Timer para ler o valor da temperatura
   {
     tm = dht.readTemperature();       //Leitura do valor de temperatura
     hm = dht.readHumidity();          //Leitura do valor de umidade
     previousMillis = currentMillis;
   }
    aumenta_max = digitalRead(pino_aumenta_max); //Lê o pino de entrada para aumentar a temperatura máxima
    if (aumenta_max == 1)
      {temp_max++;}
    while (digitalRead(pino_aumenta_max) == 1)
      {delay(10);}

    diminui_max = digitalRead(pino_diminui_max); //Lê o pino de entrada para diminuir a temperatura máxima
    if (diminui_max == 1)
      {temp_max--;}
    while (digitalRead(pino_diminui_max) == 1)
      {delay(10);}

    aumenta_min = digitalRead(pino_aumenta_min); //Lê o pino de entrada para aumentar a temperatura mínima
    if (aumenta_min == 1)
      {temp_min++;}
  while (digitalRead(pino_aumenta_min) == 1)
      {delay(10);}

    diminui_min = digitalRead(pino_diminui_min); //Lê o pino de entrada para diminuir a temperatura mínima
    if (diminui_min == 1)
      {temp_min--;}
    while (digitalRead(pino_diminui_min) == 1)
      {delay(10);}

    do
    {
      draw();
    }
    while (lcd.display());

    delay(50);                           //Intervalo de leitura do sensor

}

Que erro dá ao compilar?
Será falta da biblioteca DHT ou LiquidCrystal?

rm9050:
Que erro dá ao compilar?
Será falta da biblioteca DHT ou LiquidCrystal?

Ele da erro na linha while (lcd.display());

As bibliotecas estão incluídas certinho. Porém acredito que seja algum erro no meu código, pois não tenho um conhecimento muito avançado em arduino.

O programa funciona perfeitamente se eu retirar a parte do código que faz a leitura dos botões. Por isso acredito que seja algum erro meu.

Ele da erro na linha while (lcd.display());

Beleza, você falou onde está o erro.

Você esqueceu de responder:

Que erro dá ao compilar?

giova014:
Beleza, você falou onde está o erro.

Você esqueceu de responder:

Desculpa. O erro está abaixo:

D:\Users\User\Documents\Arduino\sketch_dec19a\sketch_dec19a.ino: In function 'void loop()':

sketch_dec19a:119:23: error: could not convert 'lcd.LiquidCrystal::display()' from 'void' to 'bool'

while (lcd.display());

^

exit status 1
could not convert 'lcd.LiquidCrystal::display()' from 'void' to 'bool'

Eu penso que é o seguinte.

Ao usar a função lcd.display(); dentro de um while(), este fica a espera que lcd.display(); "responda" true or false, mas sendo uma função void não vai "responder", logo origina um erro.

rm9050:
Eu penso que é o seguinte.

Ao usar a função lcd.display(); dentro de um while(), este fica a espera que lcd.display(); "responda" true or false, mas sendo uma função void não vai "responder", logo origina um erro.

É nesse ponto que minha falta de conhecimento em Arduino pesa. Como posso corrigir esse erro?

No código que você escreveu, inclui duas bibliotecas:

#include <DHT.h>                        //Inclui a bilbioteca DHT
#include <LiquidCrystal.h>              //Inclui a biblioteca LiquidCrystal

Então presume-se que você leu a documentação de ambas e saiba como usá-las.

Você deveria saber que a função lcd.display() tem retorno void, ou seja, retorna nada.

O que o compilador diz como erro é exatamente isso:
Portanto porque usou essa função de forma incorreta como condição de um loop do ... while?

Como posso corrigir esse erro?

Basta apagar a linha que contém a função lcd.display().

giova014:
No código que você escreveu, inclui duas bibliotecas:

#include <DHT.h>                        //Inclui a bilbioteca DHT

#include <LiquidCrystal.h>              //Inclui a biblioteca LiquidCrystal



Então presume-se que você leu a documentação de ambas e saiba como usá-las.

Você deveria saber que a função lcd.display() tem retorno void, ou seja, retorna nada.

O que o compilador diz como erro é exatamente isso:
Portanto porque usou essa função de forma incorreta como condição de um loop do ... while?
Basta apagar a linha que contém a função lcd.display().

Removi a linha que estava dando erro. O programa copila mas não funcionou...

Denrlei:
Removi a linha que estava dando erro. O programa copila mas não funcionou...

Tente ser mais especifico, porque não funcionou é muito vago.
O sensor de temperatura e o lcd já alguma vez funcionaram?
O lcd mostra alguma coisa?
Tentou usar serial monitor para tentar perceber o que se passa?

Porque esta usar "{}" nesta zona

  unsigned long currentMillis = millis();      //Timer para ler o valor da temperatura
   {
     tm = dht.readTemperature();       //Leitura do valor de temperatura
     hm = dht.readHumidity();          //Leitura do valor de umidade
     previousMillis = currentMillis;
   }
    aumenta_max = digitalRead(pino_aumenta_max); //Lê o pino de entrada para aumentar a temperatura máxima

experimente remover, penso que não são necessários

  unsigned long currentMillis = millis();      //Timer para ler o valor da temperatura
   
     tm = dht.readTemperature();       //Leitura do valor de temperatura
     hm = dht.readHumidity();          //Leitura do valor de umidade
     previousMillis = currentMillis;
   
    aumenta_max = digitalRead(pino_aumenta_max); //Lê o pino de entrada para aumentar a temperatura máxima

rm9050:
Tente ser mais especifico, porque não funcionou é muito vago.
O sensor de temperatura e o lcd já alguma vez funcionaram?
O lcd mostra alguma coisa?
Tentou usar serial monitor para tentar perceber o que se passa?

Porque esta usar "{}" nesta zona

  unsigned long currentMillis = millis();      //Timer para ler o valor da temperatura

{
    tm = dht.readTemperature();      //Leitura do valor de temperatura
    hm = dht.readHumidity();          //Leitura do valor de umidade
    previousMillis = currentMillis;
  }
    aumenta_max = digitalRead(pino_aumenta_max); //Lê o pino de entrada para aumentar a temperatura máxima





experimente remover, penso que não são necessários 



unsigned long currentMillis = millis();      //Timer para ler o valor da temperatura
 
    tm = dht.readTemperature();      //Leitura do valor de temperatura
    hm = dht.readHumidity();          //Leitura do valor de umidade
    previousMillis = currentMillis;
 
    aumenta_max = digitalRead(pino_aumenta_max); //Lê o pino de entrada para aumentar a temperatura máxima

Fiz algumas alterações no código, agora ele copila e roda. Mas lê os dados do sensor apenas uma única vez, ou seja, não fica atualizando o valor da temperatura e umidade...

#include <DHT.h>                        //Inclui a bilbioteca DHT
#include <LiquidCrystal.h>              //Inclui a biblioteca LiquidCrystal
#define DHTPIN 12                       //Define o pino do DHT no Arduino
#define DHTTYPE DHT11                   //Define modelo do DHT
#define pino_rele 13                    //Define o pino de ativação da relé
#define pino_aumenta_max 8              //Define o pino de entrada para aumentar a temperatura máxima
#define pino_diminui_max 9              //Define o pino de entrada para diminuir a temperatura máxima
#define pino_aumenta_min 10             //Define o pino de entrada para aumentar a temperatura mínima
#define pino_diminui_min 11             //Define o pino de entrada para diminuir a temperatura máxima

int temp_min = 20;                      //Define temperatura mínima
int temp_max = 24;                      //Define temperatura máxima
int aumenta_max, diminui_max;           //Lista as variáveis do botão de temperatura máxima
int aumenta_min, diminui_min;           //Lista as variáveis do botão de temperatura mínima
int tm, hm;
LiquidCrystal lcd(1, 3, 4, 5, 6, 7);    //Define os pinos do LCD (RS, E, D4, D5, D6, D7)
DHT dht (DHTPIN, DHTTYPE);
 
byte grau[8] ={ B00001100,              //Montagem do simbolo "grau"
                B00010010,              //Montagem do simbolo "grau"
                B00010010,              //Montagem do simbolo "grau"
                B00001100,              //Montagem do simbolo "grau"
                B00000000,              //Montagem do simbolo "grau"
                B00000000,              //Montagem do simbolo "grau"
                B00000000,              //Montagem do simbolo "grau"
                B00000000,};            //Montagem do simbolo "grau"

unsigned long previousMillis = 0;       //Declara que o tempo anterior a millis é 0
const long interval = 2000;             //Intervalo de leitura

void setup() 
{
 lcd.begin(16,2);                       //Inicializa o LCD e especifica sua dimensao
 //Serial.begin(9600);  
 lcd.clear();                           //Limpa o LCD
 lcd.createChar(0, grau);               //Cria o caractere de grau
 pinMode(pino_rele, OUTPUT);            //Seta o pino como saída 
 pinMode(pino_aumenta_max, INPUT);      //Seta o pino como entrada
 pinMode(pino_diminui_max, INPUT);      //Seta o pino como entrada
 pinMode(pino_aumenta_min, INPUT);      //Seta o pino como entrada
 pinMode(pino_diminui_min, INPUT);      //Seta o pino como entrada
}

void loop()
{
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)
  {
  int tm = dht.readTemperature();       //Leitura do valor de temperatura
  int hm = dht.readHumidity();          //Leitura do valor de umidade
  previousMillis = currentMillis;
  lcd.setCursor(0,0);                   //Posiciona o cursor no canto superior esquerdo do display
  lcd.print("Temp: ");                  //Mostra o texto "Temp" no LCD
  lcd.print(" ");                       //Adiciona um caractere de espaço
  lcd.setCursor(8,0);                   //Posiciona a informação de temperatura aferida pelo sensor
  lcd.print(tm,1);                      //Inclui a informação de temperatura aferida pelo sensor
  lcd.setCursor(11,0);                  //Posiciona o símbolo de grau formado pelo array
  lcd.write((byte)0);                   //Mostra o símbolo de grau formado pelo array
  lcd.print("C");                       //Mostra o símbolo da unidade Celsius
  lcd.print(" ");                       //Adiciona um caractere de espaço
  lcd.print(temp_max,1);                //Inclui a informação de temperatura máxima setada
  lcd.setCursor(15,0);                  //Posiciona a informação da temperatura máxima setada
 
  lcd.setCursor(0,1);                     //Posiciona o cursor no canto inferior esquerdo do display
  lcd.print("Umid : ");                   //ostra o texto "Umid" no LCD
  lcd.print(" ");                         //Adiciona um caractere de espaço
  lcd.setCursor(8,1);                     //Posiciona a informação de umidade aferida pelo sensor
  lcd.print(hm,1);                        //Inclui a informação de umidade aferida pelo sensor
  lcd.setCursor(11,1);                    //Posiciona o símbolo de porcentagem
  lcd.print("%");                         //Mostra o símbolo de porcentagem de umidade
  lcd.print("  ");                        //Adiciona um caractere de espaço
  lcd.print(temp_min,1);                  //Inclui a informação de temperatura mínima setada
  lcd.setCursor(15,1);                    //Posiciona a informação da temperatura mínima setada

    if (tm >= temp_min && tm <= temp_max)   //Condição para acionamento do módulo Relé

    {                                       //Se tm (temp. medida) for maior/igual que temp_min (temp. minima)
      digitalWrite(pino_rele, LOW);         //O módulo Relé liga
    }
    else
    {                                       //Se tm (temp. medida) for menor que temp_min (temp. minima)
      digitalWrite(pino_rele, HIGH);        //O módulo Relé desliga
    }

    aumenta_max = digitalRead(pino_aumenta_max); //Lê o pino de entrada para aumentar a temperatura máxima
    if (aumenta_max == 1)
      {temp_max++;}
    while (digitalRead(pino_aumenta_max) == 1)
      {delay(10);}

    diminui_max = digitalRead(pino_diminui_max); //Lê o pino de entrada para diminuir a temperatura máxima
    if (diminui_max == 1)
      {temp_max--;}
    while (digitalRead(pino_diminui_max) == 1)
      {delay(10);}

    aumenta_min = digitalRead(pino_aumenta_min); //Lê o pino de entrada para aumentar a temperatura mínima
    if (aumenta_min == 1)
      {temp_min++;}
    while (digitalRead(pino_aumenta_min) == 1)
      {delay(10);}

    diminui_min = digitalRead(pino_diminui_min); //Lê o pino de entrada para diminuir a temperatura mínima
    if (diminui_min == 1)
      {temp_min--;}
    while (digitalRead(pino_diminui_min) == 1)
      {delay(10);}

delay (50);
  }
}

[code]