Last active
May 23, 2023 21:00
-
-
Save Aircoookie/fc0670a077eff1e7cfd4aa707b581214 to your computer and use it in GitHub Desktop.
Modified for 5050 PWM RGB leds
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//MODIFIED to drive 5050 RGB strip via PWM on GPIO 12(R),13(G),14(B), UNTESTED | |
//this code is a modified version of https://github.com/Makuna/NeoPixelBus/issues/103 | |
#ifndef NpbWrapper_h | |
#define NpbWrapper_h | |
//#define WORKAROUND_ESP32_BITBANG | |
//see https://github.com/Aircoookie/WLED/issues/2 for flicker free ESP32 support | |
//PIN CONFIGURATION | |
#define LEDPIN 2 //strip pin. Any for ESP32, gpio2 is recommended for ESP8266 | |
#define BTNPIN 0 //button pin. Needs to have pullup (gpio0 recommended) | |
#define IR_PIN 4 //infrared pin. | |
#define RLYPIN 15 //pin for relay, will be set HIGH if LEDs are on (-1 to disable). Also usable for standby leds, triggers,... | |
#define AUXPIN -1 //debug auxiliary output pin (-1 to disable) | |
#define RLYMDE 1 //mode for relay, 0: LOW if LEDs are on 1: HIGH if LEDs are on | |
//automatically uses the right driver method for each platform | |
#ifdef ARDUINO_ARCH_ESP32 | |
#ifdef WORKAROUND_ESP32_BITBANG | |
#define PIXELMETHOD NeoEsp32BitBangWs2813Method | |
#else | |
#define PIXELMETHOD NeoEsp32Rmt0Ws2812xMethod | |
#endif | |
#else //esp8266 | |
//you may change to DMA method on pin GPIO3 here | |
#define PIXELMETHOD NeoEsp8266Uart800KbpsMethod | |
//#define PIXELMETHOD NeoEsp8266Dma800KbpsMethod | |
#endif | |
//you can now change the color order in the web settings | |
#define PIXELFEATURE3 NeoGrbFeature | |
#define PIXELFEATURE4 NeoGrbwFeature | |
#include <NeoPixelBrightnessBus.h> | |
enum NeoPixelType | |
{ | |
NeoPixelType_None = 0, | |
NeoPixelType_Grb = 1, | |
NeoPixelType_Grbw = 2, | |
NeoPixelType_End = 3 | |
}; | |
class NeoPixelWrapper | |
{ | |
public: | |
NeoPixelWrapper() : | |
// initialize each member to null | |
_pGrb(NULL), | |
_pGrbw(NULL), | |
_type(NeoPixelType_None) | |
{ | |
} | |
~NeoPixelWrapper() | |
{ | |
cleanup(); | |
} | |
void Begin(NeoPixelType type, uint16_t countPixels) | |
{ | |
cleanup(); | |
_type = type; | |
switch (_type) { | |
case NeoPixelType_Grb: | |
_pGrb = new NeoPixelBrightnessBus<PIXELFEATURE3,PIXELMETHOD>(countPixels, LEDPIN); | |
_pGrb->Begin(); | |
break; | |
case NeoPixelType_Grbw: | |
_pGrbw = new NeoPixelBrightnessBus<PIXELFEATURE4,PIXELMETHOD>(countPixels, LEDPIN); | |
_pGrbw->Begin(); | |
break; | |
} | |
//init PWM pins | |
pinMode(12, OUTPUT); | |
pinMode(13, OUTPUT); | |
pinMode(14, OUTPUT); | |
} | |
void Show() | |
{ | |
#ifdef ARDUINO_ARCH_ESP32 | |
#ifdef WORKAROUND_ESP32_BITBANG | |
delay(1); | |
portDISABLE_INTERRUPTS(); //this is a workaround to prevent flickering (see https://github.com/adafruit/Adafruit_NeoPixel/issues/139) | |
#endif | |
#endif | |
switch (_type) { | |
case NeoPixelType_Grb: _pGrb->Show(); break; | |
case NeoPixelType_Grbw: _pGrbw->Show(); break; | |
} | |
#ifdef ARDUINO_ARCH_ESP32 | |
#ifdef WORKAROUND_ESP32_BITBANG | |
portENABLE_INTERRUPTS(); | |
#endif | |
#endif | |
} | |
bool CanShow() const | |
{ | |
switch (_type) { | |
case NeoPixelType_Grb: _pGrb->CanShow(); break; | |
case NeoPixelType_Grbw: _pGrbw->CanShow(); break; | |
} | |
} | |
void SetRGBPWM(uint16_t indexPixel, uint8_t r, uint8_t g, uint8_t b) | |
{ | |
if (indexPixel == 0) //5050 strip is first pixel | |
{ | |
analogWrite(12, r*4); | |
analogWrite(13, g*4); | |
analogWrite(14, b*4); | |
} | |
} | |
void SetPixelColor(uint16_t indexPixel, RgbColor color) | |
{ | |
SetRGBPWM(indexPixel, color.R, color.G, color.B); | |
switch (_type) { | |
case NeoPixelType_Grb: _pGrb->SetPixelColor(indexPixel, color); break; | |
case NeoPixelType_Grbw:_pGrbw->SetPixelColor(indexPixel, color); break; | |
} | |
} | |
void SetPixelColor(uint16_t indexPixel, RgbwColor color) | |
{ | |
SetRGBPWM(indexPixel, color.R, color.G, color.B); | |
switch (_type) { | |
case NeoPixelType_Grb: _pGrb->SetPixelColor(indexPixel, RgbColor(color.R,color.G,color.B)); break; | |
case NeoPixelType_Grbw: _pGrbw->SetPixelColor(indexPixel, color); break; | |
} | |
} | |
void SetBrightness(byte b) | |
{ | |
switch (_type) { | |
case NeoPixelType_Grb: _pGrb->SetBrightness(b); break; | |
case NeoPixelType_Grbw:_pGrbw->SetBrightness(b); break; | |
} | |
} | |
RgbColor GetPixelColor(uint16_t indexPixel) const | |
{ | |
switch (_type) { | |
case NeoPixelType_Grb: return _pGrb->GetPixelColor(indexPixel); break; | |
case NeoPixelType_Grbw: /*doesn't support it so we don't return it*/ break; | |
} | |
return 0; | |
} | |
// NOTE: Due to feature differences, some support RGBW but the method name | |
// here needs to be unique, thus GetPixeColorRgbw | |
RgbwColor GetPixelColorRgbw(uint16_t indexPixel) const | |
{ | |
switch (_type) { | |
case NeoPixelType_Grb: return _pGrb->GetPixelColor(indexPixel); break; | |
case NeoPixelType_Grbw: return _pGrbw->GetPixelColor(indexPixel); break; | |
} | |
return 0; | |
} | |
void ClearTo(RgbColor color) | |
{ | |
switch (_type) { | |
case NeoPixelType_Grb: _pGrb->ClearTo(color); break; | |
case NeoPixelType_Grbw:_pGrbw->ClearTo(color); break; | |
} | |
} | |
void ClearTo(RgbwColor color) | |
{ | |
switch (_type) { | |
case NeoPixelType_Grb: break; | |
case NeoPixelType_Grbw:_pGrbw->ClearTo(color); break; | |
} | |
} | |
private: | |
NeoPixelType _type; | |
// have a member for every possible type | |
NeoPixelBrightnessBus<PIXELFEATURE3,PIXELMETHOD>* _pGrb; | |
NeoPixelBrightnessBus<PIXELFEATURE4,PIXELMETHOD>* _pGrbw; | |
void cleanup() | |
{ | |
switch (_type) { | |
case NeoPixelType_Grb: delete _pGrb ; _pGrb = NULL; break; | |
case NeoPixelType_Grbw: delete _pGrbw; _pGrbw = NULL; break; | |
} | |
} | |
}; | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Trying this, but...
exit status 1
'NeoEsp32RmtWS2813_V3Method' was not declared in this scope
Do I need another file?