Pulsar boton y medir una variable, para realizar una acción

Hola, estoy escribiendo uno de mis primerisimos codigos. Es para controlar una pava electrica. Tiene dos pulsadores, una termocupla MAX6675 y un relay.

Lo que quiero hacer, es que el usuario presione el boton de calentar (“cafe” en el codigo), y que si la temperatura sea menor a 68, que mande la senal HIGH al relay. El otro pulsador hace lo mismo pero para otro nivel de temperatura. Yo me limite a escribir solo lo de un pulsador.

Yo lo pense asi, pero no me compila. Seguro que hay algun(os) error(es). El error que me dice es “expected ‘;’ before ‘}’ token”

Aqui el codigo rebelde:

#include "max6675.h"

int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

//Pulsadores 
int cafe = 2;
int hervir = 3;

// Relays
int relay1 = 9;
int relay2 = 10;
float temp;
  
void setup() {
  Serial.begin(9600);


  //Pins de Relay
  pinMode(relay1, OUTPUT); digitalWrite(relay1, LOW);
  pinMode(relay2, OUTPUT); digitalWrite(relay2, LOW);

  //Pins de Pulsadores al inicio
  pinMode(cafe, INPUT);
  pinMode(hervir, INPUT);
  
  Serial.println("MAX6675 test");
  // wait for MAX chip to stabilize
  delay(5000);

  
}

void loop() {
  // basic readout test, just print the current temp
  temp = thermocouple.readCelsius();
//   Serial.print("C = "); 
//   Serial.println(temp);

while ((temp < 68) && (cafe = HIGH)) {digitalWrite(relay1, HIGH)}; //cuando la temperatura es menor a 68 y ahi pulso "café", ahi el relay1 pasa a HIGH. 

//delay(1000);

Veo tambien que lo que hice, requiere que el interruptor “cafe” se mantenga siempre pulsado, lo que no seria viable. → tal vez lo deba reemplazar por un "if (cafe = high) { while (temp < 68) { accionar relay}} . Puede ser asi?

Gracias por la ayuda !

Saludos

te falta cerrar las dos ultimas llaves

  }
}

si quieres hacerlo con un while tendrás que actualizar las variables con la que comparas o tendrás un bucle infinito, aunque yo no lo usaria, con un if y un else haces lo mismo

if (temp < 68 && digitalRead(cafe) == HIGH) digitalWrite(relay1, HIGH);
else digitalWrite(relay1, LOW);

Puedes hacer que cambie el estado de una variable cada vez que se pulsa, o puedes cambiar tu pulsador por un interruptor, también te faltaba hacer la lectura del botón.

Hola @krnlpanic, gracias por la respuesta. Tomé lo de la variable de estado, y pude asi enclavar el pulsador :slight_smile:

Pero ahora me pasa que no puedo volver a setear, dentro de un else, esa variable junto con otra accion, mira donde quiero poner a “estado = 0”… algo debe estar mal porque no me compila. Será que dentro de un “else” no se pueden poner dos acciones?

Lo harían de alguna otra forma? Lo estoy encarando bien?

#include "max6675.h"

int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

//Pulsadores 
int cafe = 2;
int hervir = 3;

//Variable para enclavar pulsadores
int estado; // estado = 0 -> Reposo, estado = 1 -> calentando cafe, estado = 2 -> hirviendo agua

// Relays
int relay1 = 9;
int relay2 = 10;
float temp;
  
void setup() {
  Serial.begin(9600);


  //Pins de Relay
  pinMode(relay1, OUTPUT); digitalWrite(relay1, HIGH);
  pinMode(relay2, OUTPUT); digitalWrite(relay2, HIGH);

  //Pins de Pulsadores al inicio
  pinMode(cafe, INPUT_PULLUP);
  pinMode(hervir, INPUT_PULLUP);
  
  Serial.println("MAX6675 test");
  // wait for MAX chip to stabilize
  delay(5000);

  
}

void loop() {
  // basic readout test, just print the current temp
  temp = thermocouple.readCelsius();
   Serial.print("C = "); 
   Serial.println(temp);
   

if (digitalRead(cafe) == LOW) estado = 1;

if (temp < 29 && estado == 1) digitalWrite(relay1, LOW);
else {digitalWrite(relay1, HIGH) && estado = 0}; //aqui quisiera que cuando llegue a la temperatura, que cambie el estado de la variable a 0

  Serial.println(estado);
  Serial.println(digitalRead(cafe));
delay(200);

}

Saludos y gracias!!!

Hola, probá de cambiar la línea:

else {digitalWrite(relay1, HIGH) && estado = 0}; //aqui quisiera que cuando llegue a la temperatura, que cambie el estado de la variable a 0

Por:

else {digitalWrite(relay1, HIGH); estado = 0;} //aqui quisiera que cuando llegue a la temperatura, que cambie el estado de la variable a 0

Con este código cada vez que presiones el pulsador solo una vez pasas de calentar a no calentar y siempre que la temperatura del cafe este por debajo de 68 lo hará de lo contrario no calentará.
Cuando usas comparaciones con números flotantes, siempre los debes especificar con .0 no solo el 68 sino 68.0

const byte thermoDO     = 4;
const byte thermoCS     = 5;
const byte thermoCLK    = 6;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

//Pulsadores
const byte cafe         = 2;
const byte hervir       = 3;

// Relays
const byte relay1       = 9;
const byte relay2       = 10;
float temp;
bool estado, estadoAnt = false;
 
void setup() {
  Serial.begin(9600);


  //Pins de Relay
  pinMode(relay1, OUTPUT); digitalWrite(relay1, LOW);
  pinMode(relay2, OUTPUT); digitalWrite(relay2, LOW);

  //Pins de Pulsadores al inicio
  pinMode(cafe, INPUT);
  pinMode(hervir, INPUT);
 
  Serial.println("MAX6675 inicializado.");
  // wait for MAX chip to stabilize
  delay(5000);

 
}

void loop() {
    // basic readout test, just prconst byte the current temp
    temp = thermocouple.readCelsius();
    //   Serial.prconst byte("C = ");
    //   Serial.prconst byteln(temp);
    estado = digitalRead(cafe);
    if (estado && !estadoAnt)
        caliento = !caliento;
        
    if (caliento)
        if (temp < 68.0) {  // solo si la temperatura esta por debajo de 68.0 calentará.
            digitalWrite(relay1, HIGH);
        }
    else
            digitalWrite(relay1, LOW);

    estadoAnt = estado;
}

A esto hay que agregarle una histeresis para que en el entrono de 68.0 no este prendiendo y apagando a cada momento. Si usas un RELE para accionar la cafetera, este rele entorno a 68.0 estará como loco. Lo dejo a tu criterio.
Cuando vuelves a presionar CAFE la variable caliento se pone en FALSE y se apaga relay1.

Hola @MaxiCane , gracias, recien hoy lo pude probar, y ahora me compila OK. Veo entonces que en un else, se pueden separar varias acciones con ";". Voy a probarlo un poco más y luego probaré con el código que posteó @surbyte .

Gracias y saludos

Hola @surbyte,

he tardado porque quise intentar hacerlo funcionar yo mismo. Vi que me has corregido el tema de variables “inutiles”, que por ejemplo puedo usar bool si el valor es true o false. Tambien vi que puedo usar byte… pero no se porqué, me siento mas comodo usando “int”.

Como necesito 3 estados diferentes, se me complicaba usar una variable “estado” del tipo bool, entonces hice que fuera un int. Asi le pudo dar 1, 2, 3… etc estados diferentes y para cada estado y condiciones, hacer que el codigo ejecute algo.

Lo he probado y me funciona como quiero :slight_smile: es mi primer codigo sin copy-paste:

#include "max6675.h"

int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

//Pulsadores
int cafe = 2;
int hervir = 3;

//Variable para enclavar pulsadores
int estado = 0; //  estado = 2 -> calentando cafe, estado = 3 -> hirviendo, 0 = reposo, estado = 1 -> sin asignar

// Relays
int relay1 = 9;
int relay2 = 11;
float temp;
  
void setup() {
  Serial.begin(9600);


  //Pins de Relay
  pinMode(relay1, OUTPUT); digitalWrite(relay1, HIGH); //asi el los relays no estan activados al principio
  pinMode(relay2, OUTPUT); digitalWrite(relay2, HIGH);

  //Pins de Pulsadores al inicio
  pinMode(cafe, INPUT_PULLUP); //asi, cuando no estan los botones pulsados, cafe = 1. Cuando se pulsa, Cafe = 0. Lo mismo con el pulsador "hervir".
  pinMode(hervir, INPUT_PULLUP); //si no le pongo pullup, se me varia el input aleatoriamente...
  
  Serial.println("MAX6675 test");
  // wait for MAX chip to stabilize
  delay(5000);

  
}

void loop() {
  // basic readout test, just print the current temp
  temp = thermocouple.readCelsius();
   Serial.print("C = ");
   Serial.println(temp);



if (!digitalRead(cafe))  {  Serial.print("Pulsador de cafe apretado "); 
                            estado = 2; 
                         }

if (estado == 2)         {  Serial.print("Estoy detectando estado 2 "); 
                            if (temp < 30.00) 
                                        {digitalWrite(relay1, LOW); digitalWrite(relay2, LOW);}
                            else estado = 0 ;
                         }
//----------------
if (!digitalRead(hervir))  {  Serial.print("Pulsador de hervir apretado "); 
                            estado = 3; 
                         }

if (estado == 3)         {  Serial.print("Estoy detectando estado 3 "); 
                            if (temp < 68.00) 
                                        {digitalWrite(relay1, LOW); digitalWrite(relay2, LOW);}
                            else estado = 0 ;
                         }
//----------------
if (estado == 0)         {  digitalWrite(relay2, HIGH); digitalWrite(relay1, HIGH);}
                         
//                                      {digitalWrite(relay2, HIGH); digitalWrite(relay1, HIGH);}}  //estado = 1; //cuando pulso el pulsador de café entonces se pasa a "calentando cafe 1"
//if (digitalRead(hervir) == LOW) estado = 3; //cuando pulso el pulsador de hervir entonces se pasa a "estado hirviendo 3"

//if (estado = 1) {
//if (temp < 30.00) {digitalWrite(relay1, LOW); digitalWrite(relay2, LOW);}
//          else {digitalWrite(relay2, HIGH); digitalWrite(relay1, HIGH);}} //aqui quisiera que cuando llegue a la temperatura, que cambie el estado de la variable a 0

//if (temp < 96.0 && estado == 3) {digitalWrite(relay1, LOW); digitalWrite(relay2, LOW);}
//          else {digitalWrite(relay2, HIGH); digitalWrite(relay1, HIGH);} 

//estos serial print son para debbuging
  Serial.println(estado);
  Serial.print("Pulsador de cafe   = "); Serial.println(digitalRead(cafe));
  Serial.print("Pulsador de hervir = "); Serial.println(digitalRead(hervir));
delay(200);

}

Como aclaración, enciendo dos relays al mismo tiempo (corto positivo y negativo como si fuese una llave térmica).

Qué te / les parece?

Desde ya mil gracias por la ayuda!

Saludos a todos

if (estado = 1)

En los if debes poner == o no sera una comparación sino un cambio a la variable, ya veo que esta comentado pero para que lo tengas en cuenta.

Se usan las variables byte porque usan menos memoria que int, tu programa es corto y no tiene problema de memoria pero cuando te metas en algo mas grande quizá te vaya bien saber por donde reducir uso de memoria.

Gracias por tu respuesta @krnlpanic . Voy a cambiar las variables int por byte. Qué bueno lo de la comparacion y cambiar la variable. No sabia eso tan claramente. Solo por prueba y error...

Saludos!