As said not so easy because it uses a specific template for each pin to be defined.
Code: Select all
#ifdef USES_P038
//#######################################################################################################
//#################################### Plugin 038: NeoPixel Basic #######################################
//#######################################################################################################
// List of commands:
// NeoPixel <led nr>, <red 0-255>, <green 0-255>, <blue 0-255>
// NeoPixelRange <start led nr>, <end led nr>, <red 0-255>, <green 0-255>, <blue 0-255>
// NeoPixelAll <red 0-255>, <green 0-255>, <blue 0-255>
#if defined(ESP8266)
#define USE_ADAFRUIT
#endif
//#define USE_FASTLED
#if defined(ESP32)
#define USE_ESP32RMTNEO
#endif
#ifdef USE_ADAFRUIT
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel *Plugin_038_pixels;
#endif
#ifdef USE_FASTLED
#include <FastLED.h>
CRGB leds[25];
#endif
#ifdef USE_ESP32RMTNEO
// lib from: https://github.com/MartyMacGyver/ESP32-Digital-RGB-LED-Drivers
#include "esp32_digital_led_lib.h"
// Create strand struct with default settings
strand_t strand = {.rmtChannel = 0, .gpioNum = 27, .ledType = LED_WS2812B_V1, .brightLimit = 20, .numPixels = 25};
// Create pointer array to strand object (we use only one)
strand_t * STRANDS [] = { &strand };
#endif
#define PLUGIN_038
#define PLUGIN_ID_038 38
#define PLUGIN_NAME_038 "Output - NeoPixel (Basic)"
#define PLUGIN_VALUENAME1_038 ""
int P038_ledCount = 25;
boolean P038_Init = false;
#if defined(ESP8266)
byte P038_driver = 1;
#endif
#if defined(ESP32)
byte P038_driver = 3;
#endif
boolean Plugin_038(byte function, struct EventStruct *event, String& string)
{
boolean success = false;
switch (function)
{
case PLUGIN_DEVICE_ADD:
{
Device[++deviceCount].Number = PLUGIN_ID_038;
Device[deviceCount].Type = DEVICE_TYPE_SINGLE;
Device[deviceCount].Custom = true;
Device[deviceCount].TimerOption = false;
break;
}
case PLUGIN_GET_DEVICENAME:
{
string = F(PLUGIN_NAME_038);
break;
}
case PLUGIN_GET_DEVICEVALUENAMES:
{
strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_038));
break;
}
case PLUGIN_WEBFORM_LOAD:
{
addFormNumericBox(F("Led Count"), F("p038_leds"), PCONFIG(0),1,999);
addFormPinSelect(F("GPIO"), F("taskdevicepin1"), CONFIG_PIN1);
addFormNumericBox(F("Driver"), F("p038_driver"), PCONFIG(7),1,3);
success = true;
break;
}
case PLUGIN_WEBFORM_SAVE:
{
PCONFIG(0) = getFormItemInt(F("p038_leds"));
PCONFIG(7) = getFormItemInt(F("p038_driver"));
success = true;
break;
}
case PLUGIN_INIT:
{
if(!P038_Init)
{
P038_Boot(PCONFIG(7), CONFIG_PIN1, PCONFIG(0), 25);
}
success = true;
break;
}
case PLUGIN_WRITE:
{
if(P038_Init)
{
String cmd = parseString(string, 1);
if (cmd.equalsIgnoreCase(F("NeoPixelClear")))
{
#ifdef USE_ADAFRUIT
Plugin_038_pixels->clear();
Plugin_038_pixels->show();
#endif
success = true;
}
if (cmd.equalsIgnoreCase(F("NeoPixel")))
{
P038_pixel(event->Par1-1, event->Par2, event->Par3, event->Par4);
success = true;
}
if (cmd.equalsIgnoreCase(F("NeoPixelAll")))
{
P038_pixelRange(0, P038_ledCount-1, event->Par1, event->Par2, event->Par3);
success = true;
}
if (cmd.equalsIgnoreCase(F("NeoPixelRange")))
{
P038_pixelRange(event->Par1-1, event->Par2-1, event->Par3, event->Par4, event->Par5);
success = true;
}
if (cmd.equalsIgnoreCase(F("NeoPixelTest")))
{
for (int i = 0; i < P038_ledCount; i++)
{
P038_pixel(i, 0,0,80);
delay(50);
P038_pixel(i, 0,0,0);
delay(50);
}
success = true;
}
}
break;
}
}
return success;
}
void P038_Boot(byte driver, byte pin, int ledCount, byte brightness){
if(P038_Init)
return;
P038_Init = true;
P038_driver = driver;
P038_ledCount = ledCount;
pinMode(pin,OUTPUT);
switch(P038_driver){
case 1:
#ifdef USE_ADAFRUIT
Plugin_038_pixels = new Adafruit_NeoPixel(P038_ledCount, pin, NEO_GRB + NEO_KHZ800);
Plugin_038_pixels->begin();
P038_pixelRange(0, 4, 25, 25, 25);
#endif
break;
case 2:
#ifdef USE_FASTLED
if(pin == 16)
FastLED.addLeds<NEOPIXEL, 16>(leds, P038_ledCount); // Wemos D1 Mini
if(pin == 26)
FastLED.addLeds<NEOPIXEL, 26>(leds, P038_ledCount); // NEOPIXEL module on grove for M5-Atom
if(pin == 27)
FastLED.addLeds<NEOPIXEL, 27>(leds, P038_ledCount); // Built-in ATOM NEOPIXEL
if(pin == 32)
FastLED.addLeds<NEOPIXEL, 32>(leds, P038_ledCount); // NEOPIXEL module on grove for M5-StickC
FastLED.setBrightness(50);
P038_pixelRange(0, 4, 25, 25, 25);
#endif
break;
case 3:
#ifdef USE_ESP32RMTNEO
strand.gpioNum = pin;
strand.numPixels = P038_ledCount;
digitalLeds_initDriver();
gpioSetup(strand.gpioNum, OUTPUT, LOW);
digitalLeds_addStrands(STRANDS, 1);
digitalLeds_resetPixels(STRANDS, 1);
delay(500);
P038_pixelRange(0, 4, 25, 25, 25);
#endif
break;
}
}
void P038_Show(){
switch(P038_driver){
case 1:
#ifdef USE_ADAFRUIT
if(Plugin_038_pixels){
Plugin_038_pixels->show();
}
#endif
break;
case 2:
#ifdef USE_FASTLED
FastLED.show();
#endif
break;
case 3:
#ifdef USE_ESP32RMTNEO
digitalLeds_drawPixels(STRANDS, 1);
delay(1); // mvdbro todo bug ? wordclock resettoback/write does not seem to work without this
#endif
break;
}
}
void P038_pixelRange(byte start, byte end, byte red, byte green , byte blue){
for (int i = start; i <= end; i++)
P038_pixel(i,red,green,blue,false);
P038_Show();
}
void P038_pixel(byte led, byte red, byte green , byte blue){
P038_pixel(led, red, green , blue, true);
}
void P038_pixel(byte led, byte red, byte green , byte blue, boolean update){
if(led >= P038_ledCount) // do not allow write outside allocated buffer!
return;
switch(P038_driver){
case 1:
#ifdef USE_ADAFRUIT
if(Plugin_038_pixels){
Plugin_038_pixels->setPixelColor(led, Plugin_038_pixels->Color(red,green,blue));
}
#endif
break;
case 2:
#ifdef USE_FASTLED
leds[led].r = red;
leds[led].g = green;
leds[led].b = blue;
#endif
break;
case 3:
#ifdef USE_ESP32RMTNEO
strand.pixels[led] = pixelFromRGB(red, green, blue);
#endif
break;
}
if(update)
P038_Show();
}
#endif // USES_P038
This is the part that needs some work. Maybe not even possible with the stock library. I'm not familiar with templates in C:
FastLED.addLeds<NEOPIXEL, 26>(leds, P038_ledCount); // NEOPIXEL module on grove for M5-Atom
FastLED.addLeds<NEOPIXEL, 27>(leds, P038_ledCount); // Built-in ATOM NEOPIXEL
FastLED.addLeds<NEOPIXEL, 32>(leds, P038_ledCount); // NEOPIXEL module on grove for M5-StickC