fishtankmonitor/Lighting.h

69 lines
No EOL
1.8 KiB
C++

#include <FastLED.h>
#include "NaturalLight.h"
#include "Weather.h"
DEFINE_GRADIENT_PALETTE(_sunrise_p) {
0, 0, 0, 0,
8, 0, 0, 16,
128, 255, 128, 0,
224, 255, 255, 0,
240, 255, 255, 255, // Hack to get around LINEARBLEND problem (for now, hopefully)
255, 255, 255, 255
};
class Lighting {
int _ledCount, _whitePin, _rPin, _gPin, _bPin;
NaturalLight* _naturalLight;
Weather* _weather;
float _cloudCoverLimit;
CRGB* _leds;
CRGBPalette16 _sunrise = _sunrise_p;
long _nextLightningFlash = 0;
float _heatIndex;
float _brightness;
byte _lastHeatIndex, _lastBrightness;
bool _useStrip, _usePWM;
float _currentHeatIndex();
float getIndexMultiplier(int now, int startTime, int endTime, bool swap);
float getHeatIndex(int time);
float getPaletteHeatIndex(int time);
float getBrightness();
float getPaletteBrightness();
int byteToAnalogue(byte input);
void outputColour(CRGB colour);
void updateRGB(int now);
void updateWhite();
public:
Lighting(NaturalLight* _naturalLight, Weather* _weather, float cloudCoverLimit);
template<uint8_t DATA_PIN, int LED_COUNT, int WHITE_PIN> void setupStrip() {
_ledCount = LED_COUNT;
FastLED.addLeds<WS2811, DATA_PIN, GRB>(_leds, _ledCount).setCorrection(TypicalSMD5050).setTemperature(Tungsten40W);
_whitePin = WHITE_PIN;
pinMode(_whitePin, OUTPUT);
analogWrite(_whitePin, 0);
_useStrip = true;
}
template<int R_PIN, int G_PIN, int B_PIN, int WHITE_PIN> void setupPWM() {
_rPin = R_PIN;
_gPin = G_PIN;
_bPin = B_PIN;
_whitePin = WHITE_PIN;
pinMode(_rPin, OUTPUT);
pinMode(_gPin, OUTPUT);
pinMode(_bPin, OUTPUT);
pinMode(_whitePin, OUTPUT);
analogWrite(_rPin, 0);
analogWrite(_gPin, 0);
analogWrite(_bPin, 0);
analogWrite(_whitePin, 0);
_usePWM = true;
}
void update(int time);
float getCurrentHeatIndex() { return _heatIndex; }
float getCurrentBrightness() { return _brightness; }
};