Instantly share code, notes, and snippets.
Created
December 6, 2023 21:17
-
Save mcattani/c1a235bd2c94b32297c30ca34e2ef046 to your computer and use it in GitHub Desktop.
Proyecto prueba de librerías Button2 & ESPRotary con rueda led NeoPixel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Proyecto prueba de librerías Button2 y ESPRotary (creadas por Lennart Hennigs) | |
Para este proyecto utilizaremos un Arduino UNO, una rueda NeoPixel (12 leds) | |
y un módulo Rotary Encoder. | |
Toda la información referente al proyecto en: | |
https://thenerdyapprentice.blogspot.com/ | |
*/ | |
// Incluimos todas librerías que utilizaremos | |
#include "Button2.h" | |
#include "ESPRotary.h" | |
#include <Adafruit_NeoPixel.h> | |
// Definimos las constantes que componen los pines del encoder y de la rueda de leds | |
const byte ROTARY_PIN1 = 3; // Chequear correctamente estos valores respecto de la dirección de giro del encoder | |
const byte ROTARY_PIN2 = 4; | |
const byte PULSADOR_PIN = 6; | |
const byte LED_PIN = 7; | |
const byte LED_COUNT = 12; | |
const byte CLICKS_PER_STEP = 4; // Este número depende del rotary encoder (yo lo dejé tal cual el ejemplo que venía con la librería, no funcionaba bien con otros valores) | |
// Definimos valores mínimos y máximos que registratá el encoder, también la posición de inicio | |
const byte MIN_POS = 1; // Arranca desde 1 para que el LED 0 siempre quede encendido | |
const byte MAX_POS = 12; | |
const byte POS_INICIO = 0; | |
const byte INCREMENTO = 1; // Incremento del contador del encoder | |
// Creamos los objetos para la rueda de leds, el encoder y el pulsador del encoder (que utilizaremos con la librería Button2.h) | |
ESPRotary encoder; | |
Button2 pulsador; | |
Adafruit_NeoPixel rueda(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); | |
byte currentColor = 0; // Indice del color actual | |
byte pos_actual; | |
byte pos_anterior; | |
bool cambio_color = false; | |
void setup() { | |
// Iniciamos comuniación serial y los objetos construidos arriba. | |
Serial.begin(9600); | |
// Iniciamos los objetos | |
encoder.begin(ROTARY_PIN1, ROTARY_PIN2, CLICKS_PER_STEP, MIN_POS, MAX_POS, POS_INICIO, INCREMENTO); | |
rueda.begin(); | |
pulsador.begin(PULSADOR_PIN); | |
pulsador.setLongClickTime(1000); // Setea el tiempo para detectar el click sostenido | |
rueda.show(); // Apagamos los leds | |
rueda.setBrightness(20); // Seteamos el brillo de los leds | |
// Seteamos las funciones de retorno de llamada (callback functions) | |
//pulsador.setTapHandler(pulsado); // Cuando se produce una pulsación llama a la función 'pulsado'... | |
pulsador.setClickHandler(pulsado); // Cuando se produce una pulsación llama a la función 'pulsado'... // la función anterior ignora el timing de la pulsación larga | |
pulsador.setLongClickDetectedHandler(pulsado_largo); // Cuando se produce una pulsación larga | |
encoder.setChangedHandler(rotacion); // Cuando se produce una rotación | |
encoder.setLeftRotationHandler(mostrar_direccion); // Cuando se produce una rotación para la izquierda (ver definición de constantes) | |
encoder.setRightRotationHandler(mostrar_direccion); // Cuando se produce una rotación para la derecha | |
encoder.setLowerOverflowHandler(tope_inferior); // Evento cuando llegamos al valor definido como MIN_POS | |
encoder.setUpperOverflowHandler(tope_superior); // Evento cuando llegamos al valor definido como MAX_POS | |
Serial.print("Proyecto prueba de librerías ESPRotary y Button2\n"); | |
Serial.println("El encoder utilizará valores entre " + String(MIN_POS) + " y " + String(MAX_POS)); | |
Serial.println("Posición actual: " + String(encoder.getPosition())); | |
rueda.setPixelColor(POS_INICIO, 255, 255, 255); // Arrancamos con el LED 0 encendido | |
rueda.show(); | |
} | |
void loop() { | |
pulsador.loop(); | |
encoder.loop(); | |
} | |
void pulsado(Button2 &b) { | |
currentColor++; // Cambia el índice de color | |
Serial.println("Cambio de color."); | |
cambio_color = true; | |
// Establece un límite para los colores | |
if (currentColor > 6) { // Cambia el 6 al número total de colores - 1 | |
currentColor = 0; | |
} | |
// Cambia el color de todos los LEDs encendidos | |
for (int i = 0; i < LED_COUNT; i++) { | |
if (rueda.getPixelColor(i) != 0) { // Verifica si el LED está encendido | |
switch (currentColor) { | |
case 0: | |
rueda.setPixelColor(i, rueda.Color(255, 0, 0)); // Rojo | |
break; | |
case 1: | |
rueda.setPixelColor(i, rueda.Color(0, 255, 0)); // Verde | |
break; | |
case 2: | |
rueda.setPixelColor(i, rueda.Color(0, 0, 255)); // Azul | |
break; | |
case 3: | |
rueda.setPixelColor(i, rueda.Color(255, 255, 0)); // Amarillo | |
break; | |
case 4: | |
rueda.setPixelColor(i, rueda.Color(255, 0, 255)); // Magenta | |
break; | |
case 5: | |
rueda.setPixelColor(i, rueda.Color(0, 255, 255)); // Cyan | |
break; | |
case 6: | |
rueda.setPixelColor(i, rueda.Color(255, 255, 255)); // Blanco | |
break; | |
// Se pueden agregar más casos según los colores que se quieran utilizar | |
} | |
} | |
} | |
rueda.show(); | |
} | |
void pulsado_largo(Button2 &b) { | |
Serial.println("Pulsación sostenida, apagamos todos los leds."); | |
for (int i = 1; i < LED_COUNT; i++) { // Apagamos todos los leds excepto el LED 0 que siempre queda encendido | |
rueda.setPixelColor(i, 0, 0, 0); | |
rueda.show(); | |
} | |
//rueda.clear(); | |
//rueda.show(); | |
encoder.resetPosition(1); // Reiniciamos a 1 la posición del encoder | |
//Serial.println(pos_actual); | |
} | |
void rotacion(ESPRotary &r) { | |
pos_actual = encoder.getPosition(); // Obtenemos el valor actual de la posición del encoder | |
//color_actual = rueda.getPixelColor(pos_actual - 1); / | |
uint32_t color_actual = rueda.getPixelColor(0); // Obtenemos el color del 0 que usamos como referencia | |
if (pos_actual == 13) pos_actual = 0; // Si llegamos al limite de LEDS reiniciamos | |
if (cambio_color && pos_anterior > 0 && pos_anterior <= LED_COUNT) { | |
// Si cambio_color es verdadero y la posición anterior es válida, | |
// leer el color del píxel anteriormente encendido | |
color_actual = rueda.getPixelColor(pos_anterior - 1); | |
} else { | |
// Si cambio_color es falso o la posición anterior no es válida, | |
// establecer un color predeterminado (en este caso, blanco) | |
color_actual = rueda.Color(255, 255, 255); | |
} | |
// Comparamos la posición actual con la anterior para saber para que lado se giró el encoder | |
// y así apagar o encender el led según el valor. | |
if (pos_actual < pos_anterior) { | |
rueda.setPixelColor(pos_actual, 0, 0, 0); | |
rueda.show(); | |
} else { | |
rueda.setPixelColor(pos_actual - 1, color_actual); | |
rueda.show(); | |
} | |
Serial.println("Posición actual: " + String(pos_actual)); | |
pos_anterior = pos_actual; | |
} | |
void tope_inferior(ESPRotary &r) { | |
Serial.println("Alcanzaste el límite inferior."); | |
} | |
void tope_superior(ESPRotary &r) { | |
Serial.println("Alcanzaste el límite superior."); | |
} | |
void mostrar_direccion(ESPRotary &r) { // Con esta función podríamos mostrar la direcicón del giro en la consola "left/right" | |
// Hay que usar .directionToString o no muestra la dirección | |
//Serial.println(encoder.directionToString(encoder.getDirection())); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment