diff --git a/esp32/features.ini b/esp32/features.ini index 03aa5f2..6f820fb 100644 --- a/esp32/features.ini +++ b/esp32/features.ini @@ -14,4 +14,5 @@ build_flags = -D FT_MAG=0 -D FT_BMP=0 -D FT_GPS=0 + -D FT_WS2812=0 -D FT_SERVO=1 diff --git a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp index b425431..57d1692 100644 --- a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp +++ b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.cpp @@ -66,6 +66,9 @@ ESP32SvelteKit::ESP32SvelteKit(PsychicHttpServer *server, #if FT_ENABLED(FT_IMU) || FT_ENABLED(FT_MAG) || FT_ENABLED(FT_BMP) _imuService(&_socket), #endif +#if FT_ENABLED(FT_WS2812) + _ledService(&_taskManager), +#endif #if FT_ENABLED(FT_SERVO) _servoController(server, &ESPFS, &_securitySettingsService, &_socket), #endif @@ -215,6 +218,9 @@ void ESP32SvelteKit::startServices() { _servoController.begin(); _servoController.configure(); #endif +#if FT_ENABLED(FT_WS2812) + _ledService.begin(); +#endif } void IRAM_ATTR ESP32SvelteKit::_loop() { @@ -233,6 +239,9 @@ void IRAM_ATTR ESP32SvelteKit::_loop() { #if FT_ENABLED(FT_SERVO) _servoController.loop(); #endif - vTaskDelay(20 / portTICK_PERIOD_MS); +#if FT_ENABLED(FT_WS2812) + _ledService.loop(); +#endif + delay(20); } } diff --git a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h index de07852..f381da9 100644 --- a/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h +++ b/esp32/lib/ESP32-sveltekit/ESP32SvelteKit.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -249,6 +250,9 @@ private: #if FT_ENABLED(FT_SERVO) ServoController _servoController; #endif +#if FT_ENABLED(FT_WS2812) + LEDService _ledService; +#endif String _appName = APP_NAME; diff --git a/esp32/lib/ESP32-sveltekit/LEDService.h b/esp32/lib/ESP32-sveltekit/LEDService.h new file mode 100644 index 0000000..eee8eff --- /dev/null +++ b/esp32/lib/ESP32-sveltekit/LEDService.h @@ -0,0 +1,63 @@ +#ifndef LEDService_h +#define LEDService_h + +#include +#include + +#ifndef WS2812_PIN +#define WS2812_PIN 12 +#endif + +#ifndef WS2812_NUM_LEDS +#define WS2812_NUM_LEDS 1+12 +#endif + +#define COLOR_ORDER GRB +#define CHIPSET WS2811 + +class LEDService +{ +private: + TaskManager *_taskManager; + + unsigned long _lastUpdate = 0; + + CRGB leds[WS2812_NUM_LEDS]; + CRGBPalette16 currentPalette; + TBlendType currentBlending; + + int _brightness = 255; + int direction = 1; + +public: + LEDService(TaskManager *taskManager) : + _taskManager(taskManager) + { + FastLED.addLeds(leds, WS2812_NUM_LEDS).setCorrection( TypicalLEDStrip ); + currentPalette = OceanColors_p; + currentBlending = LINEARBLEND; + } + ~LEDService(){} + + void begin(){} + + void loop(){ + if (millis() - _lastUpdate < 1000 / 60) return; + if (_brightness >= 200) direction = -5; + if (_brightness <= 50) direction = 5; + _brightness += direction; + fillFromPallette(0); + FastLED.show(); + _lastUpdate = millis(); + } + + void fillFromPallette(uint8_t colorIndex) { + CRGB color = ColorFromPalette(currentPalette, colorIndex, _brightness, currentBlending); + for( int i = 0; i < WS2812_NUM_LEDS; ++i) { + leds[i] = color; + } + } +}; + + +#endif \ No newline at end of file diff --git a/esp32/platformio.ini b/esp32/platformio.ini index aeaffa5..e3f805e 100644 --- a/esp32/platformio.ini +++ b/esp32/platformio.ini @@ -43,6 +43,7 @@ build_flags = ${env.build_flags} -D FT_CAMERA=1 -D CAMERA_MODEL_ESP32S3_EYE=1 + -D WS2812_PIN=48 -D SDA_PIN=47 -D SCL_PIN=21 @@ -87,6 +88,7 @@ lib_deps = adafruit/Adafruit BusIO@^1.9.3 adafruit/Adafruit PWM Servo Driver Library@^2.4.1 adafruit/Adafruit ST7735 and ST7789 Library@^1.10.4 + fastled/FastLED@^3.7.0 SPI extra_scripts = pre:scripts/pre_build.py