Imprimir no display lcd

Opa, Boa noite,

tenho uma atividade onde tenho que programar para um forno industrial automatizado, onde a programacao conta o tempo e verifica a temperatura.
ate ai esta tudo bem, o problema e na hora do comando de ligar/desligar o forno, deixarei uma print abaixo
image
provavelmente o codigo esta errado, mas eu preciso que quando a variavel botaom for pressionada, apareca no display lcd que o forno foi ligado, assim vice ver pro forno desligado, mas nessa logica da print, o codigo simplesmente so mostra forno desligado e nao muda quando o botaom e pressionado.

Alguem poderia me ajudar?

obs: essa variavel teste, e uma variavel booleana global que so foi adicionada sem valor como high ou low por exemplo.

Tópico movido; por favor leia Como obter o melhor desse Fórum

Opa, Boa noite,

tenho uma atividade onde tenho que programar para um forno industrial automatizado, onde a programacao conta o tempo e verifica a temperatura.
ate ai esta tudo bem, o problema e na hora do comando de ligar/desligar o forno, deixarei uma print abaixo
image
provavelmente o codigo esta errado, mas eu preciso que quando a variavel botaom for pressionada, apareca no display lcd que o forno foi ligado, assim vice ver pro forno desligado, mas nessa logica da print, o codigo simplesmente so mostra forno desligado e nao muda quando o botaom e pressionado.

Alguem poderia me ajudar?

obs: essa variavel teste, e uma variavel booleana global que so foi adicionada sem valor como high ou low por exemplo

Tópicos duplicados mesclados. Não poste o mesmo tópico em várias categorias.

ok, perdao

Olá! Bem vindo ao Forum.

Espero que você já tenha lido o tópico Como obter o melhor desse Fórum, porque evitaria que você cometesse alguns dos erros que já cometeu: postar duplicado em categorias diferentes; postar prints de código (que impedem que os outros copiem e colem pra testar) e postar snippets , pedaços do código que não permitem que se veja o que está acontecendo no resto do programa.

Enfim, seu problema parece não ter nada a ver com "imprimir no display LCD", mas sim com a lógica de programação do seu botão.

Isso é de ser esperar, já que você faz dois testes seguidos usando a mesma condição (botaom == 1), mas implicando em resultados diferentes. Nesse caso, o programa passa como um foguete pelo estado "Forno Ligado" e para sempre no "Forno Desligado".

Como você criou a "flag" teste (uma variável de controle) para saber se o fogão estará ligado ou desligado, é suficiente testar se o botão foi apertado apenas uma vez. Ficaria então algo assim:

if (botaom ==1) {
teste = !teste; //inverte a flag. Se o fogão estiver ligado, desliga. Se estiver desligado, liga
}
if ( teste == HIGH
faz o que tiver que ser feito quando o forno for ligado
}
else if ( teste == LOW
faz o que tiver que ser feito quando o forno for desligado
}

E nesse ponto vai aqui uma dica que eu acho que é valiosa. Você não mostrou seu circuito - o que também dificulta que as pessoas te ajudem - mas a sua lógica está baseada no botão em estado LOW por padrão, sendo acionado em HIGH. Isso vai exigir que você conecte um resistor de pull-down no botão, para que ele permaneça em LOW e não fique flutuando.

Porém, a maneira mais fácil de conectar um botão é ligando uma das pernas em GND e a outra em um pino configurado como INPUT_PULLUP. Assim, por padrão a porta estará sempre lendo HIGH e apertar o botão jogará ela para LOW. Isso dispensa o uso de um resistor no circuito. Só que, claro, você tem que inverter a lógica do seu programa para que o botão apertado seja botaom == 0

Muito obrigado pela ajuda, concertei os erros, e funcionou.
Perdao pelo envio repetido no forum estou a pouco tempo e ainda nao tinha lido as regras,

Poderia me tirar mais uma duvida?
Existe alguma logica para inverter o valor do millis? por exemplo, eu coloco 60 segundos, e ao inves dele contar 1, 2, 3, 4....60, ele contasse 60, 59, 58.....1.
Ja que nos fornos mostra o valor descrescendo e nao crescendo.

abaixo vou deixar meu codigo para voce olhar.

#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include "Adafruit_MAX31855.h"
//
#define MAXDO   5
#define MAXCS   6
#define MAXCLK  7
//
LiquidCrystal_I2C lcd(0x27,20,4);
Adafruit_MAX31855 thermocouple(MAXCLK, MAXCS, MAXDO);
//
double Tc;
//double Tc_aux = Tc - 23.5;
int flag = 0; //acionamento de carga 
//flag = 0 ligar carga 
//flag = 0  desliga carga
typedef enum {
  ESTADO = 1, 
  TEMPERATURA = 2,
  TEMPO = 3,
  MONITORAR = 4,
  CONTROLE = 5} ESTADO_t;
int botaoe;
int botao_;
int botaom;
int estado = 1;
int temp1 = 300;
int temp3 = 300;
int temp2 = 700;
int setpoint = 160;
int tempm = 10;
int temp_ = 10;
int setpointmin = 160;
int setpointmax = 300;
int tempmin = 5; // 10 minutos
int settempo = 10;
int tempmax = 60;
int tempom = 5;
int tempo_ = 5;
int rele = 13;
int atraso;
boolean teste = LOW;

int tempo = settempo * 60;
unsigned long tempoAtual;

unsigned long lastDebounceTime = 0; // última vez que o botão foi pressionado
unsigned long debounceDelay = 550;   // O intervalo, igual ao delay do código anterior

//unsigned long tempoAtual = millis();


void setup() {
  pinMode(botaoe, INPUT);
  pinMode(botao_, INPUT);
  pinMode(botaom, INPUT);
  pinMode(rele, OUTPUT);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2, 0);
  lcd.print("ELETIVA 2024");
  lcd.setCursor(5, 1);
  lcd.print("3V1 ELE");
  Serial.begin(9600);
  

  Tc = thermocouple.readCelsius();
  
}

void loop() {
  botaoe = digitalRead(8);
  botao_ = digitalRead(9);
  botaom = digitalRead(10);

  

  
  switch (estado) {
    
    case ESTADO: {

  lcd.setCursor(2, 0);
  lcd.print("ELETIVA 2024");
  lcd.setCursor(5, 1);
  lcd.print("3V1 ELE");
    /*if(botaoe == 1) {
      estado = TEMPERATURA;
      lcd.clear();
      delay(temp3);
      }*/
      if (botaoe == HIGH) {
        if ((millis() - lastDebounceTime) > debounceDelay) {
          lcd.clear();
          estado = TEMPERATURA;
        }lastDebounceTime = millis();
    }
  }
    break; 
    case TEMPERATURA: {
     if(botaom == 1) {
    setpoint = setpoint + tempm;
    delay(temp3);
    }
     if(botao_ == 1){
    setpoint = setpoint - temp_;
    delay(temp3);
    }
     if(setpoint <= setpointmin){
    setpoint = setpointmin;
    delay(temp3);
    }
     if(setpoint >= setpointmax){
    setpoint = setpointmax;
    delay(temp3);
   }
   lcd.setCursor(0, 0);
   lcd.print("TEMPERATURA:");
   lcd.print(setpoint);
   /*if(botaoe == 1) {
   estado = TEMPO;
   delay(temp1);
   lcd.clear();
 }*/
    if (botaoe == HIGH) {
      if ((millis() - lastDebounceTime) > debounceDelay) {
          lcd.clear();
          estado = TEMPO;
      }lastDebounceTime = millis();
    }
  }
    
  break;
  
  case TEMPO:{
   if(botaom == 1){
    settempo = settempo + tempom;
    delay(temp3);
  }
   if(botao_ == 1){
    settempo = settempo - tempo_;
    delay(temp3);
  }
   if(settempo <= tempmin){
    settempo = tempmin;
    delay(temp3);
   }
   if(settempo >= tempmax){
     settempo = tempmax;
     delay(temp3);
     } 
   lcd.setCursor(0, 0);
   lcd.print("TEMPO:");  
   lcd.print(settempo);
      if (botaoe == HIGH) {
        if ((millis() - lastDebounceTime) > debounceDelay) {
          lcd.clear();
          estado = MONITORAR;
        }lastDebounceTime = millis();
    }
  }
  break;

  case MONITORAR: {
   Tc = thermocouple.readCelsius();

if (isnan(Tc)) {
     Serial.println("Thermocouple fault(s) detected!");
     uint8_t e = thermocouple.readError();
     if (e & MAX31855_FAULT_OPEN) Serial.println("FAULT: Thermocouple is open - no connections.");
     if (e & MAX31855_FAULT_SHORT_GND) Serial.println("FAULT: Thermocouple is short-circuited to GND.");
     if (e & MAX31855_FAULT_SHORT_VCC) Serial.println("FAULT: Thermocouple is short-circuited to VCC.");
   } else {
     Serial.print("C = ");
     //Serial.println(Tc_aux);
     Serial.println(flag);
     //Serial.println(Tc);
   }
   
   lcd.setCursor(0,0);
   lcd.print("TEMPERATURA:");
   lcd.print(Tc);
   lcd.setCursor(0, 1);
   lcd.print("TEMPO:");
   lcd.print(tempoAtual);
   
   if(Tc <= 26){
  digitalWrite(rele, HIGH); 
  lcd.setCursor(14, 1);
  lcd.print("L");
  }
  //if(Tc >= setpoint - 10){
  if(Tc > 26 + 0.5){
  digitalWrite(rele, LOW);
  lcd.setCursor(14, 1);
  lcd.print("D");
  }
   
   delay(temp1);
      if (botaoe == HIGH) {
        if ((millis() - lastDebounceTime) > debounceDelay) {
          lcd.clear();
          estado = CONTROLE;
        }lastDebounceTime = millis();
    }
  break;
  case CONTROLE: {

      //lcd.setCursor(0, 0);
      //lcd.print("FORNO DESLIGADO");
      if (botaom ==1) {
      teste = !teste;
      delay(10); //inverte a flag. Se o fogão estiver ligado, desliga. Se estiver desligado, liga
      }
      if (teste == HIGH){
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("FORNO LIGADO");
      delay(temp1);
      }
      else if (teste == LOW){
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("FORNO DESLIGADO");
      delay(temp1);
      }
      if (botaoe == HIGH) {
        if ((millis() - lastDebounceTime) > debounceDelay) {
          lcd.clear();
          estado = ESTADO;
        }lastDebounceTime = millis();
    }
  } 
  break;
  /*if(Tc_aux >= setpoint + 10)  {
    flag = 1; // se a temperatura for maior que o setpoint, o flag desliga
  }
  if(Tc_aux <= setpoint - 10) {
    flag = 0; // se a temperatura for menor que o setpoint, o flag liga
  }*/ 
 
 /* if(Tc <= setpoint + 10){
  if(Tc <= 26){
  digitalWrite(rele, HIGH); 
  lcd.setCursor(14, 1);
  lcd.print("L");
  }
  //if(Tc >= setpoint - 10){
  if(Tc > 26){
  digitalWrite(rele, LOW);
  lcd.setCursor(14, 1);
  lcd.print("D");
  }*/
  /* if(teste = !teste){
   tempoAtual = millis();
   atraso = tempoAtual + tempo;
   if(tempoAtual < delay){
   digitalWrite(rele, HIGH);
   }*/
  
 }

  }
}

Que bom! Fico feliz!
Também notei que agora você colocou seu código aqui usando o formato correto, pelo que agradeço.

A função millis() conta quanto tempo se passou desde que você ligou o Arduino. Portanto, ela só "anda pra frente" até que você desligue a placa, resete ou que o próprio contador zere por overflow (o que deve ocorrer em aproximadamente uns 50 dias se a placa ficar ligada direto esse tempo todo).

Eu vi que você criou uma variável de tempo chamada tempoAtual, que pelo visto receberá o valor de millis() em algum momento, mas essa atribuição só aparece comentada no programa (ou seja, não está efetiva nessa versão do programa que você mostrou).

O que eu sugiro para fazer isso que você quer é criar uma função que atue como um temporizador de contagem regressiva. Assim, você usa o millis(), mas dentro da função ela subtrai um segundo da sua contagem a cada vez que o millis() - (seu ultimo tempo) for maior que 1000.

Dou como exemplo essa daqui, que eu adaptei de um programa meu:

unsigned long tempoAtual = millis(); // inicia uma contagem global de tempo

void cronometro(int segs) { // passa para a função a quantidade de segundos da contagem regressiva
  static int tempo = segs + 1;
    if (millis() - tempoAtual >= 1000) {
      tempo--;
      lcd.setCursor(0, 1);
      lcd.print("TEMPO:");
      lcd.print(tempo);
      tempoAtual = millis();
    }
}

daí, por exemplo, se você quer no programa contar 60 segundos de maneira regressiva, basta chamar cronometro(60).