Tengo un problema con un sensor de temperatura y un modulo de rele

estoy tratando de manejar un modulo de 4 relés que irán conectados a unos focos y a su veces estar sensor de temperatura max6675 funcionando, la cuestión es que no logro que haga las 2 funciones a la vez.

#include <max6675.h>
#define push 38
#define rele_1 30
#define rele_2 31
#define rele_3 32
#define rele_4 33
float temperatura=0;
int So =46;
int Cs=47;
int Clk=48;
MAX6675 ktc(Clk,Cs,So);
int cuenta= 0;
int val =0;
int estado =0;
int old_val =0;

void setup() {
  pinMode(push, INPUT_PULLUP);
  pinMode(rele_1,OUTPUT);
  pinMode(rele_2,OUTPUT);
  pinMode(rele_3,OUTPUT);
  pinMode(rele_4,OUTPUT);
  digitalWrite(rele_1,LOW);
  digitalWrite(rele_2,LOW);
  digitalWrite(rele_3,LOW);
  digitalWrite(rele_4,LOW);
  Serial.begin(9600);
  delay(500);

}
void temp(){
  
  unsigned long t =900;
  static unsigned long old_t=0;
   if((millis()-old_t)>t){
  do{
  temperatura=ktc.readCelsius();
  Serial.println("temperatura");
  Serial.println(temperatura);
  Serial.println("c");
 
 delay(1000);
  old_t+=t;
  }while(true);
   t=millis();
  }
  
   
 
}

void rele (){
   unsigned long t =300;
  static unsigned long old_t=0;
   if((millis()-old_t)>t){
  
  while(1){
    val=digitalRead(push);
  if ((val==LOW)&& old_val==HIGH){
    if(cuenta==4){
      cuenta=0;
      }else {
        cuenta++;
      }
      
    estado=!estado;
    delay(19);
    
    }
    old_val=val;
    t=millis();
  if (cuenta==1){
    digitalWrite(rele_1,LOW);
    
  }if (cuenta==2){
    digitalWrite(rele_2,LOW);
    
    
  }
  if (cuenta==3){
    digitalWrite(rele_3,LOW);
    
  }
  if (cuenta==4){
    digitalWrite(rele_4,LOW);
    
  }
  if (cuenta==0){
    digitalWrite(rele_1,HIGH);
    digitalWrite(rele_2,HIGH);
    digitalWrite(rele_3,HIGH);
    digitalWrite(rele_4,HIGH);
  }
  }
  old_t+=t;
   }
}

void loop() {
  
  temp();
  
  rele();
}

Mira tu función temp(), en ella hay un:

do {
} while (true);

Que viene a ser un bucle infinito del cual no sale cuando entra y lo hace casi al
princicio del programa.

Es más, en la función rele hay un

while(1) {
}

Que de nuevo es otro bucle infinito del cual no va a salir.

En resumen, tu programa se queda bloqueado ya sea por uno o por otra funcion.

1 Like

Las observaciones de @victorjam son precisas asi que acá mi sugerencia aunque no esta probado.

#include <max6675.h>

#define INT_TEMP 900
#define INT_RELE 300

#define push 38
#define rele_1 30
#define rele_2 31
#define rele_3 32
#define rele_4 33

float temperatura = 0;
int So = 46;
int Cs = 47;
int Clk = 48;
MAX6675 ktc(Clk, Cs, So);
int cuenta = 0;
int val = 0;
int estado = 0;
int old_val = 0;


void setup()
{
  pinMode(push, INPUT_PULLUP);
  pinMode(rele_1, OUTPUT);
  pinMode(rele_2, OUTPUT);
  pinMode(rele_3, OUTPUT);
  pinMode(rele_4, OUTPUT);
  digitalWrite(rele_1, LOW);
  digitalWrite(rele_2, LOW);
  digitalWrite(rele_3, LOW);
  digitalWrite(rele_4, LOW);
  Serial.begin(9600);
  delay(500);
}

void temp()
{
  static unsigned long old_t = 0;

  if (millis() - old_t > INT_TEMP)
  {
      temperatura = ktc.readCelsius();
      Serial.println("temperatura");
      Serial.println(temperatura);
      Serial.println("c");

      old_t = millis();
  }
}

void rele()
{
  static unsigned long old_t = 0;
 
  if ((millis() - old_t) > INT_RELE)
  {
     val = digitalRead(push);
      if ((val == LOW) && old_val == HIGH)
      {
        if (cuenta == 4)
        {
          cuenta = 0;
        }
        else
        {
          cuenta++;
        }

        estado = !estado;
        //delay(19);
      }
      old_val = val;
             
      if (cuenta == 1)
      {
        digitalWrite(rele_1, LOW);
      }
      if (cuenta == 2)
      {
        digitalWrite(rele_2, LOW);
      }
      if (cuenta == 3)
      {
        digitalWrite(rele_3, LOW);
      }
      if (cuenta == 4)
      {
        digitalWrite(rele_4, LOW);
      }
      if (cuenta == 0)
      {
        digitalWrite(rele_1, HIGH);
        digitalWrite(rele_2, HIGH);
        digitalWrite(rele_3, HIGH);
        digitalWrite(rele_4, HIGH);
      }
    }
    old_t = millis();
}

void loop()
{
  temp();
  rele();
}
1 Like

muchas gracias , efectivamente ese era el problema

muchas gracias por la ayuda , efectivamente ese era el problema

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