Skip to content
Merged
5 changes: 3 additions & 2 deletions include/Globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
#define LDR_DIVIDER 4096
#endif
#define SERIAL_SIZE_RX 2048
#define CONFIG_NUM_PARAMS 20
#define CONFIG_NUM_PARAMS 21
#define CONFIG_PREFIX_LENGTH 6
// This value must meet the one in Firefly Luciferin
// We are transferring byte via Serial, the maximum decimal number that can be represented with 1 byte is 255.
Expand All @@ -56,7 +56,7 @@ extern class Globals globals;
extern byte config[CONFIG_NUM_PARAMS];
extern byte pre[CONFIG_PREFIX_LENGTH];
extern uint8_t prefix[], hi, lo, chk, loSecondPart, usbBrightness, gpio, baudRate, whiteTemp, fireflyEffect,
fireflyColorMode, fireflyColorOrder, ldrEn, ldrTo, ldrInt, ldrMn, ldrAction, relaySerialPin, sbSerialPin, ldrSerialPin, gpioClock;
fireflyColorMode, fireflyColorOrder, ldrEn, ldrTo, ldrInt, ldrMn, ldrAction, relaySerialPin, relayInvPin, sbSerialPin, ldrSerialPin, gpioClock;

enum class Effect {
GlowWormWifi, GlowWorm, solid, fire, twinkle, bpm, rainbow, chase_rainbow, solid_rainbow, slowRainbow, randomColors,
Expand Down Expand Up @@ -96,6 +96,7 @@ const String BAUDRATE_FILENAME = "baudrate.json";
extern bool ldrReading;
extern int ldrValue;
extern bool ldrEnabled;
extern bool relInv;
extern uint8_t ldrInterval;
extern bool ldrTurnOff;
extern uint8_t ldrMin;
Expand Down
4 changes: 3 additions & 1 deletion include/LedManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ class LedManager {
const String MIN_LDR_PARAM = "minLdr";
const String MAX_LDR_PARAM = "maxLdr";
const String RELAY_PIN_PARAM = "relayPin";
const String RELAY_INV_PARAM = "relayInv";
const String RELAY_INV = "relayInv";
const String SB_PIN_PARAM = "sbPin";
const String LDR_PIN_PARAM = "ldrPin";
const String EFFECT_FILENAME = "effect.json";
Expand Down Expand Up @@ -130,7 +132,7 @@ class LedManager {

void setLdr(int maxLdr);

void setPins(uint8_t relayPinParam, uint8_t sbPinParam, uint8_t ldrPinParam);
void setPins(uint8_t relayPinParam, uint8_t sbPinParam, uint8_t ldrPinParam, bool relInv);

void flushSerial();

Expand Down
2 changes: 1 addition & 1 deletion include/Version.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
#define VERSION "5.21.3"
#endif
#ifndef BUILD_TIMESTAMP
#define BUILD_TIMESTAMP "2025-04-06 09:15:45.340060"
#define BUILD_TIMESTAMP "2025-08-09 14:31:39.066602"
#endif

2 changes: 1 addition & 1 deletion include/WebSettings.h

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ platform_esp8266 = espressif8266@4.2.1
f_cpu_esp8266 = 160000000L
monitor_filters_esp8266 = esp8266_exception_decoder

platform_esp32 = espressif32@6.10.0
platform_esp32 = espressif32@6.11.0
monitor_filters_esp32 = esp32_exception_decoder

framework = arduino
Expand All @@ -24,8 +24,8 @@ extra_scripts =
pre:platformio_version_increment/version_increment_pre.py
post:platformio_version_increment/version_increment_post.py
lib_deps =
makuna/NeoPixelBus@2.8.3
bblanchon/ArduinoJson@7.3.1
makuna/NeoPixelBus@2.8.4
bblanchon/ArduinoJson@7.4.2
knolleary/PubSubClient@2.8.0
;https://github.com/Makuna/NeoPixelBus.git#master
lib_extra_dirs = arduino_bootstrapper
Expand Down
8 changes: 5 additions & 3 deletions src/Globals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Globals globals;
byte config[CONFIG_NUM_PARAMS];
byte pre[CONFIG_PREFIX_LENGTH];
uint8_t prefix[] = {'D', 'P', 's', 'o', 'f', 't'}, hi, lo, chk, loSecondPart, usbBrightness, gpio, baudRate, whiteTemp,
fireflyEffect, fireflyColorMode, fireflyColorOrder, ldrEn, ldrTo, ldrInt, ldrMn, ldrAction, relaySerialPin, sbSerialPin, ldrSerialPin, gpioClock;
fireflyEffect, fireflyColorMode, fireflyColorOrder, ldrEn, ldrTo, ldrInt, ldrMn, ldrAction, relaySerialPin, relayInvPin, sbSerialPin, ldrSerialPin, gpioClock;
uint8_t whiteTempInUse = WHITE_TEMP_CORRECTION_DISABLE;
uint8_t colorMode = 1;
uint8_t colorOrder = 1;
Expand Down Expand Up @@ -62,6 +62,7 @@ bool breakLoop = false;
bool ldrReading = false;
int ldrValue;
bool ldrEnabled = false;
bool relInv = false;
uint8_t ldrInterval = 30;
bool ldrTurnOff = false;
uint8_t ldrMin = 20;
Expand Down Expand Up @@ -238,7 +239,7 @@ void Globals::setBaudRate(int bdRate) {
void Globals::turnOnRelay() {
if (!relayState) {
relayState = true;
digitalWrite(relayPin, HIGH);
digitalWrite(relayPin, relInv ? LOW : HIGH);
delay(10);
}
}
Expand All @@ -250,7 +251,7 @@ void Globals::turnOffRelay() {
if (relayState) {
relayState = false;
delay(10);
digitalWrite(relayPin, LOW);
digitalWrite(relayPin, relInv ? HIGH : LOW);
}
}

Expand Down Expand Up @@ -301,6 +302,7 @@ void Globals::sendSerialInfo() {
Serial.printf("ldr:%d\n", ((ldrValue * 100) / ldrDivider));
}
Serial.printf("relayPin:%d\n", relayPin);
Serial.printf("relInv:%d\n", relInv);
Serial.printf("sbPin:%d\n", sbPin);
Serial.printf("ldrPin:%d\n", ldrPin);
Serial.flush();
Expand Down
12 changes: 9 additions & 3 deletions src/GlowWormLuciferin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ void setup() {
String ldrMinFromStorage = bootstrapManager.readValueFromFile(ledManager.LDR_FILENAME, ledManager.MIN_LDR_PARAM);
String ldrMaxFromStorage = bootstrapManager.readValueFromFile(ledManager.LDR_CAL_FILENAME, ledManager.MAX_LDR_PARAM);
String relayPinFromStorage = bootstrapManager.readValueFromFile(ledManager.PIN_FILENAME, ledManager.RELAY_PIN_PARAM);
String relayInvStorage = bootstrapManager.readValueFromFile(ledManager.PIN_FILENAME, ledManager.RELAY_INV);
String sbPinFromStorage = bootstrapManager.readValueFromFile(ledManager.PIN_FILENAME, ledManager.SB_PIN_PARAM);
String ldrPinFromStorage = bootstrapManager.readValueFromFile(ledManager.PIN_FILENAME, ledManager.LDR_PIN_PARAM);
if (!ldrFromStorage.isEmpty() && ldrFromStorage != ERROR) {
Expand All @@ -141,6 +142,9 @@ void setup() {
if (!relayPinFromStorage.isEmpty() && relayPinFromStorage != ERROR) {
relayPin = relayPinFromStorage.toInt();
}
if (!relayInvStorage.isEmpty() && relayInvStorage != ERROR) {
relInv = relayInvStorage.toInt();
}
if (!sbPinFromStorage.isEmpty() && sbPinFromStorage != ERROR) {
sbPin = sbPinFromStorage.toInt();
}
Expand Down Expand Up @@ -314,14 +318,15 @@ void mainLoop() {
fireflyColorMode = config[i++];
fireflyColorOrder = config[i++];
relaySerialPin = config[i++];
relayInvPin = config[i++];
sbSerialPin = config[i++];
ldrSerialPin = config[i++];
gpioClock = config[i++];
chk = config[i++];
if (!(!breakLoop &&
(chk != (hi ^ lo ^ loSecondPart ^ usbBrightness ^ gpio ^ baudRate ^ whiteTemp ^ fireflyEffect
^ ldrEn ^ ldrTo ^ ldrInt ^ ldrMn ^ ldrAction ^ fireflyColorMode ^ fireflyColorOrder
^ relaySerialPin ^ sbSerialPin ^ ldrSerialPin ^ gpioClock ^ 0x55)))) {
^ relaySerialPin ^ relayInvPin ^ sbSerialPin ^ ldrSerialPin ^ gpioClock ^ 0x55)))) {
if (!breakLoop) {
#ifdef TARGET_GLOWWORMLUCIFERINLIGHT
if (!relayState) {
Expand Down Expand Up @@ -359,11 +364,12 @@ void mainLoop() {
relaySerialPin = relaySerialPin - 10;
sbSerialPin = sbSerialPin - 10;
ldrSerialPin = ldrSerialPin - 10;
if ((relayPin != relaySerialPin) || (sbPin != sbSerialPin) || (ldrPin != ldrSerialPin)) {
if ((relayPin != relaySerialPin) || (sbPin != sbSerialPin) || (ldrPin != ldrSerialPin) || (relayInvPin == 10 && relInv) || (relayInvPin == 11 && !relInv)) {
relayPin = relaySerialPin;
sbPin = sbSerialPin;
ldrPin = ldrSerialPin;
ledManager.setPins(relayPin, sbPin, ldrPin);
relInv = relayInvPin == 11;
ledManager.setPins(relayPin, sbPin, ldrPin, relInv);
}
}
uint16_t numLedFromLuciferin = lo + (loSecondPart * SERIAL_CHUNK_SIZE) + 1;
Expand Down
4 changes: 3 additions & 1 deletion src/LedManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -788,13 +788,15 @@ void LedManager::setLdr(int maxLdr) {
* @param ldrTurnOffToSet Turn off LEDs before LDR readings
* @param ldrIntervalToSet Interval between readings
* @param minLdr min brightness when using LDR
* @param relInv relay iverted
*/
void LedManager::setPins(uint8_t relayPinParam, uint8_t sbPinParam, uint8_t ldrPinParam) {
void LedManager::setPins(uint8_t relayPinParam, uint8_t sbPinParam, uint8_t ldrPinParam, bool relInv) {
Serial.println(F("CHANGING PINs"));
JsonDocument ldrDoc;
ldrDoc[RELAY_PIN_PARAM] = relayPinParam;
ldrDoc[SB_PIN_PARAM] = sbPinParam;
ldrDoc[LDR_PIN_PARAM] = ldrPinParam;
ldrDoc[RELAY_INV] = relInv;
BootstrapManager::writeToLittleFS(ldrDoc, PIN_FILENAME);
delay(200);
#if defined(ARDUINO_ARCH_ESP32)
Expand Down
27 changes: 21 additions & 6 deletions src/NetManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,8 @@ void NetManager::listenOnHttpGet() {
prefsData += ldrMin;
prefsData += F("\",\"relayPin\":\"");
prefsData += relayPin;
prefsData += F("\",\"relInv\":\"");
prefsData += relInv;
prefsData += F("\",\"sbPin\":\"");
prefsData += sbPin;
prefsData += F("\",\"ldrPin\":\"");
Expand Down Expand Up @@ -776,7 +778,7 @@ bool NetManager::processFirmwareConfig() {
int ldrPinParam = (int) bootstrapManager.jsonDoc[ledManager.LDR_PIN_PARAM];
if (ldrPin != ldrPinParam) {
ldrPin = ldrPinParam;
ledManager.setPins(relayPin, sbPin, ldrPin);
ledManager.setPins(relayPin, sbPin, ldrPin, relInv);
ledManager.reinitLEDTriggered = true;
}
}
Expand All @@ -785,7 +787,16 @@ bool NetManager::processFirmwareConfig() {
int relayPinParam = (int) bootstrapManager.jsonDoc[ledManager.RELAY_PIN_PARAM];
if (relayPin != relayPinParam) {
relayPin = relayPinParam;
ledManager.setPins(relayPin, sbPin, ldrPin);
ledManager.setPins(relayPin, sbPin, ldrPin, relInv);
ledManager.reinitLEDTriggered = true;
}
}
// INVERTED RELAY
if (bootstrapManager.jsonDoc[ledManager.RELAY_INV_PARAM].is<JsonVariant>()) {
bool relayInvParam = bootstrapManager.jsonDoc[ledManager.RELAY_INV_PARAM];
if (relInv != relayInvParam) {
relInv = relayInvParam;
ledManager.setPins(relayPin, sbPin, ldrPin, relInv);
ledManager.reinitLEDTriggered = true;
}
}
Expand All @@ -794,7 +805,7 @@ bool NetManager::processFirmwareConfig() {
int sbrPinParam = (int) bootstrapManager.jsonDoc[ledManager.SB_PIN_PARAM];
if (sbPin != sbrPinParam) {
sbPin = sbrPinParam;
ledManager.setPins(relayPin, sbPin, ldrPin);
ledManager.setPins(relayPin, sbPin, ldrPin, relInv);
ledManager.reinitLEDTriggered = true;
}
}
Expand Down Expand Up @@ -916,7 +927,8 @@ void NetManager::sendStatus() {
if (effect == Effect::GlowWorm || effect == Effect::GlowWormWifi) {
fpsData = F("{\"deviceName\":\"");
fpsData += deviceName;
fpsData += F("\",\"state\":\"");
fpsData += "\",\"color\": { \"r\": 255, \"g\": 190, \"b\": 140 }"; // Default for bias light
fpsData += F(",\"state\":\"");
fpsData += (ledManager.stateOn) ? ON_CMD : OFF_CMD;
fpsData += F("\",\"brightness\":");
fpsData += brightness;
Expand Down Expand Up @@ -951,8 +963,8 @@ void NetManager::sendStatus() {
} else {
bootstrapManager.jsonDoc.clear();
JsonObject root = bootstrapManager.jsonDoc.to<JsonObject>();
JsonObject color = root["color"].to<JsonObject>();
root[F("state")] = (ledManager.stateOn) ? ON_CMD : OFF_CMD;
JsonObject color = root["color"].to<JsonObject>();
color[F("r")] = ledManager.red;
color[F("g")] = ledManager.green;
color[F("b")] = ledManager.blue;
Expand All @@ -972,6 +984,7 @@ void NetManager::sendStatus() {
root[F("ldr")] = ((ldrValue * 100) / ldrDivider);
}
root[F("relayPin")] = relayPin;
root[F("relayInv")] = relInv;
root[F("sbPin")] = sbPin;
root[F("ldrPin")] = ldrPin;
root[BAUDRATE_PARAM] = baudRateInUse;
Expand Down Expand Up @@ -1127,8 +1140,10 @@ bool NetManager::processLDR() {
String ldrMinMqtt = bootstrapManager.jsonDoc[F("ldrMin")];
String ldrActionMqtt = bootstrapManager.jsonDoc[F("ldrAction")];
String rPin = bootstrapManager.jsonDoc[F("relayPin")];
String rInvStr = bootstrapManager.jsonDoc[F("relInv")];
String sPin = bootstrapManager.jsonDoc[F("sbPin")];
String lPin = bootstrapManager.jsonDoc[F("ldrPin")];
relInv = rInvStr == "true";
ldrEnabled = ldrEnabledMqtt == "true";
ldrTurnOff = ldrTurnOffMqtt == "true";
ldrInterval = ldrIntervalMqtt.toInt();
Expand All @@ -1154,7 +1169,7 @@ bool NetManager::processLDR() {
relayPin = rPin.toInt();
sbPin = sPin.toInt();
ldrPin = lPin.toInt();
ledManager.setPins(relayPin, sbPin, ldrPin);
ledManager.setPins(relayPin, sbPin, ldrPin, relInv);
}
delay(DELAY_500);
startUDP();
Expand Down