Actualización de Máquina de estados

Buenos días , ando con un problema que busque y no puedo solucionar cuando en la máquina de estados finito llamo a la función void printHome , la misma me toma solo una vez la lectura de A0 en este caso un sensor de humedad de suelo, yo lo que preciso que se monitoree la humedad del suelo cada x tiempo, lo que estoy realizando es un control de humedad que yo ingresé los valores por la máquina de estados, desde ya muchas gracias

/*lcd*/

#include <LiquidCrystal.h>

LiquidCrystal lcd (7,6,5,4,3,2);

/*sensor tierra*/

int lectura= analogRead(A0);

int lecturaPorcentaje = map(lectura, 1023, 0, 0, 100);

/*rele a b */

int relea = 13;

int releb = 12;

/*definicion borones*/

#define BTN_MENU  0

#define BTN_UP    1

#define BTN_DOWN  2

/*Pin botones*/

uint8_t button[3] ={

  11,

  10,

  9

};

/* Este arreglo contiene el último estado conocido de cada línea*/

uint8_t button_estate[3];

/*decteccion boton*/

  uint8_t flancoSubida(int btn) {

  uint8_t valor_nuevo = digitalRead(button[btn]);

  uint8_t result = button_estate[btn]!=valor_nuevo && valor_nuevo == 1;

  button_estate[btn] = valor_nuevo;

  return result;

}

/* Estado de nuestro autómata*/

#define S_HOME        0

#define S_Humedad     1

#define S_Temperatura 2

uint8_t estado = S_HOME;

/*variable t y h*/

uint8_t temp = 0;

uint8_t humd = 0;

/*dibujo de funciones*/

void printHome(){

int lectura= analogRead(A0);

int lecturaPorcentaje = map(lectura, 1023, 0, 0, 100);

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Home");

lcd.setCursor(0,1);

lcd.print(lecturaPorcentaje);

lcd.print("%");

lcd.print(" H.Max ");

lcd.print(humd);

}

void printHume(){

lcd.clear();

lcd.setCursor(0,0);

lcd.print("temperaruta");

lcd.setCursor(0,1);

lcd.print(temp);

}

void setup() {

  

lcd.begin(16, 2);

lcd.print("hola");

delay(1000);

pinMode(relea, OUTPUT);

pinMode(releb, OUTPUT);

delay(200);

digitalWrite(relea, HIGH);

digitalWrite(releb, HIGH);

  // Configurar como PULL-UP para ahorrar resistencias

  pinMode(button[BTN_MENU], INPUT_PULLUP);

  pinMode(button[BTN_UP],   INPUT_PULLUP);

  pinMode(button[BTN_DOWN], INPUT_PULLUP);

  //

    // Se asume que el estado inicial es HIGH

  button_estate[0] = HIGH;

  button_estate[1] = HIGH;

  button_estate[2] = HIGH;

printHome();

}

void loop(){

  switch(estado) {

    case S_HOME: /*** INICIO ESTADO S_HOME ***/

      if(flancoSubida(BTN_MENU)) { // Transición BTN_MENU

        estado = S_Humedad;

        printHume();

        break;

      }

      break; /*** FIN ESTADO S_HOME ***/

    case S_Humedad: /*** INICIO ESTADO S_SET_R ***/

      if(flancoSubida(BTN_MENU)) { // Transición BTN_MENU

        estado = S_HOME;

        printHome();

        break;

      }

      if(flancoSubida(BTN_UP)) { // Transición BTN_UP

        if(temp<100) {

          humd++;

        } else {

          humd = 0;

        }

        printHume();

        break;

      }

      if(flancoSubida(BTN_DOWN)) { // Transición BTN_DWN

        if(temp>0) {

          humd--;

        } else {

          humd = 100;

        }

        printHume();

        break;

      }

      break; /*** FIN ESTADO S_SET_R ***/

  

}

}

Código completo, si supera 9k, adjúntalo.

surbyte: Código completo, si supera 9k, adjúntalo.

Listo, lo que quiero es que el sensor mida continuamente la humedad de la tierra para yo poder comparar la humedad actual con el valor maximo para poder crear un evento por ejemplo que riegue el suelo , lo que no logro es que en Home me dé el valor real de la humedad

La función que toma la humedad la tengo en void printHome

Bueno, ahora que veo todo el código se comprende lo que pasa. Tienes supeditada la lectura del sensor de humedad de suelo al flanco de subida, por eso solo lo hace 1 vez Deberías en todo caso, iniciar la lectura con el flanco pero colocar un intervalo de tiempo para que se actualice la máquina de estados mientras estes en el estado S_Humedad

No se me ocurre como hacerlo

Prueba de esta forma.

#include <LiquidCrystal.h>

LiquidCrystal lcd (7,6,5,4,3,2);
/*sensor tierra*/
int lectura= analogRead(A0);
int lecturaPorcentaje = map(lectura, 1023, 0, 0, 100);

/*rele a b */
int relea = 13;
int releb = 12;

/*definicion borones*/
#define BTN_MENU  0
#define BTN_UP    1
#define BTN_DOWN  2

/*Pin botones*/
uint8_t button[3] ={11, 10, 9 };

/* Este arreglo contiene el último estado conocido de cada línea*/

uint8_t button_estate[3];

/*decteccion boton*/
uint8_t flancoSubida(int btn) {
    uint8_t valor_nuevo = digitalRead(button[btn]);
    uint8_t result = button_estate[btn]!=valor_nuevo && valor_nuevo == 1;
    button_estate[btn] = valor_nuevo;
    return result;
}

/* Estado de nuestro autómata*/

#define S_HOME        0
#define S_Humedad     1
#define S_Temperatura 2
uint8_t estado = S_HOME;
uint32_t muestroHumedad, intervalo = 1000; // cambiar valor de intervalo para mostrar de modo diferente.

/*variable t y h*/
uint8_t temp = 0;
uint8_t humd = 0;

/*dibujo de funciones*/
void printHome(){
  int lectura= analogRead(A0);
  int lecturaPorcentaje = map(lectura, 1023, 0, 0, 100);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Home");
  lcd.setCursor(0,1);
  lcd.print(lecturaPorcentaje);
  lcd.print("%");
  lcd.print(" H.Max ");
  lcd.print(humd);
}

void printHumedad(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("temperaruta");
  lcd.setCursor(0,1);
  lcd.print(temp);
}

void setup() {
  lcd.begin(16, 2);
  lcd.print("hola");
  delay(1000);
  pinMode(relea, OUTPUT);
  pinMode(releb, OUTPUT);
  delay(200);
  digitalWrite(relea, HIGH);
  digitalWrite(releb, HIGH);
  // Configurar como PULL-UP para ahorrar resistencias
  pinMode(button[BTN_MENU], INPUT_PULLUP);
  pinMode(button[BTN_UP],   INPUT_PULLUP);
  pinMode(button[BTN_DOWN], INPUT_PULLUP);
  //
  // Se asume que el estado inicial es HIGH
  button_estate[0] = HIGH;
  button_estate[1] = HIGH;
  button_estate[2] = HIGH;
  PrintHome();
}

void loop(){

  switch(estado) {
    case S_HOME:  /*** INICIO ESTADO S_HOME ***/
                  if (flancoSubida(BTN_MENU)) { // Transición BTN_MENU
                      estado = S_Humedad;
                      printHumedad();
                      break;
                  }
                  break; /*** FIN ESTADO S_HOME ***/
    case S_Humedad: /*** INICIO ESTADO S_SET_R ***/
                  if (flancoSubida(BTN_MENU)) { // Transición BTN_MENU
                      estado = S_HOME;
                      printHome();
                      break;
                  }
                  if (flancoSubida(BTN_UP)) { // Transición BTN_UP
                      if (temp<100) {
                          humd++;
                      } else {
                          humd = 0;
                      }
                      
                      break;
                  }

                  if (flancoSubida(BTN_DOWN)) { // Transición BTN_DWN
                      if (temp>0) {
                          humd--;
                      } else {
                          humd = 100;
                      }
                      break;
                  }
                  if (millis() - muestroHumedad > intevalo) {
                      printHumedad();
                      muestroHumedad = millis();
                  }
                  break; /*** FIN ESTADO S_SET_R ***/
  }
}

surbyte:
Prueba de esta forma.

#include <LiquidCrystal.h>

LiquidCrystal lcd (7,6,5,4,3,2);
/sensor tierra/
int lectura= analogRead(A0);
int lecturaPorcentaje = map(lectura, 1023, 0, 0, 100);

/*rele a b */
int relea = 13;
int releb = 12;

/definicion borones/
#define BTN_MENU  0
#define BTN_UP    1
#define BTN_DOWN  2

/Pin botones/
uint8_t button[3] ={11, 10, 9 };

/* Este arreglo contiene el último estado conocido de cada línea*/

uint8_t button_estate[3];

/decteccion boton/
uint8_t flancoSubida(int btn) {
    uint8_t valor_nuevo = digitalRead(button[btn]);
    uint8_t result = button_estate[btn]!=valor_nuevo && valor_nuevo == 1;
    button_estate[btn] = valor_nuevo;
    return result;
}

/* Estado de nuestro autómata*/

#define S_HOME        0
#define S_Humedad    1
#define S_Temperatura 2
uint8_t estado = S_HOME;
uint32_t muestroHumedad, intervalo = 1000; // cambiar valor de intervalo para mostrar de modo diferente.

/variable t y h/
uint8_t temp = 0;
uint8_t humd = 0;

/dibujo de funciones/
void printHome(){
  int lectura= analogRead(A0);
  int lecturaPorcentaje = map(lectura, 1023, 0, 0, 100);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(“Home”);
  lcd.setCursor(0,1);
  lcd.print(lecturaPorcentaje);
  lcd.print("%");
  lcd.print(" H.Max ");
  lcd.print(humd);
}

void printHumedad(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(“temperaruta”);
  lcd.setCursor(0,1);
  lcd.print(temp);
}

void setup() {
  lcd.begin(16, 2);
  lcd.print(“hola”);
  delay(1000);
  pinMode(relea, OUTPUT);
  pinMode(releb, OUTPUT);
  delay(200);
  digitalWrite(relea, HIGH);
  digitalWrite(releb, HIGH);
  // Configurar como PULL-UP para ahorrar resistencias
  pinMode(button[BTN_MENU], INPUT_PULLUP);
  pinMode(button[BTN_UP],  INPUT_PULLUP);
  pinMode(button[BTN_DOWN], INPUT_PULLUP);
  //
  // Se asume que el estado inicial es HIGH
  button_estate[0] = HIGH;
  button_estate[1] = HIGH;
  button_estate[2] = HIGH;
  PrintHome();
}

void loop(){

switch(estado) {
    case S_HOME:  /*** INICIO ESTADO S_HOME /
                  if (flancoSubida(BTN_MENU)) { // Transición BTN_MENU
                      estado = S_Humedad;
                      printHumedad();
                      break;
                  }
                  break; /
FIN ESTADO S_HOME /
    case S_Humedad: /
INICIO ESTADO S_SET_R ***/
                  if (flancoSubida(BTN_MENU)) { // Transición BTN_MENU
                      estado = S_HOME;
                      printHome();
                      break;
                  }
                  if (flancoSubida(BTN_UP)) { // Transición BTN_UP
                      if (temp<100) {
                          humd++;
                      } else {
                          humd = 0;
                      }
                     
                      break;
                  }

if (flancoSubida(BTN_DOWN)) { // Transición BTN_DWN
                      if (temp>0) {
                          humd–;
                      } else {
                          humd = 100;
                      }
                      break;
                  }
                  if (millis() - muestroHumedad > intevalo) {
                      printHumedad();
                      muestroHumedad = millis();
                  }
                  break; /*** FIN ESTADO S_SET_R ***/
  }
}

No bro no me funcionó gracias igual por la buena onda

Como no funciona si cada 1000 mseg debería imprimirte los valores?

Cuando estas en el modo S_Humedad se ejecutan todas las acciones que ahi tienes, yo pasé por alto los controles del menú y agregué solo esto

                  if (millis() - muestroHumedad > intevalo) {
                      printHumedad();
                      muestroHumedad = millis();
                  }

Eso funciona inmediatamente al estar dentro del case. Debe mostrarte printHumedad() cada 1 seg

El tema es que si te esta fllando flancoSubida y detecta un cambio y vuelve a S_HOME entonces ahi esta tu problema.

Te aconsejo que cambies en tu código los pines 0 y 1 que no se porque los usas y habilita Serial.print() para ver que esta ocurriendo.