Ajuda Arduino - Programar termostato e botão ON/OFF

Tenho Montado um Arduino Mega, uma arduino lcd button shield, nas Porta A8 e na A9 dois sensores de temperatura e humidade DHT 11, e na Saida A13 uma resistencia de aquecimento, e na A14 uma lampada.

A intenção é mostrar a temperatura e a umidade no display e controlar a temperatura num dos locais. Consegui fazer esse controlo ao atingir a temperatura de 27º desliga a resistencia e quando baixa volta a ligar.

Pretendia que ligasse quando estivesse a baixo dos 26º e que desligasse aos 29º, para ter um intervalo de funcionamento, porque da maneira que esta esta sempre a ligar e desligar.

E para ativar a lampada na porta A14, ao clicar numa tecla activar e quando voltar a clicar desliga.

O codigo que ja tenho criado é o seguinte:

#include <dht.h>
#include “LiquidCrystal.h”
// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// define some values used by the panel and buttons
int lcd_key = 0;
int adc_key_in = 0;

#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

#define dht1_dpin A8 //Pino DATA do Sensor ligado na porta Analogica A8
#define dht2_dpin A9 //Pino DATA do Sensor ligado na porta Analogica A9

dht DHT; //Inicializa o sensor

void setup()
{
analogWrite(10, 50); // set brightness on pin 10 to 0-255
lcd.begin(16, 2); // start the library
lcd.setCursor(0,0);
lcd.print(“Int”); // print a simple message
lcd.setCursor(0,1);
lcd.print(“Ext”); // print a simple message

pinMode(A13, OUTPUT);
pinMode(A14, OUTPUT);

Serial.begin(9600);
delay(2000);//Aguarda 1 seg antes de acessar as informações do sensor
}

void loop()
{
DHT.read11(dht1_dpin); //Lê as informações do sensor
lcd.setCursor(4,0);
lcd.print(DHT.temperature);

lcd.setCursor(11,0);
lcd.print(DHT.humidity);

Serial.print("1 Umidade = “);
Serial.print(DHT.humidity);
Serial.print(” % ");
Serial.print("Temperatura = “);
Serial.print(DHT.temperature);
Serial.println(” C ");

//Teste termostato

if(DHT.temperature <= 27.00)
{
lcd.setCursor(7,0);
lcd.print("On ");
digitalWrite(A14, LOW);
}
else
{
lcd.setCursor(7,0);
lcd.print(“Off”);
digitalWrite(A14, HIGH);
}

delay(2000); //Não diminuir muito este valor. O ideal é a leitura a cada 2 segundos

DHT.read11(dht2_dpin); //Lê as informações do sensor
lcd.setCursor(4,1);
lcd.print(DHT.temperature);

lcd.setCursor(11,1);
lcd.print(DHT.humidity);

Serial.print("2 Umidade = “);
Serial.print(DHT.humidity);
Serial.print(” % ");
Serial.print("Temperatura = “);
Serial.print(DHT.temperature);
Serial.println(” C ");
delay(2000); //Não diminuir muito este valor. O ideal é a leitura a cada 2 segundos
}

Qual é a dúvida?

Regra numero 1… nunca usar delay(). Eu corrigi isso por ti… se queres adquirir dados a uma frequência constante, usa o millis().

#include <dht.h>
#include "LiquidCrystal.h"
// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;

#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

#define dht1_dpin A8 //Pino DATA do Sensor ligado na porta Analogica A8
#define dht2_dpin A9 //Pino DATA do Sensor ligado na porta Analogica A9

unsigned char estado_luz = 0;

dht DHT; //Inicializa o sensor

void setup()
{
  analogWrite(10, 50); // set brightness on pin 10 to 0-255
  lcd.begin(16, 2);              // start the library
  lcd.setCursor(0,0);
  lcd.print("Int"); // print a simple message
  lcd.setCursor(0,1);
  lcd.print("Ext"); // print a simple message
  
  pinMode(A13, OUTPUT);
  pinMode(A14, OUTPUT);
  
  Serial.begin(9600);
  delay(2000);//Aguarda 1 seg antes de acessar as informações do sensor
}

void loop()
{
  DHT.read11(dht1_dpin); //Lê as informações do sensor
    lcd.setCursor(4,0);
    lcd.print(DHT.temperature);
    
    lcd.setCursor(11,0);
    lcd.print(DHT.humidity);


    Serial.print("1 Umidade = ");
    Serial.print(DHT.humidity);
    Serial.print(" %  ");
    Serial.print("Temperatura = ");
    Serial.print(DHT.temperature); 
    Serial.println(" C  ");
    
      
//Teste termostato

    if(DHT.temperature <= 26.00) 
    {
    lcd.setCursor(7,0);
    lcd.print("On ");
    digitalWrite(A14, LOW);
    } 
    
    if (DHT.temperature >= 29.0)  // <<<<<<----------------- ADICIONADO
    {
    lcd.setCursor(7,0);
    lcd.print("Off");
    digitalWrite(A14, HIGH);
    } 


//ADICIONADO, TECLA

if (digitalRead(botao) == LOW && estado_luz == 0) {
    estado_luz == 1; 
    digitalWrite(LUZ, LOW);
}

if (digitalRead(botao) == LOW && estado_luz == 1) {
    estado_luz == 0; 
    digitalWrite(LUZ, HIGH);
}   
  
  
 DHT.read11(dht2_dpin); //Lê as informações do sensor
    lcd.setCursor(4,1);
    lcd.print(DHT.temperature);
    
    lcd.setCursor(11,1);
    lcd.print(DHT.humidity);
    
    Serial.print("2 Umidade = ");
    Serial.print(DHT.humidity);
    Serial.print(" %  ");
    Serial.print("Temperatura = ");
    Serial.print(DHT.temperature); 
    Serial.println(" C  ");
  }

Obrigado "bubulindo" Já apliquei o programa, o que está a acontecer é que deixo de ver a situação ON/OFF no display visto que aparece a temperatura com 2 casas decimais, ha alguma possibilidade do print no display seja feito sem as casas decimais?

Relativamente ao ON/OFF da lampada, não me está a funcionar, devo de ter feito alguma alteração mal, a intenção era acender com a tecla "btnRIGHT"

if (digitalRead(btnRIGHT) == LOW && estado_luz == 0) { estado_luz == 1; digitalWrite(A14, LOW); }

if (digitalRead(btnRIGHT) == LOW && estado_luz == 1) { estado_luz == 0; digitalWrite(A14, HIGH); }

Desculpa a minha ignorância, mas é o primeiro trabalho que desenvolvo com Arduino. Obrigado

Para poder explicar melhor, está aqui uma imagem da montagem:

O local onde pretendo neste momento controlar a temperatura é no interior, o exterior simplesmente pretendo ter a temperatura e quando necessário atravez de uma tecla no teclado acender a lâmpada e noutra a resistência de aquecimento exterior. ( para uma próxima acrescer um relógio para poder programar 2 ou 3 ciclos de ativação da lâmpada exterior)

Saídas: A13 - Painel de Aquecimento A14 - Luz A15 - Resistencia de Aquecimento

Entradas: A8 - DHT11 - Interior A9 - DHT11 - Exterior

Como ligaste a tecla?

Como definiste a variável btnRight?

Só por curiosidade... vais usar os botões do LCD shield?

Esses não funcionam da maneira que eu escrevi. Existe um exemplo que vem com o LCD shield que podes usar para ver como se usam as teclas.

É para utilizar os botões do LCD shield.
É possivel?

Claro que sim...

Eu reparei que adaptaste o teu sketch dum que trazia o código para ler e usar os botões... podes usar esse sketch inicial para veres como o fazer.

Eu já tentei de vaias formas mas nunca me funcionou, devo de estar a colocar alguma coisa mal, o pouco que tentei fazer foi com base em outros programas já existentes...

programas existentes esses que nós nunca vimos e como tal não podemos apontar o que está de errado com eles...

Já experimentei varias maneiras, duas delas foram as seguintes:

void loop() { buttonState = digitalRead(btnRIGHT);

if (buttonState == HIGH) { digitalWrite(A14, HIGH); } else { digitalWrite(A14, LOW);

OU

void loop() { lcd_key = read_LCD_buttons();

switch (lcd_key) { case btnRIGHT: { digitalWrite(A14, LOW); } } }

O Display e teclado que utilizo é o seguinte: http://www.dfrobot.com/wiki/index.php?title=Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)

Colega esse LCD+Keypad usa para passar qual o botao pressionado um pino analogico, ou seja, da placa que compoe o LCD+Keypad tens um pino que deves ligar numa entrada analogica a tua escolha e ler o valor analogico desta.Basicamente os 5 botoes que tens na placa dividem um sinal de 5V em 5 partes.Assim quando precionas um pino tens uma tensao,sabes assim qual o botao pressionado ao ler a tensao no pino.
No teu codigo que passaste isso nao acontece.
Retirado do link que passaste tens lá tudo:

o save the digital IO pins, the keypad interface uses only one ADC channel. The key value is read through a 5 stage voltage divider.

int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT; 
 if (adc_key_in < 250)  return btnUP;
 if (adc_key_in < 450)  return btnDOWN;
 if (adc_key_in < 650)  return btnLEFT;
 if (adc_key_in < 850)  return btnSELECT; 
 
 // For V1.0 comment the other threshold and use the one below:
/*
 if (adc_key_in < 50)   return btnRIGHT; 
 if (adc_key_in < 195)  return btnUP;
 if (adc_key_in < 380)  return btnDOWN;
 if (adc_key_in < 555)  return btnLEFT;
 if (adc_key_in < 790)  return btnSELECT;  
*/
return btnNONE;  // when all others fail, return this...
}

Leste bem o link que passaste?
Tens la a papinha toda