Falaí galera blz?!
Estou desenvolvendo um programa para controle de um ar condicionado artesanal...
Já esta tudo funcionado direitinho, mas, eu tô com um problema:
Fiz um menu pra poder chamar e programar meu ar condc. mas, quando chamo uma função "x" por exemplo, a função "y" deixa de executar o que foi programado...
Gostaria de saber se tem como, mesmo chamando outra função, manter aquela primeira executando o que se espera dela...
KKKK... Eu fui claro?
Segue o código...
Obs.: O código ainda vai ser retificado, tem muita melhoria ainda a ser feita...
Abraços!!!
// bilbliotecas auxiliares
#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
#include <IRremote.h>
#include <Wire.h>
#include <Limits.h>
//Mapeamento de Hardware
#define fan 13
#define butUp 12
#define butDown 11
#define butP 10
#define incPin 10
#define button2 10
#define button1 9
#define butM 9
#define decPin 9
#define button1 9
#define buttonPin 8
#define Lamp1 4
#define Lamp2 2
#define ledPin 3
#define sensor A0
#define sensorTemp A0
#define ligado 6
#define desligado 7
//protótipo das funções auxiliares
void changeMenu();
void dispMenu();
void data_hora();
void changetemp();
void lights();
void Incremento();
void program();
//Varáveis Globais
int tempPin = 0;
int valorSensorTemp = 0;
int valorTemp = INT_MAX;
int Soma = 1;
int conta = 0;
int val = 0;
int incButton = LOW;
int decButton = LOW;
int segundo,minuto, hora, dia, mes,ano;
unsigned long UtlTime;
byte maxC = 0, minC = 100, maxF = 0, minF = 212;
char menu = 0x01;
char set1 = 0x00, set2 = 0x00;
boolean t_butUp, t_butDown, t_butP, t_butM;
unsigned int debounceDelay_button = 100; // Tempo de debounce do Botao
unsigned int Flagbutton2; // Variavel que identifica o "status" do botao
unsigned int Flagbutton1; // Variavel que identifica o "status" do botao
//Hardwarw do LCD
LiquidCrystal_I2C disp(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//Configurações iniciais
void setup()
{
pinMode(fan, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(incPin, INPUT);
pinMode(decPin, INPUT);
pinMode(ledPin, OUTPUT);
analogWrite(ledPin, 0);
digitalWrite(Lamp1, LOW);
digitalWrite(Lamp2, LOW);
//setup do relógio:
UtlTime=0;
minuto=0;
hora=0;
dia=0;
mes=0;
ano=0;
Serial.begin(9600);
disp.begin(16, 2);
disp.setCursor(0,0);
disp.print(" Tecnologia ");
disp.setCursor(0,1);
disp.print(" ArECO ");
delay (2000);
//Configura o minuto
disp.clear();
disp.setCursor(0,0);
disp.print("Minuto: ");
Serial.print("\nEntre Minuto:");
while(minuto==0) {
if (Serial.available() > 0)
{
minuto= Serial.parseInt();
}
}
disp.print(minuto);
delay(1000);
//Configura a hora
disp.clear();
disp.setCursor(0,0);
disp.print("Hora: ");
Serial.print("\nEntre Hora:");
while(hora==0)
{
if (Serial.available() > 0)
{
hora= Serial.parseInt();
}
}
disp.print(hora);
delay(1000);
//Configura o Dia
disp.clear();
disp.setCursor(0,0);
disp.print("Dia: ");
Serial.print("\nEntre Dia:");
while(dia==0)
{
if (Serial.available() > 0)
{
dia= Serial.parseInt();
}
}
disp.print(dia);
delay(1000);
//Configura o mês
disp.clear();
disp.setCursor(0,0);
disp.print("Mes: ");
Serial.print("\nEntre Mes:");
while(mes==0)
{
if (Serial.available() > 0)
{
mes= Serial.parseInt();
}
}
disp.print(mes);
delay(1000);
//Configura o Ano
disp.clear();
disp.setCursor(0,0);
disp.print("Ano: ");
Serial.print("\nEntre ano:");
while(ano==0)
{
if (Serial.available() > 0)
{
ano= Serial.parseInt();
}
}
disp.print(ano);
delay(1000);
disp.clear();// end setup relógio
disp.begin(16,2);
disp.clear();
analogReference(INTERNAL);
disp.backlight();
for (char i=8; i<13; i++)pinMode(i, INPUT_PULLUP);
pinMode(Lamp1, OUTPUT);
pinMode(Lamp2, OUTPUT);
t_butUp = 0x00;
t_butDown = 0x00;
t_butP = 0x00;
t_butM = 0x00;
} //end setup
//loop infinito
void loop()
{
changeMenu();
dispMenu();
}//end loop
//desenvolvimento das funções auxiliares
void changeMenu() //modifica o menu atual
{
if (!digitalRead(butUp)) t_butUp = 0x01; //Botão Up pressionado? seta flag
if (!digitalRead(butDown))t_butDown = 0x01; //Botão Down pressionado? Seta flag
if (digitalRead(butUp) && t_butUp) //Botão Up solto flag setada?
{ //Sim...
t_butUp = 0x00; //Limpa flag
disp.clear();
menu++;
if (menu > 0x05) menu = 0x01;
} //end butUp
if (digitalRead(butDown) && t_butDown)
{
t_butDown = 0x00;
disp.clear();
menu--;
if (menu < 0x01) menu = 0x05;
} //end butDown
}//end changeMenu
void dispMenu()
{
switch(menu)
{
case 0x01:
data_hora();
break;
case 0x02:
changetemp();
break;
case 0x03:
lights();
break;
case 0x04:
incremento();
break;
case 0x05:
program();
break;
}//end switch menu
}//end dispMenu
void data_hora()
{
if(millis()-UtlTime<0)
{
UtlTime=millis();
}
else
{
segundo=int((millis()-UtlTime)/1000);
}
if(segundo>59)
{
segundo=0;
minuto++;
UtlTime=millis();
if(minuto>59)
{
hora++;
minuto=0;
if(hora>23)
{
dia++;
hora=0;
if(mes==1||mes==3||mes==5||mes==7||mes==8||mes==10||mes==12)
{
if(dia>31)
{
dia=1;
mes++;
if(mes>12)
{
ano++;
mes=1;
}
}
}
else if(mes==2)
{
if(ano%400==0)
{
if(dia>29)
{
dia=1;
mes++;
}
}
else if((ano%4==0)&&(ano%100!=0))
{
if(dia>29)
{
dia=1;
mes++;
}
}
else
{
if(dia>28)
{
dia=1;
mes++;
}
}
}
else
{
if(dia>30)
{
dia=1;
mes++;
}
}
}
}
}
Serial.print(dia);
Serial.print("/");
Serial.print(mes);
Serial.print("/");
Serial.print(ano);
Serial.println();
disp.setCursor(0,0);
disp.print("Data ");
disp.print(dia);
disp.print("/");
disp.print(mes);
disp.print("/");
disp.print(ano);
Serial.print(hora);
Serial.print(":");
Serial.print(minuto);
Serial.print(":");
Serial.print(segundo);
Serial.print("\n");
Serial.println();
disp.setCursor(0,1);
disp.print("Hora ");
disp.print(hora);
disp.print(":");
disp.print(minuto);
disp.print(":");
disp.print(segundo);
}//end data_hora
void changetemp()
{
disp.setCursor(0,0); // Define o cursor na posição de início
int sensor = analogRead(0); // Lê a temperatura do sensor
disp.setCursor(0,0);
int temp = sensor * 0.07; // Converte para Celsius
disp.print(temp);
disp.write(B11011111); // Símbolo de grau
disp.print("C ");
if (temp > maxC) {
maxC = temp;
}
if (temp < minC) {
minC = temp;
}
disp.setCursor(0, 1);
disp.print("H=");
disp.print(maxC);
disp.write(B11011111);
disp.print("C L=");
disp.print(minC);
disp.write(B11011111);
disp.print("C ");
} //end temperatura()
void lights()
{
disp.setCursor(0,0);
disp.print("Acionar Lampadas");
if(!digitalRead(butP)) t_butP = 0x01;
if(!digitalRead(butM)) t_butM = 0x01;
if(digitalRead(butP) && t_butP)
{
t_butP = 0x00;
set1++;
if(set1 > 2) set1 = 0x01;
switch(set1)
{
case 0x01:
disp.setCursor(0,1);
disp.print ("L1 on");
digitalWrite(Lamp1, HIGH);
break;
case 0x02:
disp.setCursor(0,1);
disp.print("L1off");
digitalWrite(Lamp1, LOW);
break;
} //end switch set1
}//end butP
if(digitalRead(butM) && t_butM)
{
t_butM = 0x00;
set2++;
if(set2 > 2) set2 = 0x01;
switch(set2)
{
case 0x01:
disp.setCursor(8,1);
disp.print ("L2 on");
digitalWrite(Lamp2, HIGH);
break;
case 0x02:
disp.setCursor(8,1);
disp.print("L2off");
digitalWrite(Lamp2, LOW);
break;
}//end switch set1
}//end butM
}//end lights
void incremento()
{
incButton = digitalRead(incPin);
decButton = digitalRead(decPin);
if (incButton == HIGH)
{
if(val==255)val=255;
else val++;
}
if(decButton == HIGH)
{
if(val==0)val=0;
else val=val-1;
}
delay(50);
analogWrite(ledPin, val);
disp.setCursor(0,0);
disp.print(" Regul. de velocidade");
disp.setCursor(0,1);
disp.print(" ");
delay (10);
}//end incremento
void program()
{{
/*Para evitar as grandes variações de leitura do componente
LM35 são feitas 6 leitura é o menor valor lido prevalece*/
valorTemp = INT_MAX; // Inicializando a variável com o maior valor int possível
for (int i = 1; i <= 6; i++) { // Lendo o valor do sensor de temperatura
valorSensorTemp = analogRead(sensorTemp);
valorSensorTemp *= 0.07; // Transforma o valor lido do sensor de temperatura em graus... //Celsius aproximados
if (valorSensorTemp < valorTemp) { // Mantendo sempre a menor temperatura lida
valorTemp = valorSensorTemp;
}
delay(100);
}
if(valorTemp > conta) // Indica condição para acionamento do cooler
{
digitalWrite(fan, LOW); // Quando condição verdadeira, liga o cooler
digitalWrite(ligado, HIGH);
digitalWrite(desligado, LOW);
}
else
{
digitalWrite(fan, HIGH);
digitalWrite(desligado, HIGH);
digitalWrite(ligado, LOW);
}
delay(10);
// Exibindo valor da leitura do sensor de temperatura no display LCD
disp.clear(); // Limpa o display do LCD
disp.print("Temperatura:"); // Imprime a string no display do LCD
disp.print(valorTemp);
disp.write(B11011111); // Símbolo de graus Celsius
disp.print("C");
delay(50); // Aguarda 2 segundos
}
delay(debounceDelay_button); // espere um tempo
if(!digitalRead(button1)) // se continua apertado
{
if (Soma == 1) // Se for 1
conta++; // incrementa
else // E se for 0
conta--; // Decrementa
delayMicroseconds(1); // Espera 1 us só
}
delay(debounceDelay_button); // espere um tempo
if(!digitalRead(button2)) // se continua apertado
{
Flagbutton2 = !Flagbutton2; // Inverte estado do botão
if (Flagbutton2 == 1) // Se for 1
{
Soma = 1; // Operação soma
disp.begin(16, 2);
disp.print("++Temperatura");
}
else // E se for 0
{
Soma = 0; // Operação subtração
disp.begin(16, 2);
disp.print("--Temperatura");
}
while(!digitalRead(button2)) // Espera pela liberação do switch
delayMicroseconds(1); // Espera 1 us só
}
disp.setCursor(0, 1);
disp.print(conta);
disp.print(" ");
}
Tags:
Oi BF, boa tarde.
Recomendações:
Remova o código da área de texto do seu tópico;
Anexo- como aquivo;
e leia : http://labdegaragem.com/forum/topics/sugest-o-de-como-postar
Rui
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por