Buenas tardes,
Estoy intentando crear un instrumento que con dos potenciómetros cambien los colores a unos LEDS de una manera determinada y muestre los datos en un lcd, el problema lo tengo cuando he decidido emplear un pulsador a modo de que cada vez que pulse el pulsador, la placa se coloque en un “case” determinado y no se mueva de ese case hasta que vuelva a pulsarlo, tras muchos cambios en el loop para conseguirlo esta es la manera en la que más me he acercado pero sin resultado.
Adjunto el código y lo referente al problema empieza en el loop.
//Librerías necesarias
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//Configuración de LCD (Dependiendo del modelo puede ser: 0x3F, 0x27, 0x20)
LiquidCrystal_I2C lcd (0x3F, 16, 2);
//---------------------Incializaciones-------------
//Potenciómetros empleados
#define potI A0
#define potRV A1
//LED del Campo Variable
int R = 6,V =5;
//LED AMARILLO del Campo de Referencia
int Amf = 3;
//Pulsador de modo
int P = 13;
//variables para botón
int val = 0,old_val = 0, modo = 0;
const int N = 7;
//Valores de representación de colores en el potenciómetro
int TimeR1=0,TimeG1=0,TimeR2=0,TimeG2=0,TimeR3=0,TimeG3=0,val_Amf = 0;
//Valores para resultados
int RESULTADO1=0,RESULTADO2=0,RESULTADO3=0,RESULTADO=0,ResultadoR=0,ResultadoG=0;
char texto[11]="";
//-------------------------------------------------
//-------------------------------------------------
// void setup()
// Primer ciclo de scan
//-------------------------------------------------
void setup() {
//Funciones de cada PIN
Wire.begin();
pinMode(R, OUTPUT);
pinMode(V, OUTPUT);
pinMode(Amf, OUTPUT);
pinMode(potI, INPUT);
pinMode(potRV, INPUT);
pinMode(P, INPUT);
//Mensaje inicial en pantalla
lcd.clear();
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(1, 0);
lcd.print("PROTOTIPO DE");
lcd.setCursor(1, 1);
lcd.print("ANOMALOSCOPIO");
}
//-------------------------------------------------
// void loop()
// Tarea principal
//-------------------------------------------------
void loop ()
{
//Pulsador para cambiar de modo y case
fijarCursorModo();
val= digitalRead(P);
if (val != old_val)
{
old_val = val;
if (val == HIGH)
{
if (modo >= N)
{
modo = 0;
}
else
{
modo++;
}
}
}
switch(modo)
{
case 0:
break;
case 1:
//intensidad Amarillo de referencia 1
val_Amf = map (analogRead(A0),0,1023,121,143);
analogWrite(Amf,val_Amf);
TimeR1=(map (analogRead(A1),0,1023,255,45));
TimeG1= (map (analogRead(A1),0,1023,0,18));
//variación de los colores R y V 1
analogWrite(R,TimeR1);
analogWrite(V,TimeG1);
if (TimeR1>140)
{
RESULTADO1 = 1;
}
else
{
if (TimeR1<124)
{
RESULTADO1 = 2;
}
else
{
RESULTADO1 = 3;
}
}
break;
case 2:
reinicioleds();
delay(3800);
//intensidad Amarillo de referencia 2
val_Amf = map (analogRead(A0),0,1023,121,143);
analogWrite(Amf,val_Amf);
TimeR2=(map (analogRead(A1),0,1023,255,45));
TimeG2= (map (analogRead(A1),0,1023,0,18));
//variación de los colores R y V 1
analogWrite(R,TimeR2);
analogWrite(V,TimeG2);
if (TimeR2>140)
{
RESULTADO2 = 1;
}
else
{
if (TimeR2<124)
{
RESULTADO2 = 2;
}
else
{
RESULTADO2 = 3;
}
}
break;
case 3:
reinicioleds();
delay(3800);
//intensidad Amarillo de referencia 3
val_Amf=map (analogRead(A0),0,1023,121,143);
analogWrite(Amf,val_Amf);
TimeR3=(map (analogRead(A1),0,1023,255,45));
TimeG3= (map (analogRead(A1),0,1023,0,18));
//variación de los colores R y V 1
analogWrite(R,TimeR3);
analogWrite(V,TimeG3);
if (TimeR3>140)
{
RESULTADO3 = 1;
}
else
{
if (TimeR3<124)
{
RESULTADO3 = 2;
}
else
{
RESULTADO3 = 3;
}
}
break;
case 4:
//Mostrar resultados medida 1
if (RESULTADO1 == 1)
{
lcd.setCursor(11,1);
lcd.print("PROT");
}
else if (RESULTADO1 == 2)
{
lcd.setCursor(11,1);
lcd.print("DEUT");
}
else if (RESULTADO1 == 3)
{
lcd.setCursor(11,1);
lcd.print("NORM");
}
lcd.setCursor(0,1);
sprintf(texto, "R:%.2d V:%.2d",TimeR1,TimeG1);
lcd.print(texto);
break;
case 5:
//Mostrar resultados medida 2
if (RESULTADO2 == 1)
{
lcd.setCursor(11,1);
lcd.print("PROT");
}
else if (RESULTADO2 == 2)
{
lcd.setCursor(11,1);
lcd.print("DEUT");
}
else if (RESULTADO2 == 3)
{
lcd.setCursor(11,1);
lcd.print("NORM");
}
lcd.setCursor(0,1);
sprintf(texto, "R:%.2d V:%.2d",TimeR2,TimeG2);
lcd.print(texto);
break;
case 6:
//Mostrar resultados medida 3
if (RESULTADO3 == 1)
{
lcd.setCursor(11,1);
lcd.print("PROT");
}
else if (RESULTADO3 == 2)
{
lcd.setCursor(11,1);
lcd.print("DEUT");
}
else if (RESULTADO3 == 3)
{
lcd.setCursor(11,1);
lcd.print("NORM");
}
lcd.setCursor(0,1);
sprintf(texto, "R:%.2d V:%.2d",TimeR3,TimeG3);
lcd.print(texto);
break;
case 7:
//Promedio de las tres medidas en R y V
ResultadoR =((TimeR1 + TimeR2 + TimeR3)/3);
ResultadoG =((TimeG1 + TimeG2 + TimeG3)/3);
//Decidir resultado final
if ((ResultadoR)>140){RESULTADO = 1;}
else if ((ResultadoR)<124){RESULTADO = 2;}
else if (((ResultadoR)<=140)&&((ResultadoR)>=124)){RESULTADO = 3;}
//Mostrar resultado FINAL
if (ResultadoR == 1)
{
lcd.setCursor(1,1);
lcd.print("PROTAN");
}
else if (ResultadoR == 2)
{
lcd.setCursor(11,1);
lcd.print("DEUTAN");
}
else if (ResultadoR == 3)
{
lcd.setCursor(11,1);
lcd.print("NORMAL");
}
break;
}
}