Shield LCD 1602 Keypad y shield PCA9685 ( Solucionado )

Buenas¡ Estoy intentando manejar una shield PCA9685 con un LCD 1602 Keypad, estoy aprendiendo y me he basado en el sketch MENULCD que maneja el encendido y apagado de tres leds. El scketch base trabaja con un UNO y la shield LCD Keypad conectada directamente y funciona bien. Mi problema surge al querer usar este montaje para manejar servos y leds en una shield PCA9685 (hasta 16 elementos) conecto todo correctamente ( la PCA9685 y la UNO me funcionan bien controlando 5 servos y 10 leds) pero a la hora de que me encienda y apague el led ( esta configurado el primero ) no me funciona, he echo cambios de cables y varias manera de enviar la señal, creo que el scketch que subo es la manera correcta o esta bastante cerca, pero despues de varios dias de pruebas y buscar informacion en la red, me he decidido a pedir ayuda.
De entrada Gracias por vuestro tiempo.

#include <LiquidCrystal.h>
#include <Adafruit_PWMServoDriver.h>
#include <Wire.h>

// Inicialice la biblioteca con los números de los pines de la interfaz
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //SE CONFIGURA EL LCD COMO CUALQUIER OTRO PARA INICIALIZARLO
int lastStateled = 0;                //VARIABLE QUE SE UTILIZA PARA LA PARTE DE EL MENU
int currentMenuItemled = 0;          //VARIABLE QUE SE UTILIZA PARA LA PARTE DE EL MENU
byte ledOn[8]   = {B00000, B01110, B10001, B10001, B01010, B01110, B01110};// DIBUJO DE led
byte ledOFF[8] =  {B11111, B10001, B10001, B10001, B10001, B10001, B10001, B11111}; //DIBUJO DE EL MARCO QUE INICA APAGADO
byte seleccionador[8] =  {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111}; //DIBUJO DE CURSOR INICA QUE LED SE SELECCIONO
int a = 1; //Variable que ayudara al programa a saber si debe estar apagado o prendido el led
int b = 2; //Variable que ayudara al programa a saber si debe estar apagado o prendido el led
int c = 2; //Variable que ayudara al programa a saber si debe estar apagado o prendido el led

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
uint8_t servonum = 0;
void setup() {
  
  pwm.begin();
  pwm.setPWMFreq(60);

  lcd.begin(16, 2); // se le indica que usaremos un lcd de 16 x 2
  lcd.createChar(1, ledOn);//se hace para llamar a led con 1
  lcd.createChar(2, ledOFF);
  lcd.createChar(3, seleccionador);

  pinMode(A0, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  pinMode(2, OUTPUT);// Salida LCDkeypad
  pinMode(3, OUTPUT);// Salida LCDkeypad
  pinMode(12, OUTPUT);// Salida LCDkeypad
  pinMode(8, OUTPUT);// Salida PCA9685


  lcd.clear();                   //Borrar la pantalla
  lcd.setCursor(0, 0);           //Llevar el cursor al inicio
  lcd.print("Presiona RIGTH");   //letrero inicial
}
// Encender/Apagar led 3 pins RG (pin PCA9685, 4096, 0)(encendido), (pin PCA9685, 0, 4096)(Apagado)
void setPin(uint8_t num, uint16_t val, bool invert) {
  // Clamp value between 0 and 4095 inclusive.
  val = min(val, (uint16_t)4095);
  if (invert) {
    if (val == 0) {
      // Special value for signal fully on.
      pwm.setPWM(num, 4096, 0);
    } else if (val == 4095) {
      // Special value for signal fully off.
      pwm.setPWM(num, 0, 4096);
    } else {
      pwm.setPWM(num, 0, 4095 - val);
    }
  }
  else {
    if (val == 4095) {
      // Special value for signal fully on.
      pwm.setPWM(num, 4096, 0);
    } else if (val == 0) {
      // Special value for signal fully off.
      pwm.setPWM(num, 0, 4096);
    } else {
      pwm.setPWM(num, 0, val);
    }
  }
}



void loop() {

  cambio();//se llama a  un pequeño programa llamado cambio
}
void cambio ()// pequeño programa
{
  int stateled = 0; // se crea una variable para este programa el cual mandara un numero dependiendo el boton pulsado
  int x = analogRead(0); // una variable que tomara el valor de el puerto analogico 0 "el puerto analogico 0 recibe una tension distinta por cada boton"
  lcd.setCursor(0, 0); //el cursor se pone en el punto de origen

  // -------------------------seccion de identificacion de botones

  if (x < 50) {//hacemos que cualquier valor dado menor a 60  por el puerto analogico 0 "la lectura de botones" sea 1 asi identificaremos que es el boton derecho
    //Right
    // lcd.print("derecha");
    stateled = 1;
  } else if (x < 200) {//hacemos que cualquier valor dado menor a 200  por el puerto analogico 0 "la lectura de botones" sea 2 asi identificaremos que es el boton arriba
    //Down
    //lcd.print("arriba");
    stateled = 2;
  } else if (x < 400) {//hacemos que cualquier valor dado menor a 400  por el puerto analogico 0 "la lectura de botones" sea 3 asi identificaremos que es el boton abajo
    //Down
    //lcd.print("abajo");
    stateled = 3;
  } else if (x < 600) {//hacemos que cualquier valor dado menor a 6000  por el puerto analogico 0 "la lectura de botones" sea 4 asi identificaremos que es el boton izquierda
    //Left
    //lcd.print("izquierda");
    stateled = 4;
  } else if (x < 800) {//hacemos que cualquier valor dado menor a 800  por el puerto analogico 0 "la lectura de botones" sea 5 asi identificaremos que es el boton select
    //Select
    // lcd.print("select");
    stateled = 5;
  }
  ////------------------------------secccion de menu
  if (currentMenuItemled < 0 || currentMenuItemled > 3) {//no puede pasar el conteo mayor a 3 si hubiera mas led o mas opciones se cambiaria este parametro
    currentMenuItemled = 0;
  }
  //Si hemos cambiado de índice, guarda las repeticiones.
  if (stateled != lastStateled)
  {
    if (stateled == 4) {      /// si se preciona el boton izquierdo
      //izquierda
      if (currentMenuItemled == 1) // si se desplaza y es igual a 1 esta en el exteremo izquierdo
      {
        currentMenuItemled = 4; //current menu sera 4  esto hara que se pase al extremo derecho"de led 1 pasa a led 3
      }
      currentMenuItemled = currentMenuItemled - 1;//resta un lugar
      displayMenuled(currentMenuItemled);
    } else if (stateled == 1) {
      //If derecha       // tengo un salto mas en la programacion del derecho
      if (currentMenuItemled == 3)
      {
        currentMenuItemled = 0;
      }
      currentMenuItemled = currentMenuItemled + 1;  //suma un lugar
      displayMenuled(currentMenuItemled);
    } else if (stateled == 5) { // si se presiona selec
      //If Selected
      selectMenuled(currentMenuItemled);
    }
    //Save the last State to compare.
    lastStateled = stateled;
  }
  //Small delay
  delay(5);

    servonum++;
  if (servonum > 15) servonum = 0;
}

Esta es la parte final del scketch.

void displayMenuled(int x) { //pequeño programa que indicara que hacer dependiendo del boton presionado
  switch (x) {
    case 1:
      lcd.clear();  //deja en blanco el lcd
      led();        //ejecuta el programa led
      lcd.setCursor(4, 1); //posicion del cursor "la ubicacion del primer led en el lcd"
      lcd.write(byte(3));//dibuja el simbolo de seleccion
      break;

    case 2:
      lcd.clear();//deja en blanco el lcd
      led();       //ejecuta el programa led
      lcd.setCursor(8, 1); //posicion del cursor "la ubicacion del segundo led en el lcd"
      lcd.write(byte(3));//dibuja el simbolo de seleccion
      break;

    case 3:
      lcd.clear();//deja en blanco el lcd
      led();       //ejecuta el programa led
      lcd.setCursor(12, 1); //posicion del cursor "la ubicacion del tercer led en el lcd"
      lcd.write(byte(3));//dibuja el simbolo de seleccion
      break;
  }
}

void selectMenuled(int x) {
  switch (x) {

    case 1:
      lcd.clear();// deja en blanco el lcd
      if (a == 1) //evalua el estado de a
      {
        a = 2; // se cambia "a" esto hara que el led prenda en la siguiente comparacion
        led();// ejecuta el pequeño programa de led
        lcd.setCursor(0, 12); //se pone el cursor en la posicion 0, 12
        lcd.print(x);// se coloca el numero de led en este caso es el led 1
        pwm.setPWM(8, 0, 4096);
      }
      else
      {
        a = 1; //se camibia el valor de "a" esto probocara que en la siguiente compracion se apague el led
        led();// ejecuta el pequeño programa de led
        lcd.setCursor(0, 12); //se pone el cursor en la posicion 0, 12
        lcd.print(x);//se coloca el numero de led en este caso es el led 1
        pwm.setPWM(8, 4096, 0);
      }
      break;

    case 2:
      lcd.clear();// deja en blanco el lcd
      if (b == 1) //evalua el estado de b
      {
        b = 2; // se cambia "b" esto hara que el led prenda en la siguiente comparacion
        led();// ejecuta el pequeño programa de led
        lcd.setCursor(0, 12); //se pone el cursor en la posicion 0, 12
        lcd.print(x);// se coloca el numero de led en este caso es el led 2
        digitalWrite(3, LOW); 
      }
      else
      {
        b = 1; // se cambia "b" esto hara que el led apague en la siguiente comparacion
        led();// ejecuta el pequeño programa de led
        lcd.setCursor(0, 12); //se pone el cursor en la posicion 0, 12
        lcd.print(x);// se coloca el numero de led en este caso es el led 2
        digitalWrite(3, HIGH); 
      }
      break;

    case 3:
      lcd.clear();// deja en blanco el lcd
      if (c == 1) //evalua el estado de b
      {
        c = 2; // se cambia "c" esto hara que el led prenda en la siguiente comparacion
        led();// ejecuta el pequeño programa de led
        lcd.setCursor(0, 12); //se pone el cursor en la posicion 0, 12
        lcd.print(x);// se coloca el numero de led en este caso es el led 3
        digitalWrite(12, LOW); 
      }
      else
      {
        c = 1; // se cambia "c" esto hara que el led prenda en la siguiente comparacion
        led();// ejecuta el pequeño programa de
        lcd.setCursor(0, 12); //se pone el cursor en la posicion 0, 12
        lcd.print(x);// se coloca el numero de led en este caso es el led 3
        digitalWrite(12, HIGH);     
      }
      break;
  }
}

void led()
{
  lcd.clear(); //deja en blanco el lcd
  lcd.print ("Num. Led");//escribe num de led en 0,0
  lcd.setCursor(4, 1); //se posiciona  donde va la primer imagen del led
  lcd.write(byte(a));//dibuja o el led o la casilla dependiendo del valor en el que se encuentre
  lcd.setCursor(8, 1); //se posiciona  donde va la segunda imagen del led
  lcd.write(byte(b));//dibuja o el led o la casilla dependiendo del valor en el que se encuentre
  lcd.setCursor(12, 1); //se posiciona  donde va la tercer imagen del led
  lcd.write(byte(c));//dibuja o el led o la casilla dependiendo del valor en el que se encuentre

}

Me respondo a mi mismo, era fallo mío, supongo que era una mala conexión de algun cable o led en la protoboard. A pesar de haber cambiado todos los cables y leds me fallaba.

Pido disculpas por haceros perder el tiempo.

Hola, me acabas de preguntar por LCDMenuLib2 y me pides un menu mas fácil de usar.

Una solución simple es ir al Administrador de librerías y buscar simplemente Menu LCD y ver con cual te sientes cómodo.

Yo pongo en Google : Menu LCD y aparecen muchos tutoriales y videos.

ejemplo link

Hay muchas opciones.

Ese es el problema, hay muchas opciones y después de probar varias, no sabia por cual decantarme, por eso pedi consejo. Los menús del link que me has pasado, es con los que estoy jugando actualmente.
Muchas Gracias por tu tiempo¡¡¡

Un Cordial Saludo¡

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