Hola nuevamente.
Después de hacer algunos cambios en el código mirando aquí y allá, quise incorporar a mi proyecto tres fases de potencia,,Alta; Media; Baja,que harán que se enciendan tres ventiladores con sus respectivas células:
V1,V2,V3 = Ventiladores
C1,C2,C3= celulas
BAJA= V1,C1 activados ,el resto desactivados
MEDIA= V1,V2 ,C1,C2 activados ,el resto desactivados
ALTA= V1,V2,V2,,,C1,C2,C3 todos activados.
Para esto hice un menú sencillo con tres opciones y un botón para su manejo.
El problema está con el "while" para que solo salte de opción cuando el boton está pulsado, no me continúa con el código a menos que no mantenga este botón apretado,no pudiendo cambiar de temperatura ni nada.
Una ayuda me vendría muy bien para saltar este rompecabezas. Gracias de antemano.
En " void menus()" esta el problema
#include <OneButton.h>
OneButton button(11, true);// Pin del boton
#include <DHT.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd (2,3,4,5,6,7);
#include <EEPROM.h>
#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);
int TempVal; // Valor de temperatura establecido
float Frio; // Valor capturado por el sensor
float Humedad;
int Relay1=10; // Pin salida para el Relay1
int Relay2=12; // Pin salida para el Relay2
byte cursor = 0;
int menu=0;
int btn1=A0;
int releb=A2;
int relem=A3;
int relea=A4;
int tmax = 35;
int tmin = 11;
int MargenTemp = 2; // Histéresis de temperatura
void setup() {
lcd.begin(16,2);
// PRESENTACION //
//lcd.setCursor(0,0);
// lcd.print(" CONTROL DE ");
//lcd.setCursor(0,1);
//lcd.print(" TEMPERATURA ");
// delay(2000);
//lcd.clear();
//lcd.setCursor(6,0);
// lcd.print(" b& ");
//lcd.setCursor(2,1);
// lcd.print(" JDLR2 ");
// delay(10000);
// lcd.clear();
dht.begin();
pinMode(Relay1, OUTPUT);
digitalWrite(Relay1,HIGH);
pinMode(Relay2,OUTPUT);
digitalWrite(Relay2,HIGH);
button.attachClick(click);
pinMode(btn1,INPUT);
pinMode(releb,OUTPUT);
digitalWrite(A2,HIGH);
pinMode(relem,OUTPUT);
analogWrite(A3,HIGH);
pinMode(relea,OUTPUT);
analogWrite(A4,HIGH);
button.attachDoubleClick(doubleclick);
button.attachLongPressStart(longPressStart);
if (EEPROM.read(50) == 255) EEPROM.put(0,-5); // Si es la primera vez que se graba en la eeprom
EEPROM.get(50 , TempVal); // Establece el valor de lo previamente guardado
delay(1000);
lcd.setCursor(0,0);
lcd.print("T:");
MideTemperatura();
lcd.setCursor(11,0);
lcd.print("E:");
lcd.setCursor(13,0);
lcd.print(TempVal);
lcd.print("\337");
lcd.setCursor(0,1);
lcd.print("H:");
lcd.setCursor(6,0);
lcd.print("P:");
}
void click() { // Baja la temperatura establecida y la muestra en pantalla
TempVal--;
if(TempVal < tmin) TempVal = tmin;
lcd.setCursor(13,0);
lcd.print(" ");
lcd.setCursor(13,0);
lcd.print(TempVal);
lcd.print("\337");
lcd.setCursor(0,1);
lcd.print("H:");
lcd.setCursor(6,0);
lcd.print("P:");
}
void doubleclick() { // Sube la temperatura establecida y la muestra en pantalla
TempVal++;
if(TempVal > tmax) TempVal = tmax;
lcd.setCursor(13,0);
lcd.print(" ");
lcd.setCursor(13,0);
lcd.print(TempVal);
lcd.print("\337");
lcd.setCursor(0,1);
lcd.print("H:");
lcd.setCursor(6,0);
lcd.print("P:");
}
void longPressStart() { // Graba en la eeprom ell valor establecido
EEPROM.put(50 , TempVal);
lcd.setCursor(cursor,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("** Guardado **");
delay(1500);
lcd.setCursor(3,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("H:");
lcd.setCursor(6,0);
lcd.print("P:");
}
void MideTemperatura() {
Frio = dht.readTemperature() ; //Se obtiene la temperatura en ºC
lcd.setCursor(2,0);
lcd.print(" ");
lcd.setCursor(2,0);
lcd.print(Frio,0); // Imprime la temperatura ( 1 con un decimal 0 sin decimal)
lcd.print("\337"); // Imprime simbolo °
}
void MideHumedad() {
Humedad= dht.readHumidity(); //Se obtiene la humedad relativa
lcd.setCursor(2,1);
lcd.print(" ");
lcd.setCursor(2,1);
lcd.print(Humedad,0);
lcd.print("\337");
}
void Termostato(){
if (Frio<= TempVal)
{
digitalWrite(Relay1,HIGH);// Apaga el rele1 frio
lcd.setCursor(6,1);
lcd.print(" ");
lcd.setCursor(6,1);
lcd.print("F:OF");
}
if (Frio>TempVal+MargenTemp)
{
digitalWrite(Relay1,LOW);
lcd.setCursor(6,1);
lcd.print(" ");
lcd.setCursor(6,1);
lcd.print("F:ON");
// Enciende Rele1
}
if (TempVal>=Frio)
{
digitalWrite(Relay2,HIGH);// Apaga Relay2 Calor
lcd.setCursor(12,1);
lcd.print(" ");
lcd.setCursor(12,1);
lcd.print("C:OF");
}
if (TempVal>Frio+MargenTemp)
{
digitalWrite(Relay2,LOW); // Enciende Relay2
lcd.setCursor(12,1);
lcd.print(" ");
lcd.setCursor(12,1);
lcd.print("C:ON");
}
}
void menus() {
int lectura1 = digitalRead(btn1);
if(lectura1 == 0){
if(menu == 3){
menu = 0; }
menu++;
while(!digitalRead(btn1));
switch(menu){
case 1:
lcd.setCursor(8,0);
lcd.print("BA");
if(lectura1 == 0){
if(menu==1){
analogWrite(A2,LOW);
analogWrite(A3,HIGH);
analogWrite(A4,HIGH);
}
}
break;
case 2:
lcd.setCursor(8,0);
lcd.print("ME");
if( menu==2){
analogWrite(A2,LOW);
analogWrite(A3,LOW);
analogWrite(A4,HIGH);
}
break;
case 3:
lcd.setCursor(8,0);
lcd.print("AL");
if(menu== 3){
digitalWrite(A2,LOW);
analogWrite(A3,LOW);
analogWrite(A4,LOW);
}
break;
}
}
}
void loop() {
unsigned long currentMillis = millis();
button.tick();
if (currentMillis > 2000) { // Pasado el primer minuto de arranque del programa
if (currentMillis % 500 < 3) { // Cada 20 segundos
MideTemperatura(); // Mide la temperatura Ambiente
Termostato(); // Consulta el termostato
MideHumedad(); // Mide la Humedad Relativa
menus();
}
}
}
Pongo todo el código.
Gracias nuevamente