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