Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mcattani/c1a235bd2c94b32297c30ca34e2ef046 to your computer and use it in GitHub Desktop.
Save mcattani/c1a235bd2c94b32297c30ca34e2ef046 to your computer and use it in GitHub Desktop.
Proyecto prueba de librerías Button2 & ESPRotary con rueda led NeoPixel
/*
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