Cambio de pantallas variable

Hola gente me pongo en contacto con ustedes porque tengo un problema. La cuestión es que estoy armando una fuente de laboratorio automatizada con Arduino. Lo que hice fue lo siguiente: en un gabinete que compré puse dentro una fuente de computadora e hice uso de sus voltajes: 3.3V, 5V, 12V y con y dos 2n3055 me hice una salida variable. Me hice un pcb para controlar con Arduino las salidas que funciona de la siguiente manera: cada salida tiene un pulsador el cual cada vez que se oprime a través de un relay se activa y cuando se vuelve a oprimir se desactiva.

A medida que se van activando las salidas, lo que quiero hacer (y no me sale aunque intenté bastante) es que se vayan mostrando en pantalla (lcd 16x2 i2c) las pantallas correspondientes a cada voltaje ya que cada pantalla correspondiente a cada salida activada va a mostrar información en tiempo real del consumo de corriente por ejemplo:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);

int boton1 = 22;
int boton2 = 24;
int boton3 = 26;

int relayvar = 6;
int relay3v3 = 7;
int relay5v = 7;
int relay12v = 8;

int valor1 =  0;
int valor2 =  0;
int valor3 =  0;

int estrelayvar = LOW;
int estrelay3v3 = LOW;
int estrelay5v = LOW;
int estrelay12v = LOW;

int voltaje5v = A0;
int voltaje12v = A1;
int voltajevar = A2;
int corriente5v = A3;
int corriente12v = A4;
int corrientevar = A5;


int buzzer = 14;
int entrada = 1;
unsigned long tiempoanterior1 = 0;
unsigned long tiempoanterior2 = 0;
unsigned long tiempoanterior3 = 0;
int n = 0;
int j = 0;
int f = 0;

int estados [1] [4] = {
  {0, 0, 0, 0}
};

//flags


void setup() {

  Serial.begin(9600);
  lcd.begin();
  lcd.backlight();
  pinMode(relayvar, OUTPUT);
  pinMode(relay3v3, OUTPUT);
  pinMode(relay5v, OUTPUT);
  pinMode(relay12v, OUTPUT);
  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);
  pinMode(boton3, INPUT);
  digitalWrite(relay3v3, LOW);
  digitalWrite(relayvar, LOW);
  digitalWrite(relay5v, LOW);
  digitalWrite(relay12v, LOW);
  bienvenida();
  delay(300);
  lcd.clear();
}

void bienvenida() {
  lcd.clear();
  lcd.setCursor(5, 0);
  lcd.print("Fuente");
  lcd.setCursor(3, 1);
  lcd.print("Ver.: 1.0");
}

void infovar() {
  lcd.setCursor(0, 0);
  lcd.print("Voltaje: ");
  lcd.setCursor(9, 0);
  lcd.print("8.8 ");
  lcd.setCursor(13, 0);
  lcd.print("V");

  lcd.setCursor(0, 1);
  lcd.print("Corriente: ");
  lcd.setCursor(11, 1);
  lcd.print("0.9 ");
  lcd.setCursor(15, 1);
  lcd.print("A");
}

void info5v() {
  lcd.setCursor(0, 0);
  lcd.print("Voltaje: ");
  lcd.setCursor(9, 0);
  lcd.print("5.1 ");
  lcd.setCursor(13, 0);
  lcd.print("V");

  lcd.setCursor(0, 1);
  lcd.print("Corriente: ");
  lcd.setCursor(11, 1);
  lcd.print("0.2 ");
  lcd.setCursor(15, 1);
  lcd.print("A");
}


void info12v() {
  lcd.setCursor(0, 0);
  lcd.print("Voltaje: ");
  lcd.setCursor(9, 0);
  lcd.print("12.4 ");
  lcd.setCursor(14, 0);
  lcd.print("V");

  lcd.setCursor(0, 1);
  lcd.print("Corriente: ");
  lcd.setCursor(11, 1);
  lcd.print("0.8 ");
  lcd.setCursor(15, 1);
  lcd.print("A");
}

void nada() {
  lcd.setCursor(5, 0);
  lcd.print("Salidas ");


  lcd.setCursor(4, 1);
  lcd.print("apagadas");

}

void loop() {

  unsigned long tiempoactual = millis();

  if (tiempoactual - tiempoanterior1 > 50) {
    tiempoanterior1 = tiempoactual;

    valor1 = digitalRead(boton1);
    valor2 = digitalRead(boton2);
    valor3 = digitalRead(boton3);

    if (valor1 == HIGH && entrada == 1 ) {
      if (estrelay5v == LOW) {
        estrelay5v = HIGH;
        estados [0] [1] = 1;
      }
      else {
        estrelay5v = LOW;
        estados [0] [1] = 0;
        lcd.clear();
      }
      digitalWrite(relay5v, estrelay5v);
      entrada = 0;
      tiempoanterior2 = tiempoactual;
      tone(buzzer, 2700, 50);
    }

    if (valor2 == HIGH && entrada == 1 ) {
      if (estrelay12v == LOW) {
        estrelay12v = HIGH;
        estados [0] [3] = 1;
        lcd.clear();
      }
      else {
        estrelay12v = LOW;
        estados [0] [3] = 0;
        lcd.clear();
      }
      digitalWrite(relay12v, estrelay12v);
      entrada = 0;
      tiempoanterior2 = tiempoactual;
      tone(buzzer, 2700, 50);
    }
  }

  if (valor3 == HIGH && entrada == 1 ) {
    if (estrelayvar == LOW) {
      estrelayvar = HIGH;
      estados [0] [2] = 1;
    }
    else {
      estrelayvar = LOW;
      estados [0] [2] = 0;
      lcd.clear();
    }
    digitalWrite(relayvar, estrelayvar);
    entrada = 0;
    tiempoanterior2 = tiempoactual;
    tone(buzzer, 2700, 50);
  }

  if (entrada  == 0) {
    if ( tiempoactual - tiempoanterior2 > 400) {
      entrada = 1;
    }
  }

  /*
   *
   *     if (estrelay3v3 == HIGH) {
        estados [0] [0] = 1;
      }
      else {
        estados [0] [0] = 0;
      }
   *
   */

  if (tiempoactual - tiempoanterior3 > 2000) {
    tiempoanterior3 = tiempoactual;

    for ( j = f; j <= 3; j++) {
      if (estados [0] [j] == 1) {
        n = j;
        f = j;
        //    Serial.println(j);
        Serial.println(f);
        break;
        if (f == 3) {
          f = 0;
        }
        else {
          f = j + 1;
        }
      }
      else {
        n = 20;
      }

    }

    lcd.clear();
  }


  switch (n) {

    case 1:
      info5v();
      break;

    case 2:
      info12v();
      break;

    case 3:
      infovar();
      break;

    default:
      nada();
      break;

  }

}

Intenté varias maneras de hacerlo: la última es guardar en una matriz el valor de cada pantalla que esté activada para despues leerlo y saber cual está encendida y cual no pero tampoco me funcionó. Cualquier ayuda será bienvenida.

Gracias.

Antes que nada, ¿tienes un relé para cada salida de voltaje? Si es así ¿A qué tienes conectado el otro contacto del relé?

Saludos.

Sí las salidas son a relee con sus correspondientes transistores y diodos, pero como es todo un proyecto en protoboard aun, éstas están simuladas con leds. Ademas aprovecho para subir el programa y la librería.

librerias.zip (19.3 KB)

Entiendo, entonces puedes colocar el pin NC del relé conectado a un pin del arduino y esa será tu señal de si está o no activado, sólo colocas un ciclo if y cuando se desactive el NC realizas la visualización de la pantalla.

Ahora, dices que tienes una pantalla para cada voltaje o al menos eso entendí, quieres visualizar las pantallas al mismo tiempo o sólo quieres activar una por cada vez que actives un voltaje específico?

Con un switch y diferentes casos según el botón que se presione, yo hice algo parecido, un pequeño menú con LCD 16x2 para ingresar codigos desde un keypad y poderte mover con el keypad de una pantalla a otra, te paso parte del codigo que puedes usar de base espero te sirva

  switch (menu)
    {
    case 0:
        
        btn1 = digitalRead(3);
        btn2 = digitalRead(4);
        lcd.setCursor(0,0);
        lcd.print("1. Ingresar");
        lcd.setCursor(0,1);
        lcd.print("2. Agregar pass");
        customKey = customKeypad.getKey();
        if (customKey != NO_KEY)
        {
          lcd.clear();
          delay(500);
            if (customKey == '1')
            {
              menu='1';
              lcd.clear();
            }
            if (customKey == '2')
            {
              menu='2';
              lcd.clear();
            }
        }
        break;

     case 1:
        //Crea un password
        lcd.setCursor(1,0);
        lcd.print("CREAR PASSWORD");
        lcd.setCursor(2,1);
        lcd.print("DE 4 DIGITOS");
        delay(200);
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("CAPTURAR  CODIGO");
        lcd.setCursor(6,1);
        for(i=0;i<=3;i++)
          {
            pss1[i]=kpd.waitForKey();
            lcd.print("*");
            //delay(500);
          }
      
        lcd.clear();
        lcd.setCursor(3,0);
        lcd.print("PASSWORD");
        lcd.setCursor(5,1);
        lcd.print("GUARDADO");
        delay(200);
        submenupass = '1';
        lcd.clear();
        //Submenú despues de guardar una contraseña
          while (submenupass == '1')
            {
              
              lcd.setCursor(0,0);
              lcd.print("1.Ir al menu");
              lcd.setCursor(0,1);
              lcd.print("2.Salir");
              customKey = 0;
              customKey = customKeypad.getKey();
              if (customKey != NO_KEY)
              {
                  if (customKey == '0')
                  {
                    menu = 0;
                    submenupass=0;
                    lcd.clear();
                  }
                  else (customKey =='2');
                  {
                    menu = 2;
                    submenupass=0;
                    lcd.clear();
                  }
               }
            }
        break;

La variable que cambia en un case a otro es menu, y según la tecla presionada te mueve de un menu a otro segun el valor presionado.

Ok, ya tienes solución para el seleccionado de voltaje, entonces no entiendo cuál es tu problema y tampoco respondiste mi pregunta, estás usando una sola LCD o estás usando una para cada voltaje porque explicaste una cosa en tu post y ahora veo otra en tu código.

Lo que quise decir es que si por ejemplo activo la salida de 12V, que aparezca en la pantalla la información correspondiente a esa salida. Luego si activo otra salida, ver en pantalla la información de ambas salidas y así con cada una. Es decir, solo ver la info de cada salida que esté activada en ese momento (y en un solo display). Voy a probar ese código. Gracias.

Hola no pude hacer el programa con el comando switch, porque necesito que aparezcan solo las pantallas que correspondan a los relee encendidos nada mas, me pueden decir alguna otra idea??

gracias.

Primer problema que veo en tu código es:

int relayvar = 	6;
int relay3V3 = 	7;
int relay5V = 	7;
int relay12V = 	8;

relay3V3 y relay5V ambos en pin 7. corrige por favor!

Solucionado el tema del pin incorrecto, alguna idea para solucionar el tema de las pantallas?

Alguna idea?!?!?

bueno tal ves declarando una entera asi

int pantalla;

void setup()
{
pantalla = 1
}

void loop()
{
if(pantalla == 1)
{
contenido de la pantalla
}
if(activacion con los pulsadores)
{

}
}