automatización arduino

buenas tardes desde colombia
necesito ayuda.
soy novato en arduino y estoy realizando un proyento el cual no logro hacer funcionar
este consiste en :
un control de temperatura sencillo que prende un rele como control( esta parte ya esta )
pero necesito que cuando llegue a cierta temperatura por ej 31 grados centígrados prenda un rele por un tiempo ej 15 minutos y luego que este relé se apague, se prenda otro rele por tiempo ej 10 minutos.
el problema es que no puedo usar delay por que tengo que mostrar temperatura el lcd al mismo tiempo (entonces seria millis pero logro hacer que funcione .
esta es la parte que si funciona :slight_smile: :slight_smile:

#include <LiquidCrystal.h>
#include <Wire.h>
#include "max6675.h"

int ktcSO = 22;
int ktcCS = 24;
int ktcCLK = 26;

MAX6675 ktc(ktcCLK, ktcCS, ktcSO);

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
 

 //////////////////////////////////
  int h = ktc.readCelsius();    //                                                Lee la humedad     temperatura lcd


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int pinrele=20;        //Asignamos el pin 13 al rele
///////////////////////////////////////////////////////////
int pinrele2=17;        //Asignamos el pin 13 al rele

int led13=30;
////////////////////////////////////////////////////////////////////////////////////
int control1=32;

int numero = 10;

/////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////// 
void setup()
{
  Serial.begin(9600);
  // Definimos la LCD con dimension 2x16 y definimos los caracteres que deben salir en las filas:
  
  
   pinMode(pinrele,OUTPUT);  //configura la salida
    //tengo un pulsador conectado al pin 7 usando la resistencia pull-up
    //cuando lo presiono leo cero
//////////////////////////////////////////////////////////////////////////////////////////


       
       pinMode(control1,OUTPUT);          //Declaramos el rele como salida

/////////////////////////////////////////////////////////////////////////////////////
                   pinMode(45,OUTPUT);          //Declaramos el rele como salida
                         //Declaramos el boton como entrad            
     
       pinMode(pinrele2,OUTPUT);          //Declaramos el rele como salida
     digitalWrite(pinrele2,HIGH);     //desactiva el rele
     digitalWrite(pinrele,HIGH);     //desactiva el rele

              //Declaramos el rele como salida
 /////////////////////////////////////////////////////////////////////////////////////////////////////////
 lcd.begin(16, 2);
 
  

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}



void loop()
{
  //////////////////////////////////////////////////////////////////

{
  int h = ktc.readCelsius();    //                                                Lee la humedad     temperatura lcd
   lcd.setCursor(13, 0); //columna, fila
   lcd.print(h);
      lcd.setCursor(11, 0); //columna, fila
   lcd.print("T");
 Serial.print("Deg C = "); 
 Serial.println(ktc.readCelsius());
delay(300);                      //tiempo agua
///////////////////////////////////////////////////////////
}

if (h<33)
{
   digitalWrite(control1,HIGH); 
  }                                                               //tiempo agua
 //Enciende el LED                                      control de temperatura  

 else                                //si no 
    digitalWrite(control1,LOW);     //desactiva el rele
//////////////////////////////////////////////////////////////////////////////////////////////////////




  
           
 
 }

No acabo de entender la secuencia.Hablas de un rele de control que no especificas como debe funcionar
y de un rele que cuando se llega a determinada temperatura se acciona durante 15 minutos y al acabar los 15 minutos se apaga dicho rele y se enciende otro rele durante 10 minutos.Porfavor ,se mas especifico para poder ir "al grano".

Bueno estoy como jose.
Mejoré tu código y me encuentro con que quieres que superada una temperatura 33 según tu código, actives el rele1 x T1 (15min) y luego se apaga y activa rele2 por T2. Okay y que pasa con la temperatura durante ese tiempo o no tiene importancia?

De todos modos esto es lo que hice: Supongo que cuando la temperatura supere tu valor (en este caso 33 grados), se haga la secuencia de reles sin importar que pase con la temperatura luego.

#include <LiquidCrystal.h>
#include <Wire.h>
#include "max6675.h"

#define ktcSO    22
#define ktcCS    24
#define ktcCLK   26

MAX6675 ktc(ktcCLK, ktcCS, ktcSO);

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define pinRele1    20        //Asignamos el pin 20 al rele1

#define pinRele2    17        //Asignamos el pin 17 al rele2

#define led13       30
#define control1    32
#define TIEMPO1     15*60*1000  // 15 min = 15 * 60 seg * 1000 mseg
#define TIEMPO2     10*60*1000  // 10 min = 10 * 60 seg * 1000 mseg

int h;
int numero          = 10;
bool flag1 = false;
bool flag2 = false;
unsigned long startRele = 0;
unsigned long muestroTemp;

void setup(){

  Serial.begin(9600);
  // Definimos la LCD con dimension 2x16 y definimos los caracteres que deben salir en las filas:
  lcd.begin(16, 2);

  pinMode(pinRele1, OUTPUT);          // configura la salida
                                      // tengo un pulsador conectado al pin 7 usando la resistencia pull-up
                                      // cuando lo presiono leo cero
  pinMode(pinRele2, OUTPUT);          // Declaramos el rele como salida
  digitalWrite(pinRele1, HIGH);       // desactiva el rele
  digitalWrite(pinRele2, HIGH);       // desactiva el rele

  pinMode(control1,OUTPUT);           // Declaramos el rele como salida
  pinMode(45,OUTPUT);                 // Declaramos el rele como salida
                                      // Declaramos el boton como entrada           

}

void loop() {
  
  if (millis() - muestroTemp > 1000) {
      h = ktc.readCelsius();    // Lee la temperatura 
      lcd.setCursor(13, 0);     //columna, fila
      lcd.print(h);
      lcd.setCursor(11, 0);     //columna, fila
      lcd.print("T");
      Serial.print("Deg C = "); 
      Serial.println(ktc.readCelsius());
      muestroTemp = millis(); 
  }

  if (h < 33) {
      digitalWrite(control1,HIGH);    // desactiva el rele
  }
  else {
      digitalWrite(control1,LOW);     // activa el rele
      if (!flag1 && !flag2) {
          startRele = millis();        
          digitalWrite(pinRele1, LOW); // activo Rele1
      }
  }

  if (flag1) {
      if (millis()-starRele >= TIEMPO1) {
          digitalWrite(pinRele1, HIGH);  // desactivo Rele1
          digitalWrite(pinRele2, LOW);   // activo Rele2
          flag2 = true;
          flag1 = false;
          startRele = millis();  
      }
  }  

  if (flag2) {
      if (millis()-starRele >= TIEMPO2) {
          digitalWrite(pinRele2, HIGH);   // desactivo Rele2
          flag2 = false;
      }
  }
}

gracias por la respuesta
veo que no tuve mucha claridad a explicarme.
la temperatura seguirá midiendo y controlando y mostrándose en la lcd por aparte.
lo importante es la secuencia uno por uno de los reles aunque.
en tu codigo la temperatura se pausa al iniciar la secuencia (como no me explique bien ) debera seguir midiendo
por otra parte lo ensaye moviendo los tiempos (TIEMPO2 10601000 // 10 min = 10 * 60 seg * 1000 mseg) de esta manera TIEMPO2 1601000 // 10 min = 10 * 60 seg * 1000 mseg pero no hubo secuencia se quedo prendido ?
si kme pueden ayudar
gracias

Verifica ahora porque definí mal las variables.
puse unsigned int y deben ser unsigned long.

Prueba otra vez.

De aquí en mas ponle un poco de esfuerzo de tu parte!!

gracias por la pronta respuesta la verdad soy novato y hay voy entendiendo el tuyo para asi aprender un poco mas de este tema
mi problema es que el tuyo no da secuencias prende rele1 y así se queda no pasa nada mas.
supuestamente a los 15 minutos prendería el otro pero no es así se queda encendido.
(ya mire lo del long claramente)

gracias..

Corrige esto

if (!flag1 && !flag2) {
          flag1 = true;
          digitalWrite(pinRele1, LOW); // activo Rele1
          startRele = millis();        
      }

EDITO: hay mas errores asi que aca va todo

#include <LiquidCrystal.h>
#include <Wire.h>
#include "max6675.h"

#define ktcSO    22
#define ktcCS    24
#define ktcCLK   26

MAX6675 ktc(ktcCLK, ktcCS, ktcSO);

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define pinRele1    20        //Asignamos el pin 20 al rele1

#define pinRele2    17        //Asignamos el pin 17 al rele2

#define led13       30
#define control1    32
#define TIEMPO1     15*60*1000  // 15 min = 15 * 60 seg * 1000 mseg
#define TIEMPO2     10*60*1000  // 10 min = 10 * 60 seg * 1000 mseg

int h;
int numero          = 10;
bool flag1 = false;
bool flag2 = false;
unsigned int startRele = 0;
unsigned int muestroTemp;

void setup(){

  Serial.begin(9600);
  // Definimos la LCD con dimension 2x16 y definimos los caracteres que deben salir en las filas:
  lcd.begin(16, 2);

  pinMode(pinRele1, OUTPUT);          // configura la salida
                                      // tengo un pulsador conectado al pin 7 usando la resistencia pull-up
                                      // cuando lo presiono leo cero
  pinMode(pinRele2, OUTPUT);          // Declaramos el rele como salida
  digitalWrite(pinRele1, HIGH);       // desactiva el rele
  digitalWrite(pinRele2, HIGH);       // desactiva el rele

  pinMode(control1,OUTPUT);           // Declaramos el rele como salida
  pinMode(45,OUTPUT);                 // Declaramos el rele como salida
                                      // Declaramos el boton como entrada           

}

void loop() {
  
  if (millis() - muestroTemp > 1000) {
      h = ktc.readCelsius();    // Lee la temperatura 
      lcd.setCursor(13, 0);     //columna, fila
      lcd.print(h);
      lcd.setCursor(11, 0);     //columna, fila
      lcd.print("T");
      Serial.print("Deg C = "); 
      Serial.println(ktc.readCelsius());
      muestroTemp = millis(); 
  }

  if (h < 33) {
      digitalWrite(control1,HIGH);    // desactiva el rele
  }
  else {
      digitalWrite(control1,LOW);     // activa el rele
      if (!flag1 && !flag2) {
          flag1 = true;
          digitalWrite(pinRele1, LOW); // activo Rele1
          startRele = millis();        
      }
  }

  if (flag1) {
      if (millis()-startRele >= TIEMPO1) {
          digitalWrite(pinRele1, HIGH);  // desactivo Rele1
          digitalWrite(pinRele2, LOW);   // activo Rele2
          flag2 = true;
          flag1 = false;
          startRele = millis();  
      }
  }  

  if (flag2) {
      if (millis()-startRele >= TIEMPO2) {
          digitalWrite(pinRele2, HIGH);   // desactivo Rele2
          flag2 = false;
      }
  }
}

Me hiciste simularlo y funciona. Este ultimo funciona.