Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
int analog_value=0;
void setup() {
pwm.begin();
pwm.setPWMFreq(1600); // This is the maximum PWM frequency
Wire.setClock(400000); //Incrementar la velocidad del I2C
}
void loop() {
number_led(analogRead(A0));
}
void number_led(uint16_t number){
uint8_t finalLED = 0;
uint8_t numberLED = map(number, 0, 1023, 0, 15); //remapea o reajusta el valor del ADC para solo un rango de 0 a 15
// de esta manera sabemos que LED es el que se va a encender. Sin embargo, para el valor del PWM necesitamos saber
// por cuanto se excede de la unidad del LED para que ese "extra" se module con un PWM. Para que el incremento se vea
// mas organico.
uint16_t numberPWM = number-(numberLED*68);
numberPWM = map(numberPWM, 0, 68, 0, 500);
for (uint8_t pwmnum=0; pwmnum < numberLED; pwmnum++) {//Incremento para los niveles, en este caso estamos usando 16 canales
pwm.setPWM(pwmnum, 4096, 0); //Activa todos los LEDs que corresponden a el valor activo
finalLED=pwmnum; //Guarda el valor del último LED para este ciclo.
}
pwm.setPWM(finalLED+1,0,numberPWM); // El valor del remanente entre un LED y otro se emite con un % de PWM.
finalLED=0;
delay(100);
for (uint8_t pwmnum=0; pwmnum < 16; pwmnum++) { //Ciclo para borrar los LEDs
pwm.setPWM(16-pwmnum, 0, 4096 );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment