Variable is not updated.

Hi,

I am building a machine for helping in the process of solidification of resin 3d printers’ objects.
For that, I basically have an encoder and an I2C module connected to an LCD screen and some electronics for UV light and a motor.
The problem is that my VARIABLE Progreso which means progress is not updated in Pagina Uno which is my home page. And the second problem is that the encoder has to be pressed to function, I already had this kind of problems before and it was because one part of my code took to many resources from the Arduino.
Could someone help me to find where is my mistake?

Thank you!

lamparaUV.ino (7.41 KB)

OP’s code where it can be seen:

//Librerias
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RotaryEncoder.h>

LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);

//Pines del Encoder(CLK,DT)
RotaryEncoder encoder(A0, A1);

//Definicion Pines
int pinlampara = 2;
int pinmotor = 3;
int pinboton = 4;

//Definicion Variables

//DATOS
int setvelocidad = 0;
unsigned long settiempo;
unsigned long tiempo;
int velocidad = 255;
int progreso = 0;
int tiempotranscurido;
int tiempominutos;
unsigned long time;
int velocidadreal;

//ENCODER
static int pos = 1;
int nuevaposicion = 0;
int selecionado = 0;
int page = 1;
int newposi;
int newposi1;
int posi;

//Caracteres Especiales
uint8_t parametroslogo[8] = {0x00, 0x0E, 0x11, 0x15, 0x11, 0x0E, 0x00, 0x00};
uint8_t velocidadlogo[8] = {0x01, 0x02, 0x04, 0x08, 0x1E, 0x04, 0x08, 0x10};
uint8_t tiempologo[8] = {0x04, 0x04, 0x04, 0x04, 0x07, 0x00, 0x00, 0x00};

void setup() {
  Serial.begin(9600);
  newposi = 0;
  pinMode(pinlampara, OUTPUT);
  pinMode(pinboton, INPUT);
  digitalWrite(pinlampara, LOW);
  analogWrite(pinmotor, 255);
  lcd.setBacklightPin(3, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(20, 4);//16,2 (chica)

  //Se declaran los caracteres creados
  lcd.createChar(0, parametroslogo);//lcd.write((byte)0);
  lcd.createChar(1, velocidadlogo);
  lcd.createChar(2, tiempologo);
  lcd.setCursor(0, 1);
  lcd.print(" MODULO CURADO UV ");
  lcd.setCursor(7, 3);
  lcd.print(" UTEC ");
  delay(3000);
  lcd.clear();
}

void loop() {
  if (page == 1)
  {
    primerapagina();
  }
  if (page == 2)
  {
    segundapagina();
  }
  if (page == 3)
  {
    tercerapagina();
  }
  if (page == 4)
  {
    cuartapagina();
  }
}

void sumartiempo() {
  time = millis();//No borrar sino no hay progreso
  Serial.print(time);
  progreso = map(time, 0, tiempo, 0, 100);

  if (progreso != 100 && progreso != 0) {
    digitalWrite(pinlampara, HIGH);
    analogWrite(pinmotor, velocidad);
  }

  if (progreso <= 0) {
    digitalWrite(pinlampara, LOW);
    analogWrite(pinmotor, 255);
    progreso = 0;
  }

  if (digitalRead(pinboton) == LOW) {
    settiempo = 0;
    progreso = 0;
  }
}

void primerapagina() {
  lcd.clear();
  //Titulo
  lcd.setCursor(0, 0);
  lcd.print("ESTADO:");

  //Tiempo
  lcd.setCursor(0, 1);
  lcd.write(2);
  lcd.setCursor(1, 1);
  lcd.print(":");
  lcd.setCursor(6, 1);
  lcd.print("min");

  //Velocidad
  lcd.setCursor(0, 2);
  lcd.write(1);
  lcd.setCursor(1, 2);
  lcd.print(":");
  lcd.setCursor(6, 2);
  lcd.print("%");

  //Progreso
  lcd.setCursor(0, 3);
  lcd.print("Progreso: ");
  lcd.setCursor(13, 3);
  lcd.print("%");

  //Parametros
  lcd.setCursor(10, 2);
  lcd.write((byte)0);
  lcd.setCursor(11, 2);
  lcd.print(":");
  lcd.setCursor(12, 2);
  lcd.print("Click");

  while (true)
  {
    sumartiempo();
    if (progreso >= 100) {
      digitalWrite(pinlampara, LOW);
      analogWrite(pinmotor, 255);
      loop();
    }
    lcd.setCursor(3, 1); lcd.print(settiempo); //Tiempo
    lcd.setCursor(3, 2); lcd.print(velocidadreal); //Velocidad
    lcd.setCursor(10, 3); lcd.print(progreso); //Progreso
    if (digitalRead(pinboton) == LOW)
    {
      delay(50);
      while (digitalRead(pinboton) == LOW);
      delay(50);
      page = 2;
      break;
    }
  }
}

void segundapagina() {

  //Parametros
  lcd.clear();

  //Modificar Tiempo
  lcd.setCursor(1, 0);
  lcd.print("Parametros");

  //Modificar Tiempo
  lcd.setCursor(1, 1);
  lcd.print("Tiempo");

  //Modificar Velocidad
  lcd.setCursor(1, 2);
  lcd.print("Velocidad");

  //REGRESAR
  lcd.setCursor(1, 3);
  lcd.print("Regresar");

  while (true)
  {
    leerencoder();
    if (digitalRead(pinboton) == LOW)
    {
      delay(50); while (digitalRead(pinboton) == LOW); delay(50);
      if (nuevaposicion == 0) page = 2;
      if (nuevaposicion == 1) page = 3;
      if (nuevaposicion == 2) page = 4;
      if (nuevaposicion == 3) page = 1;
      break;
    }
  }
}

void tercerapagina() {
  lcd.clear();
  //Parametros
  lcd.setCursor(1, 0);
  lcd.print("Regresar");
  lcd.setCursor(1, 1);
  lcd.print("Cambiar");
  lcd.setCursor(1, 3);
  lcd.print(settiempo);
  lcd.setCursor(4, 3);
  lcd.print("min");
  while (true)
  {
    leerencoder();
    if (digitalRead(pinboton) == LOW)
    {
      delay(50);
      while (digitalRead(pinboton) == LOW); delay(50);
      if (nuevaposicion == 0)
      {
        page = 2;
        break;
      }
      if (nuevaposicion == 1) {
        encoder.setPosition(settiempo);
        while (true) {
          encoder.tick();
          settiempo = encoder.getPosition();
          if (settiempo > 120) {
            encoder.setPosition(120);
            settiempo = 120;
          }
          if (settiempo <= 0) {
            encoder.setPosition(0);
            settiempo = 0;
          }
          if (settiempo < 100) {
            lcd.setCursor(3, 3);
            lcd.print(" ");
          }
          if (settiempo < 10) {
            lcd.setCursor(2, 3);
            lcd.print(" ");
          }
          lcd.setCursor(1, 3);
          lcd.print(settiempo);
          tiempo = (settiempo * 60000);
          if (digitalRead(pinboton) == LOW)
          { delay(50); while (digitalRead(pinboton) == LOW); delay(50);
            encoder.setPosition(1);
            break;
          }
        }
      }
    }
  }
}

void cuartapagina() {
  lcd.clear();
  //Parametros
  lcd.setCursor(1, 0);
  lcd.print("Regresar");
  lcd.setCursor(1, 1);
  lcd.print("Cambiar");
  lcd.setCursor(1, 3);
  lcd.print(velocidadreal);
  lcd.setCursor(6, 3);
  lcd.print("%");
  while (true)
  {
    leerencoder();
    if (digitalRead(pinboton) == LOW)
    {
      delay(50); while (digitalRead(pinboton) == LOW); delay(50);
      if (nuevaposicion == 0)
      {
        page = 2;
        break;
      }
      if (nuevaposicion == 1) {
        encoder.setPosition(setvelocidad);
        while (true) {
          encoder.tick();
          //Rutina para incrementar de 5 en 5;
          posi = encoder.getPosition();
          if (posi >= 20) {
            posi = 20;
          }
          if (posi < 0) {
            posi = 0;
          }
          setvelocidad = posi;
          velocidadreal = posi * 5;
          if (velocidadreal < 100) {
            lcd.setCursor(3, 3);
            lcd.print(" ");
          }
          if (velocidadreal < 10) {
            lcd.setCursor(2, 3);
            lcd.print(" ");
          }

          lcd.setCursor(1, 3);
          lcd.print(velocidadreal);
          if (digitalRead(pinboton) == LOW)
          {
            delay(50); while (digitalRead(pinboton) == LOW); delay(50);
            encoder.setPosition(1);
            break;
          }
          velocidad = map(velocidadreal, 0, 100, 255, 0);
        }
      }
    }
  }
}

void leerencoder() {
  encoder.tick();
  nuevaposicion = encoder.getPosition();
  if (pos != nuevaposicion)
  {

    //Limite maximo del menu
    if (nuevaposicion > 3)
    {
      encoder.setPosition(3);
      nuevaposicion = 3;
    }

    //Limite minimo del menu
    if (nuevaposicion < 0)
    {
      encoder.setPosition(0);
      nuevaposicion = 0;
    }

    //Actualiza el menu
    destaque_selecionado(nuevaposicion);
    pos = nuevaposicion;
  }
}

void destaque_selecionado(int conta)
{
  int posicion = conta;
  //Permite borrar el valor anterior del select
  if (conta > pos)
  {
    lcd.setCursor(0, posicion - 1);
    lcd.print(" ");
  }
  //Permite borrar el valor siguiente del select
  if (conta < pos)
  {
    lcd.setCursor(0, posicion + 1);
    lcd.print(" ");
  }
  //Permite hacer mover el select
  lcd.setCursor(0, posicion);
  lcd.write((byte)0);
}
      loop();

Oops. It is never necessary to call loop() from any of your own functions. Just return to loop(). This will eventually cause you to run out of memory. "Eventually" for an Arduino might be less than 1 second.

A related problem is putting while(true) in a function. Let the loop() loop. Dont "block" by staying in one function for more than a millisecond or two.

Another related problem is copy-pasting the button debounce code everywhere. What if you need to change "50" to "100" for a very scratchy button? You can't do a simple search-replace on "50" because then you might change something else.

Put all the button-reading into its own function. Depending on what page you are on, you may do different things with those buttons.

The page functions should just do the display, not the decision logic. Put that into a separate function.