//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 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(countPixels, LEDPIN); _pGrb->Begin(); break; case NeoPixelType_Grbw: _pGrbw = new NeoPixelBrightnessBus(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* _pGrb; NeoPixelBrightnessBus* _pGrbw; void cleanup() { switch (_type) { case NeoPixelType_Grb: delete _pGrb ; _pGrb = NULL; break; case NeoPixelType_Grbw: delete _pGrbw; _pGrbw = NULL; break; } } }; #endif