Problema con pulsador para cambiar de "case"

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;
    }
  }

Bueno cambia esta parte y me dices si funciona bien o no

  val = digitalRead(P);
  if (val && !old_val) {  // si cambiamos de 0 a 1 entonces
      modo++;             // incremento el modo
      if (modo >= N) {    // si modo es mayor o igual que N entonces pongo a 0.
          modo = 0;
      }
  }
  old_val = val;

Lo he estado estado probando y sigue sin funcionar, no varía entre los cases

Lo que te dice incrementa modo con cada pulsación. De eso estoy muy seguro.

El problema puede deberse a esto

pinMode(P, INPUT);

Esto dice que tienes un pulsador con pull-up o pull-down y no dices de que manera esta conectado, entonces si esta mal conectado o al aire simplemente no funcionará.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.