Convertir entero en minutos y activar ampolleta o motor

Hola
He logrado complementar la lcd con el teclado, lo que no he podido realizar es que el tiempo y la temperatura ingresada utilizarla para encender o apagar la ampolleta o el motor.
Destacar que dependiendo la temperatura ambiente debo aumentar a una temperatura maxima en un lapso de tiempo, luego mantener constante la temperatura maxima durante un lapso de tiempo. Bajar la temperatura durante un lapso establecido y mantener la temperatura final durante un periodo constante.

#include <Keypad.h> //incluye libreria del teclado

#include <LiquidCrystal.h> //incluye libreria del lcd

const byte FILAS = 4;     //define el teclado
const byte COLUMNAS = 4;
char keys[FILAS][COLUMNAS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte pinesFilas[FILAS] = {7,6,5,4};
byte pinesColumnas[COLUMNAS] = {3,2,1,0};

Keypad teclado = Keypad(makeKeymap(keys), pinesFilas, pinesColumnas, FILAS, COLUMNAS);

LiquidCrystal lcd(13,12,11,10,9,8);  //define el lcd

const int sensorpin = A0;  //define el sensor de temperatura

int Tinicial = 0; //define la temperatura ambiente
int Tmax = 0;     //define la temperatura maxima a calentar
int Tfinal = 0;   //define la temperatura final entre temperatura ambiente y temperatura maxima
int taumento = 0;  //define el tiempo que demora en aumentar la temperatura de Tambiente a Tmax
int tcte1 = 0;    //define el tiempo que mantiene la temperatura maxima
int tbajada = 0;  //define el tiempo que demora en disminuir de temperatura maxima a temperatura final
int tcte2 = 0;   //define el tiempo para mantener constante la temperatura final

int boton = 0;   //registro del boton pulsado

int S = 0;   //segundos transcurridos 

int resistencia = A3;   //Resistencia electrica de horno representada por una ampolleta
int ventilador = A2;   //ventilador representador por un motor




void setup(){ 
pinMode(A2,LOW);  //Mantiene apagado el motor y la ampolleta
pinMode(A3,LOW);
  
  lcd.begin(16,2);
 
}

void loop(){
  S=millis()/1000;
  
  int valor = analogRead(sensorpin);  //mide y muestra la temperatura ambiente
  float voltaje = (valor / 1024.0)*5.0;
  float temperatura = (voltaje - 0.5)*100;
  lcd.setCursor(0,0);
  lcd.print("T° ambiente");
  lcd.setCursor(0,1);
  lcd.print(temperatura);
  lcd.setCursor(6,1);
  lcd.print("°C");
  
  lcd.setCursor(0,0);
  delay(3000);
  lcd.clear();
  lcd.home();
  Tinicial = temperatura;   //guarda la temperatura ambiente
  
  lcd.print("Ingrese T°max");  //solicita ingresar la temperatura maxima
  lcd.setCursor(6,1);
        lcd.print("°C");
  lcd.setCursor(0,1);
  while(boton != '#'){
    boton = teclado.getKey();
    if(boton != NO_KEY){
      if((boton >= '0') && (boton <='9')){
        valor=(valor+10) + boton-48;
        lcd.print(boton-48);
        
        Tmax = boton-48;    //guarda la temperatura maxima
           
      }
    }
  }
  lcd.setCursor(0,0);
  delay(3000);
  lcd.clear();
  lcd.home();
  boton = 0;
  
       
  lcd.print("Tiempo aumento");  //solicita ingresar el tiempo que demora en aumentar de temperatura ambiente a temperatura maxima
  lcd.setCursor(6,1);
  lcd.print("Minutos");
  lcd.setCursor(0,1);
  while(boton != '#'){
    boton = teclado.getKey();
    if(boton != NO_KEY){
      if((boton >= '0') && (boton <='9')){
        valor=(valor+10) + boton-48;
        lcd.print(boton-48);
        
        taumento = (boton-48); //guarda el tiempo 
      }
    }
  }
        
  lcd.setCursor(0,0);
  delay(3000);
  lcd.clear();
  lcd.home();
  boton = 0;
        
  lcd.print("Tiempo cte1"); //solicita ingresar el tiempo constante de temperatura maxima
  lcd.setCursor(6,1);
  lcd.print("Minutos");
  lcd.setCursor(0,1);
  while(boton != '#'){
    boton = teclado.getKey();
    if(boton != NO_KEY){
      if((boton >= '0') && (boton <='9')){
        valor=(valor+10) + boton-48;
        lcd.print(boton-48);
        
        tcte1 = boton-48; //guarda el tiempo
      }
    }
  }
        
  lcd.setCursor(0,0);
  delay(3000);
  lcd.clear();
  lcd.home();
  boton = 0;
        
  lcd.print("Ingrese T°final"); //solicita ingresar la temperatura final entre temperatura ambiente y temperatura maxima
  lcd.setCursor(6,1);
  lcd.print("°C");
  lcd.setCursor(0,1);
  while(boton != '#'){
    boton = teclado.getKey();
    if(boton != NO_KEY){
      if((boton >= '0') && (boton <='9')){
        valor=(valor+10) + boton-48;
        lcd.print(boton-48);
        
        Tfinal = boton-48;  //guarda la temperatura final
      }
    }
  }
        
  lcd.setCursor(0,0);
  delay(3000);
  lcd.clear();
  lcd.home();
  boton = 0;
       
  lcd.print("Tiempo bajada");  //solicita ingresar el tiempo que demora en disminuir de temperatura maxima a temperatura final
  lcd.setCursor(6,1);
  lcd.print("Minutos");
  lcd.setCursor(0,1);
  while(boton != '#'){
    boton = teclado.getKey();
    if(boton != NO_KEY){
      if((boton >= '0') && (boton <='9')){
        valor=(valor+10) + boton-48;
        lcd.print(boton-48);
       
        tbajada = boton-48;  //guarda el tiempo
      }
    }
  }
        
  lcd.setCursor(0,0);
  delay(3000);
  lcd.clear();
  lcd.home();
  boton = 0;
        
  lcd.print("Tiempo cte2"); //solicita ingresar el tiempo constante de la temperatura final
  lcd.setCursor(6,1);
  lcd.print("Minutos");
  lcd.setCursor(0,1);
  while(boton != '#'){
    boton = teclado.getKey();
    if(boton != NO_KEY){
      if((boton >= '0') && (boton <='9')){
        valor=(valor+10) + boton-48;
        lcd.print(boton-48);
        lcd.setCursor(6,1);
  lcd.print("Minutos");
        tcte2 = boton-48; //guarda el tiempo
      }
    }
  }
        
  lcd.setCursor(0,0);
  delay(3000);
  lcd.clear();
  lcd.home();
  boton = 0;
  
  if (S <= taumento){   //enciende la ampolleta durante el tiempo para aumentar la temperatura 
    digitalWrite(A3,HIGH);
    digitalWrite(A2,LOW);
  }
  if (S <= tcte1){   //mantiene la temperatura maxima 
    digitalWrite(A3,LOW);
    digitalWrite(A2,LOW);
  }
  if (S <= tbajada){  //enciende el ventilador durante el tiempo de disminuir la temperatura
    digitalWrite(A3,LOW);
    digitalWrite(A2,HIGH);
  }
  if (S <= tcte2) {   //mantiene la temperatura final constante
    digitalWrite(A3,LOW);
    digitalWrite(A2,LOW);
  }
    
    
}

Si estás ingresando los datos de la forma decenas-unidades, están mal los ingresos. También están mal almacenados los datos ingresados.
Debería ser

valor = 0;
while(boton TU_CONDICION){
    boton = teclado.getKey();
    if(boton != NO_KEY){
      if((boton >= '0') && (boton <='9')){
        valor=(valor*10) + boton-48;
        lcd.print(boton-48);
        
        dato_ingresado = valor;  
      }
    }
}

Reemplaza TU_CONDICION por la condición que corresponde a cada caso.
Reemplaza dato_ingresado por Tmax, taumento, etc. según corresponda.

Ten en cuenta que, tal como está tu código, va a pedir y esperar que se ingrese cada dato en cada pasada del loop().

Saludos

1 Like

Otra cosa @matnavar debes aprender a programar sin usar delay(). Solo te va a traer problemas en cuanto código uses.
Si vas a prender un par de leds y nada mas usalo pero para todo lo demas solo es un contratiempo.
Ve a la sección Documentación y aprende a usar millis() en su reemplazo y máquina de estados como herramienta que organiza un código y lo hace fluido en conjunción con millis().

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.