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.