Add the WS2812 code

This commit is contained in:
2026-06-06 23:47:21 -04:00
parent 696edc206a
commit 5e7713f08b

View File

@@ -1,3 +1,5 @@
#include "Freenove_WS2812_Lib_for_ESP32.h"
/*********************************************************************************/ /*********************************************************************************/
// Constants // Constants
@@ -29,7 +31,7 @@
//#define PIN_JOY_Z 12 //#define PIN_JOY_Z 12
#define BUTTON_STABLETIME 100 #define BUTTON_STABLETIME 100
#define JOYSTICK_STABLETIME 1000 #define JOYSTICK_STABLETIME 3000
// Button states // Button states
#define BUTTON_STATE_BOUNCING (1 << 0) #define BUTTON_STATE_BOUNCING (1 << 0)
@@ -44,14 +46,14 @@
#define JOYSTICK_STATE_READY (1 << 3) #define JOYSTICK_STATE_READY (1 << 3)
// These aren't pins, they're just defines that help us identify the lights on the 2812 unit // These aren't pins, they're just defines that help us identify the lights on the 2812 unit
#define LED_2812_LEFT 1 // 2812 LEDs are ordered from connection point at left #define LED_2812_LEFT 0 // 2812 LEDs are ordered from connection point at left
#define LED_2812_TOPLEFT 2 // and go clockwise #define LED_2812_TOPLEFT 1 // and go clockwise
#define LED_2812_TOP 3 #define LED_2812_TOP 2
#define LED_2812_TOPRIGHT 4 #define LED_2812_TOPRIGHT 3
#define LED_2812_RIGHT 5 #define LED_2812_RIGHT 4
#define LED_2812_BOTTOMRIGHT 6 #define LED_2812_BOTTOMRIGHT 5
#define LED_2812_BOTTOM 7 #define LED_2812_BOTTOM 6
#define LED_2812_BOTTOMLEFT 8 #define LED_2812_BOTTOMLEFT 7
// Error flags // Error flags
@@ -97,7 +99,7 @@ typedef struct JoystickAxis {
uint8_t pin; uint8_t pin;
// Calibration data // Calibration data
Calibration calibration; Calibration calibration;
// Position as of the last read time // Position as of the last read time.
uint32_t position; uint32_t position;
} JoystickAxis; } JoystickAxis;
@@ -118,6 +120,7 @@ typedef struct Joystick {
int errno; int errno;
Button calibration_button; Button calibration_button;
Joystick js; Joystick js;
Freenove_ESP32_WS2812 *strip;
/******************************************************************************/ /******************************************************************************/
// Initialization Functions // Initialization Functions
@@ -126,8 +129,15 @@ void initSerial()
Serial.begin(115200); Serial.begin(115200);
} }
int init2812() int init2812(Freenove_ESP32_WS2812 **strip)
{ {
Freenove_ESP32_WS2812 *obj = new Freenove_ESP32_WS2812(8, PIN_2812, 0, TYPE_GRB);
if ( obj == NULL ) {
ERROR(ERRNO_NULLPOINTER);
}
obj->setBrightness(10);
obj->begin();
*strip = obj;
return ERRNO_SUCCESS; return ERRNO_SUCCESS;
} }
@@ -273,10 +283,16 @@ int readJoystick(Joystick *js)
adcvalue = analogRead(js->x.pin); adcvalue = analogRead(js->x.pin);
if ( adcvalue < js->x.calibration.low || adcvalue > js->x.calibration.high ) { if ( adcvalue < js->x.calibration.low || adcvalue > js->x.calibration.high ) {
js->x.position = adcvalue; js->x.position = adcvalue;
} else {
// Snap to center
js->x.position = 2048;
} }
adcvalue = analogRead(js->y.pin); adcvalue = analogRead(js->y.pin);
if ( adcvalue < js->y.calibration.low || adcvalue > js->y.calibration.high ) { if ( adcvalue < js->y.calibration.low || adcvalue > js->y.calibration.high ) {
js->y.position = adcvalue; js->y.position = adcvalue;
} else {
// Snap to center
js->y.position = 2048;
} }
//Serial.printf("Joystick x %d y %d\n", js->x.position, js->y.position); //Serial.printf("Joystick x %d y %d\n", js->x.position, js->y.position);
@@ -317,15 +333,43 @@ int displayLEDs(Joystick *js)
return ERRNO_SUCCESS; return ERRNO_SUCCESS;
} }
int display2812(Joystick *js) int display2812(Joystick *js, Freenove_ESP32_WS2812 *strip)
{ {
if ( js == NULL ) { if ( js == NULL ) {
ERROR(ERRNO_NULLPOINTER); ERROR(ERRNO_NULLPOINTER);
} }
strip->setLedColorData(LED_2812_LEFT, 0, 0, 0);
strip->setLedColorData(LED_2812_TOPLEFT, 0, 0, 0);
strip->setLedColorData(LED_2812_TOP, 0, 0, 0);
strip->setLedColorData(LED_2812_TOPRIGHT, 0, 0, 0);
strip->setLedColorData(LED_2812_RIGHT, 0, 0, 0);
strip->setLedColorData(LED_2812_BOTTOMRIGHT, 0, 0, 0);
strip->setLedColorData(LED_2812_BOTTOM, 0, 0, 0);
strip->setLedColorData(LED_2812_BOTTOMLEFT, 0, 0, 0);
// Is the joystick fully ready? Display direction on the 2812 // Is the joystick fully ready? Display direction on the 2812
if ( ( js->state & JOYSTICK_STATE_READY ) == JOYSTICK_STATE_READY ) { if ( ( js->state & JOYSTICK_STATE_READY ) == JOYSTICK_STATE_READY ) {
// Light up the correct LED_2812_* depending on the value of the X/Y axes on the joystick // Light up the correct LED_2812_* depending on the value of the X/Y axes on the joystick
if ( js->x.position < 1024 && (js->y.position < 3072 && js->y.position > 1024) ) {
strip->setLedColorData(LED_2812_LEFT, 128, 128, 128);
} else if ( js->x.position < 1024 && js->y.position < 1024 ) {
strip->setLedColorData(LED_2812_TOPLEFT, 128, 128, 128);
} else if ( ( js->x.position > 1024 && js->x.position < 3072 ) && js->y.position < 1024 ) {
strip->setLedColorData(LED_2812_TOP, 128, 128, 128);
} else if ( js->x.position > 3072 && js->y.position < 1024 ) {
strip->setLedColorData(LED_2812_TOPRIGHT, 128, 128, 128);
} else if ( js->x.position > 3072 && ( js->y.position < 3072 && js->y.position > 1024) ) {
strip->setLedColorData(LED_2812_RIGHT, 128, 128, 128);
} else if ( js->x.position > 3072 && js->y.position > 3072 ) {
strip->setLedColorData(LED_2812_BOTTOMRIGHT, 128, 128, 128);
} else if ( ( js->x.position > 1024 && js->x.position < 3072 ) && js->y.position > 3072 ) {
strip->setLedColorData(LED_2812_BOTTOM, 128, 128, 128);
} else if ( js->x.position < 1024 && js->y.position > 3072 ) {
strip->setLedColorData(LED_2812_BOTTOMLEFT, 128, 128, 128);
} }
}
strip->show();
return ERRNO_SUCCESS; return ERRNO_SUCCESS;
} }
@@ -342,7 +386,7 @@ void setup() {
calibration_button.pressedvalue = LOW; calibration_button.pressedvalue = LOW;
initSerial(); initSerial();
if ( init2812() != ERRNO_SUCCESS ) Serial.printf("Failed to initialize 2812 LED array : %d\n", errno); if ( init2812(&strip) != ERRNO_SUCCESS ) Serial.printf("Failed to initialize 2812 LED array : %d\n", errno);
if ( initLEDs() != ERRNO_SUCCESS ) Serial.printf("Failed to initialize LED GPIO pins : %d\n", errno); if ( initLEDs() != ERRNO_SUCCESS ) Serial.printf("Failed to initialize LED GPIO pins : %d\n", errno);
if ( initJoystick(&js) != ERRNO_SUCCESS ) Serial.printf("Failed to initialized Joystick datastructure : %d\n", errno); if ( initJoystick(&js) != ERRNO_SUCCESS ) Serial.printf("Failed to initialized Joystick datastructure : %d\n", errno);
if ( initButton(&calibration_button) != ERRNO_SUCCESS ) Serial.printf("Failed to initialize Calibration button and GPIO pin : %d\n", errno); if ( initButton(&calibration_button) != ERRNO_SUCCESS ) Serial.printf("Failed to initialize Calibration button and GPIO pin : %d\n", errno);
@@ -369,7 +413,7 @@ void loop() {
if ( displayLEDs(&js) != ERRNO_SUCCESS ) { if ( displayLEDs(&js) != ERRNO_SUCCESS ) {
Serial.printf("Failed to display LEDs : %d\n", errno); Serial.printf("Failed to display LEDs : %d\n", errno);
} }
if ( display2812(&js) != ERRNO_SUCCESS ) { if ( display2812(&js, strip) != ERRNO_SUCCESS ) {
Serial.printf("Failed to display 2812 LEDs : %d\n", errno); Serial.printf("Failed to display 2812 LEDs : %d\n", errno);
} }
} }