Make PIN configurable via REST API
- new "REST API": /pixels?pin=GPIO_NO to change PIN# (Allowed GPIO values: 16/5/4/0/2/14/12/13/15/3/1)
This commit is contained in:
parent
118c35d2a8
commit
39a773805e
5 changed files with 136 additions and 14 deletions
|
@ -114,6 +114,7 @@ void initDMA(uint16_t stripSize = NUMLEDS){
|
|||
#endif
|
||||
dma->Initialize();
|
||||
}
|
||||
|
||||
void DMA_Show(void) {
|
||||
if(dma->IsReadyToUpdate()) {
|
||||
memcpy(dma->getPixels(), strip->getPixels(), dma->getPixelsSize());
|
||||
|
@ -228,15 +229,16 @@ void saveConfigCallback () {
|
|||
// ***************************************************************************
|
||||
#include "request_handlers.h"
|
||||
|
||||
neoPixelType RGBOrderOnStrip = NEO_GRB;
|
||||
//
|
||||
void initStrip(uint16_t stripSize = NUMLEDS, neoPixelType RGBOrder = NEO_GRB){
|
||||
// function to Initialize the strip
|
||||
void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, neoPixelType RGBOrder = WS2812FXStripSettings.RGBOrder, uint8_t pin = WS2812FXStripSettings.pin){
|
||||
if (strip) {
|
||||
if (strip->getLength() == stripSize && RGBOrderOnStrip == RGBOrder) return;
|
||||
if (strip->getLength() == stripSize && WS2812FXStripSettings.RGBOrder == RGBOrder && WS2812FXStripSettings.pin == pin) return;
|
||||
delete strip;
|
||||
RGBOrderOnStrip = RGBOrder;
|
||||
WS2812FXStripSettings.stripSize = stripSize;
|
||||
WS2812FXStripSettings.RGBOrder = RGBOrder;
|
||||
WS2812FXStripSettings.pin = pin;
|
||||
}
|
||||
strip = new WS2812FX(stripSize, PIN, RGBOrder + NEO_KHZ800);
|
||||
strip = new WS2812FX(stripSize, pin, RGBOrder + NEO_KHZ800);
|
||||
// Parameter 1 = number of pixels in strip
|
||||
// Parameter 2 = Arduino pin number (most are valid)
|
||||
// Parameter 3 = pixel type flags, add together as needed:
|
||||
|
@ -260,6 +262,7 @@ void initStrip(uint16_t stripSize = NUMLEDS, neoPixelType RGBOrder = NEO_GRB){
|
|||
//strip->setMode(FX_MODE_RAINBOW_CYCLE);
|
||||
strip->setColor(main_color.red, main_color.green, main_color.blue);
|
||||
strip->start();
|
||||
saveWS2812FXStripSettings.once(3, writeStripConfigFS);
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
|
@ -309,6 +312,7 @@ void setup() {
|
|||
// ***************************************************************************
|
||||
// Setup: Neopixel
|
||||
// ***************************************************************************
|
||||
readStripConfigFS(); // Read config from FS first
|
||||
initStrip();
|
||||
|
||||
// ***************************************************************************
|
||||
|
@ -778,6 +782,38 @@ void setup() {
|
|||
DBG_OUTPUT_PORT.println("invalid input!");
|
||||
}
|
||||
}
|
||||
if(server.hasArg("pin")){
|
||||
uint8_t pin = server.arg("pin").toInt();
|
||||
DBG_OUTPUT_PORT.print("/pixels: GPIO used# ");
|
||||
#if defined(USE_WS2812FX_DMA) or defined(USE_WS2812FX_UART1) or defined(USE_WS2812FX_UART2)
|
||||
#ifdef USE_WS2812FX_DMA
|
||||
DBG_OUTPUT_PORT.println("3");
|
||||
#endif
|
||||
#ifdef USE_WS2812FX_UART1
|
||||
DBG_OUTPUT_PORT.println("2");
|
||||
#endif
|
||||
#ifdef USE_WS2812FX_UART2
|
||||
DBG_OUTPUT_PORT.println("1");
|
||||
#endif
|
||||
#else
|
||||
if (pin == 16 or pin == 5 or pin == 4 or pin == 0 or pin == 2 or pin == 14 or pin == 12 or pin == 13 or pin == 15 or pin == 3 or pin == 1) {
|
||||
initStrip(NULL, NULL, pin);
|
||||
DBG_OUTPUT_PORT.println(pin);
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.println("invalid input!");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
DynamicJsonDocument jsonBuffer;
|
||||
JsonObject json = jsonBuffer.to<JsonObject>();
|
||||
json["pixel_pount"] = WS2812FXStripSettings.stripSize;
|
||||
json["rgb_order"] = WS2812FXStripSettings.RGBOrder;
|
||||
json["pin"] = WS2812FXStripSettings.pin;
|
||||
String json_str;
|
||||
serializeJson(json, json_str);
|
||||
server.sendHeader("Access-Control-Allow-Origin", "*");
|
||||
server.send(200, "application/json", json_str);
|
||||
});
|
||||
|
||||
server.on("/off", []() {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
//#define USE_WS2812FX_DMA // Uses PIN is ignored & set to RX/GPIO3 Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
|
||||
//#define USE_WS2812FX_UART1 // Uses PIN is ignored & set to D4/GPIO2 Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
|
||||
//#define USE_WS2812FX_UART2 // Uses PIN is ignored & set to TX/GPIO1 Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
|
||||
//#define USE_WS2812FX_DMA // PIN is ignored & set to RX/GPIO3 Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
|
||||
//#define USE_WS2812FX_UART1 // PIN is ignored & set to D4/GPIO2 Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
|
||||
//#define USE_WS2812FX_UART2 // PIN is ignored & set to TX/GPIO1 Uses WS2812FX, see: https://github.com/kitesurfer1404/WS2812FX
|
||||
|
||||
// Neopixel
|
||||
#define PIN 14 // PIN (14 / D5) where neopixel / WS2811 strip is attached
|
||||
|
|
|
@ -1422,3 +1422,87 @@ bool readStateFS() {
|
|||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
//Strip Config
|
||||
struct
|
||||
{
|
||||
uint16_t stripSize = NUMLEDS;
|
||||
uint16_t RGBOrder = NEO_GRB;
|
||||
#if defined(USE_WS2812FX_DMA) or defined(USE_WS2812FX_UART1) or defined(USE_WS2812FX_UART2)
|
||||
#ifdef USE_WS2812FX_DMA
|
||||
uint8_t pin = 3;
|
||||
#endif
|
||||
#ifdef USE_WS2812FX_UART1
|
||||
uint8_t pin = 2;
|
||||
#endif
|
||||
#ifdef USE_WS2812FX_UART2
|
||||
uint8_t pin = 1;
|
||||
#endif
|
||||
#else
|
||||
uint8_t pin = PIN;
|
||||
#endif
|
||||
} WS2812FXStripSettings;
|
||||
|
||||
Ticker saveWS2812FXStripSettings;
|
||||
|
||||
bool readStripConfigFS(void) {
|
||||
//read stripconfiguration from FS JSON
|
||||
updateFS = true;
|
||||
if (SPIFFS.exists("/neoconfig.json")) {
|
||||
//file exists, reading and loading
|
||||
DBG_OUTPUT_PORT.print("Reading neoconfig file... ");
|
||||
File configFile = SPIFFS.open("/neoconfig.json", "r");
|
||||
if (configFile) {
|
||||
DBG_OUTPUT_PORT.println("Opened!");
|
||||
size_t size = configFile.size();
|
||||
std::unique_ptr<char[]> buf(new char[size]);
|
||||
configFile.readBytes(buf.get(), size);
|
||||
DynamicJsonDocument jsonBuffer(JSON_OBJECT_SIZE(4)+300);
|
||||
DeserializationError error = deserializeJson(jsonBuffer, buf.get());
|
||||
DBG_OUTPUT_PORT.print("Config: ");
|
||||
if (!error) {
|
||||
DBG_OUTPUT_PORT.println(" Parsed!");
|
||||
JsonObject json = jsonBuffer.as<JsonObject>();
|
||||
serializeJson(json, DBG_OUTPUT_PORT);
|
||||
WS2812FXStripSettings.stripSize = json["pixel_pount"];
|
||||
WS2812FXStripSettings.RGBOrder = json["rgb_order"];
|
||||
WS2812FXStripSettings.pin = json["pin"];
|
||||
updateFS = false;
|
||||
return true;
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.print("Failed to load json config: ");
|
||||
DBG_OUTPUT_PORT.println(error.c_str());
|
||||
}
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.println("Failed to open /config.json");
|
||||
}
|
||||
} else {
|
||||
DBG_OUTPUT_PORT.println("Coudnt find config.json");
|
||||
}
|
||||
//end read
|
||||
updateFS = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
void writeStripConfigFS(void){
|
||||
updateFS = true;
|
||||
//save the strip config to FS JSON
|
||||
DBG_OUTPUT_PORT.print("Saving cfg: ");
|
||||
DynamicJsonDocument jsonBuffer;
|
||||
JsonObject json = jsonBuffer.to<JsonObject>();
|
||||
json["pixel_pount"] = WS2812FXStripSettings.stripSize;
|
||||
json["rgb_order"] = WS2812FXStripSettings.RGBOrder;
|
||||
json["pin"] = WS2812FXStripSettings.pin;
|
||||
|
||||
//SPIFFS.remove("/neoconfig.json") ? DBG_OUTPUT_PORT.println("removed file") : DBG_OUTPUT_PORT.println("failed removing file");
|
||||
File configFile = SPIFFS.open("/neoconfig.json", "w");
|
||||
if (!configFile) {
|
||||
DBG_OUTPUT_PORT.println("Failed!");
|
||||
updateFS = false;
|
||||
}
|
||||
serializeJson(json, DBG_OUTPUT_PORT);
|
||||
serializeJson(json, configFile);
|
||||
configFile.close();
|
||||
updateFS = false;
|
||||
//end save
|
||||
}
|
|
@ -68,4 +68,5 @@
|
|||
* - Pointers added for WS2812FX & NeoPixelBus
|
||||
* - new "REST API": /pixels?ct=xxx to change length of LED strip
|
||||
* - new "REST API": /pixels?rgbo=xxx to change RGB order
|
||||
* - new "REST API": /pixels?pin=GPIO_NO to change PIN# (Allowed GPIO values: 16/5/4/0/2/14/12/13/15/3/1)
|
||||
*/
|
||||
|
|
11
README.md
11
README.md
|
@ -61,17 +61,18 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so
|
|||
|
||||
## Todos
|
||||
- [ ] Support multiple strips and control them separately or together [Issue](https://github.com/toblum/McLighting/issues/118)
|
||||
- [ ] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/93)
|
||||
- [ ] Bundle webpages instead of SPIFFS [Issue](https://github.com/toblum/McLighting/issues/93)
|
||||
- [ ] Remove old / wrong EEPROM settings completely [Issue]
|
||||
- [ ] Customer profile to define segments of (in)active areas on the strip [Issue](https://github.com/toblum/McLighting/issues/37)
|
||||
- [ ] Additional clients
|
||||
- [ ] If no wifi, at least enable button mode.
|
||||
- [ ] Also enable McLighting in Wifi AP mode.
|
||||
- [ ] IR remote support [issue](https://github.com/toblum/McLightingUI/issues/3)
|
||||
- [ ] Multiple buttons/GPIO Inputs. [Issue](https://github.com/toblum/McLighting/issues/119)
|
||||
- [ ] Music visualizer / Bring back ArtNet [Issue](https://github.com/toblum/McLighting/issues/111)
|
||||
- [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150)
|
||||
- [ ] IR remote support [issue](https://github.com/toblum/McLightingUI/issues/3)
|
||||
- [ ] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/272)
|
||||
- [x] Make number of pixels, RGB Order and PIN configurable via REST API
|
||||
- [x] Bundle webpages instead of SPIFFS [Issue](https://github.com/toblum/McLighting/issues/93)
|
||||
- [x] Music visualizer / Bring back ArtNet [Issue](https://github.com/toblum/McLighting/issues/111)
|
||||
- [x] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150)
|
||||
- [x] MQTT support
|
||||
- [x] Save favourite effects? [Issue](https://github.com/toblum/McLighting/issues/35)(https://github.com/toblum/McLighting/issues/101)
|
||||
- [x] OTA update [Issue](https://github.com/toblum/McLighting/issues/92)
|
||||
|
|
Loading…
Reference in a new issue