Ola,
Estou com um problema em um codigo de temporizador, na verdade o codigo do temporizador esta certinho. sozinho. quando tento juntar um outro codigo de termostato que esta o problema, o tempo fica todo louco botoes param de funcionar etc. dessa maneira que esta o codigo agora tudo esta funcionando, mas o problema é que o tempo ficou fora de sincronia e os botoes só funcionam depois de segurar por uns 2 segundos e soltar, se so apertar e soltar nao funciona, alguem poderia me dar uma luz ai,
Segue o Codigo
//Programa: Arduino e DS18B20 controle de rele por temperatura e timer
//Autor: Junior Oliveira
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
int posicao = 0;
int temp_min = 24; // TEMPERATURA MINIMA PARA DESLIGAR
int temp_max = 28; // TEMPERATURA MAXIMA PARA LIGAR
int ahoras = 0; //VARIAVEL PARA MOSTRAR HORAS NO LCD
int aminutos = 0; //VARIAVEL PARA MOSTRAR MINUTOS NO LCD
int asegundos = 0; //VARIAVEL PARA MOSTRAR SEGUNDOS NO LCD
int segundostotal = 0; //Tempo total
int msg = 0; //BARREIRA PARA MENSAGEM DE BEM VINDO
int empieza = 1024; // VARIAVEL PARA BOTAO DE START FUNCIONAR
int varbuth = 0; //VARIAVEL PARA MUDAR VALOR DE HORAS
int varbutm = 0; //VARIAVEL PARA MUDAR VALOR DE MINUTOS
int varbuts = 0; //VARIAVEL PARA MUDAR VALOR DE SEGUNDOS
// CONFIGURACOES DE PINOS PARA O CIRCUITO
int rele_timer = 13; // PINO DIGITAL PARA RELE TIMER
int rele_temp = 12; // PINO DIGITAL RELE TEMPERATURA
int start = A2; //PINO ANALOGICO PARA BOTAO DE START
int buth = A0; //PINO ANALOGICO BOTAO HORAS
int butm = A1; //PINO ANALOGICO BOTAO MINUTOS
int buts = A3; //PINO ANALOGICO BOTAO SEGUNDOS
#define ONE_WIRE_BUS 10 // PINO DIGITAL SENSOR DE TEMPERATURA
#define pino_aumenta 2 // BOTAO AUMENTA TEMPERATURA MAXIMA
#define pino_diminui 3 // DIMINUI TEMPERATURA MAXIMA
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
int temperatura;
int aumenta, diminui;
unsigned long previousMillis = 0;
//Intervalo de medicao temperatura
const long interval = 2000;
void setup(void)
{
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(rele_temp, OUTPUT);
pinMode(rele_timer, OUTPUT);
pinMode(pino_aumenta, INPUT);
pinMode(pino_diminui, INPUT);
digitalWrite(rele_timer, HIGH);
digitalWrite(rele_temp, LOW);
msg = 0; //BARREIRA MENSAGEM BEM VINDO
empieza = 1024; //BARREIRA START
varbuth = 1; //BARREIRA DE HORAS
varbutm = 1; //BARREIRA DE MINUTOS
varbuts = 1; //BARREIRA DE SEGUNDOS
sensors.begin();
}
void loop(void)
{
do
{
sensors.requestTemperatures(); // REQUISITA TEMPERATURA DOS SENSORES
varbuth = analogRead(buth); //LEITURA BOTAO HORAS
varbutm = analogRead(butm); //LEITURA BOTAO MINUTOS
varbuts = analogRead(buts); //LEITURA BOTAO SEGUNDOS
if (varbuth == 0) //SE PRESSIONAR O BOTAO AUMENTA UMA HORA
{
ahoras = ahoras + 1 ;
delay(250);
}
if (varbutm == 0) //SE PRESSIONAR O BOTAO AUMENTA UM MINUTO
{
aminutos = aminutos + 1;
delay(250);
}
if (varbuts == 0) //SE PRESSIONAR O BOTAO AUMENTA UM SEGUNDO
{
asegundos = asegundos + 1;
delay(250);
}
lcd.setCursor(1, 1);
if (ahoras < 10) lcd.print("0"); // SE AS HORAS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
lcd.print(ahoras); // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10) lcd.print("0"); // SE OS MINUTOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
lcd.print(aminutos); // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10) lcd.print("0"); // SE OS SEGUNDOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
lcd.print(asegundos); // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S (H:M:1)
empieza = analogRead(start); //LEITURA DO BOTAO DE START
if (empieza == 0) //Si el boton de arranque, fue pulsado...
{
segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60); // CONVERTE TEMPO TOTAL EM SEGUNDOS
}
//botao aumenta temperatura
aumenta = digitalRead(pino_aumenta);
if (aumenta == 0)
{
temp_max++;
}
while (digitalRead(pino_aumenta) == 0)
{
delay(10);
}
//botao diminui temperatura
diminui = digitalRead(pino_diminui);
if (diminui == 0)
{
temp_max--;
}
while (digitalRead(pino_diminui) == 0)
{
delay(10);
}
lcd.setCursor(0, 0);
lcd.print(temperatura);
lcd.setCursor(2, 0);
lcd.print("C");
lcd.setCursor(4, 0);
lcd.print("MIN");
lcd.setCursor(8, 0);
lcd.print(temp_max);
lcd.setCursor(10, 0);
lcd.print("C");
if (temp_min >= temperatura)
{
digitalWrite(rele_temp, LOW);
}
else if (temp_max <= temperatura)
{
digitalWrite(rele_temp, HIGH);
}
unsigned long currentMillis = millis();
//Timer para ler o valor da temperatura
if (currentMillis - previousMillis >= interval)
{
temperatura = sensors.getTempCByIndex(0);
previousMillis = currentMillis;
}
} while (empieza != 0); // VOLTA AO MENU DE AJUSTE PARA APENAS APERTAR O BOTAO START
while (segundostotal > 0)
{
sensors.requestTemperatures(); // REQUISITA TEMPERATURA DOS SENSORES
delay (235); //DESCONTADO 1 SEGUNDO DO TIMER
segundostotal--;
ahoras = ((segundostotal / 60) / 60); //CONVERTE OS SEGUNDOS TOTAIS EM HORAS
aminutos = (segundostotal / 60) % 60; //CONVERTE OS SEGUNDOS TOTAIS EM MINUTOS
asegundos = segundostotal % 60; //CONVERTE OS SEGUNDOS TOTAIS EM SEGUNDOS
lcd.setCursor(1, 1);
if (ahoras < 10) lcd.print("0"); // SE AS HORAS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
lcd.print(ahoras); // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S (1:M:S)
lcd.print(":");
if (aminutos < 10) lcd.print("0"); // SE OS MINUTOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
lcd.print(aminutos); // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S (H:1:S)
lcd.print(":");
if (asegundos < 10) lcd.print("0"); // SE OS SEGUNDOS FOREM MENOR QUE "10" É COLOCADO UM "0" NA FRENTE
lcd.print(asegundos); // SEM ESSE CODIGO SE MOSTARIA ASSIM: H:M:S (H:M:1)
if (segundostotal == 0) //FINALIZA O TEMPO DO TIMER
{
while (1) //FINALIZA O TEMPO E DESARMA O RELE
{
digitalWrite(rele_timer, LOW);
delay(200);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("TEMPO ESGOTADO");
lcd.setCursor(5, 1);
lcd.print("By: Jr");
}
}
//botao aumenta temperatura
aumenta = digitalRead(pino_aumenta);
if (aumenta == 0)
{
temp_max++;
}
while (digitalRead(pino_aumenta) == 0)
{
delay(10);
}
//botao diminui temperatura
diminui = digitalRead(pino_diminui);
if (diminui == 0)
{
temp_max--;
}
while (digitalRead(pino_diminui) == 0)
{
delay(10);
}
lcd.setCursor(0, 0);
lcd.print(temperatura);
lcd.setCursor(2, 0);
lcd.print("C");
lcd.setCursor(4, 0);
lcd.print("MIN");
lcd.setCursor(8, 0);
lcd.print(temp_max);
lcd.setCursor(10, 0);
lcd.print("C");
if (temp_min >= temperatura)
{
digitalWrite(rele_temp, LOW);
}
else if (temp_max <= temperatura)
{
digitalWrite(rele_temp, HIGH);
}
unsigned long currentMillis = millis();
//Timer para ler o valor da temperatura
if (currentMillis - previousMillis >= interval)
{
temperatura = sensors.getTempCByIndex(0);
previousMillis = currentMillis;
}
}
}