Configuration extended and some more LED code improvements

This commit is contained in:
2026-02-03 21:16:51 +01:00
parent 3b6b97011b
commit dcac1f70df
9 changed files with 138 additions and 23 deletions

View File

@@ -93,3 +93,15 @@ void led_blink(uint8_t channel, uint8_t count, int16_t brightness, uint32_t inte
}
delay(interval_ms);
}
void led_set_mode() {
if (mode == 'C') {
ledcWrite(LEDC_LED_A, ledmode == 'N' ? led_brightness : 0); // Nightmode
ledcWrite(LEDC_LED_B, audiomode == 'D' ? led_brightness : 0); // Silence
ledcWrite(LEDC_LED_C, ap_enabled ? led_brightness : 0); // Accesspoint
} else {
ledcWrite(LEDC_LED_A, destination == 'A' ? led_brightness : 0);
ledcWrite(LEDC_LED_B, destination == 'B' ? led_brightness : 0);
ledcWrite(LEDC_LED_C, destination == 'C' ? led_brightness : 0);
}
}

View File

@@ -39,13 +39,15 @@ uint8_t loglevel = 5;
const char* wifi_ssid = "OBPKP61";
const char* wifi_pass = "keypad61";
bool ap_enabled = false;
bool ap_hidden = false;
bool ap_enabled = true;
unsigned long firstStart = 0;
unsigned long lastSensor = 0;
unsigned long lastPrint = 0;
unsigned long env_interval = 2000;
bool rgb_r = false;
bool rgb_g = false;
bool rgb_b = false;
@@ -58,7 +60,8 @@ RTC_DATA_ATTR char ledmode = 'D'; // (D)ay | (N)ight
RTC_DATA_ATTR char audiomode = 'E'; // (E)nabled | (D)isabled
RTC_DATA_ATTR char destination = 'A'; // A | B | C im RTC-Speicher überlebt deep sleep
uint buzzerpower = 50; // TBD make use of this
bool buz_enabled = true;
uint buzzerpower = 50; // TBD make use of this 0 .. 100%
uint8_t keycode[6]; // configurable keycodes
uint8_t longcode[6]; // configurable keycodes for long pressed keys
@@ -71,6 +74,7 @@ float hum = 0.0;
uint8_t nodeid; // NMEA2000 id on bus
Nmea2kTwai &NMEA2000=*(new Nmea2kTwai(CAN_TX, CAN_RX, CAN_RECOVERY_PERIOD));
tN2kDeviceList *pN2kDeviceList;
uint8_t n2k_id[3] = { 254, 254, 254 }; // aktuelle IDs für dest A, B, C
String processor(const String& var) {
// dummy for now
@@ -261,6 +265,8 @@ void setup() {
String apip = config.getString("apIp");
String apmask = config.getString("apMask");
env_interval = config.getShort("envInterval") * 1000;
// Setup webserver
WiFi.persistent(false);
WiFi.mode(WIFI_MODE_AP);
@@ -293,6 +299,15 @@ void setup() {
// NMEA2000 configuration
// Destinations setup, refresh in loop later
if (config.getString("n2kDestA") == "all") {
// broadcast
} else if (config.getString("n2kDestA") == "none") {
// disabled
} else {
// NAME
}
NMEA2000.SetN2kCANMsgBufSize(8);
NMEA2000.SetN2kCANReceiveFrameBufSize(250);
NMEA2000.SetN2kCANSendFrameBufSize(250);
@@ -492,6 +507,7 @@ void print_n2k_devicelist() {
}
// rename to: void sendSwitchBank()
// later: void send_switchbank(uint8_t keycode, uint8_t dest_id) {
void send_switchbank(uint8_t keycode) {
tN2kMsg N2kMsg;
tN2kBinaryStatus bankstatus;
@@ -505,9 +521,7 @@ void send_switchbank(uint8_t keycode) {
SetN2kPGN127502(N2kMsg, 0, bankstatus);
NMEA2000.SendMsg(N2kMsg);
Serial.print("PGN127502 sent: Switch=");
Serial.print(keycode);
Serial.println(" Action=On");
LOGI(TAG, "PGN127502 sent: Switch=%d", keycode);
}
void send_sensor_temphum(float temp_k, float hum_perc) {
@@ -546,7 +560,7 @@ void loop() {
ledcWrite(LEDC_LED_C, 0);
ledcWrite(LEDC_LED_A, led_brightness);
}
LOGI(TAG, "New destination=%s", destination);
LOGI(TAG, "New destination=%c", destination);
}
} else if (event.pressType == ButtonPressType::LONG) {
shortBeep();
@@ -560,6 +574,7 @@ void loop() {
ledcWrite(LEDC_RGBLED_B, 0);
LOGI(TAG, "Leaving config mode");
}
led_set_mode();
}
} else {
// normal button
@@ -584,29 +599,35 @@ void loop() {
if (ledmode == 'D') {
LOGI(TAG, "Night mode enabled");
ledmode = 'N';
ledcWrite(LEDC_LED_A, led_brightness);
} else {
LOGI(TAG, "Day mode enabled");
ledmode = 'D';
ledcWrite(LEDC_LED_A, 0);
}
break;
case BUTTON_2: // switch audio on/off
if (audiomode == 'E') {
LOGI(TAG, "Disabled audio");
audiomode = 'D';
ledcWrite(LEDC_LED_B, led_brightness);
} else {
LOGI(TAG, "Enabled audio");
audiomode = 'E';
ledcWrite(LEDC_LED_B, 0);
}
break;
case BUTTON_3: // switch accesspoint on/off
if (ap_enabled) {
ESP_LOGI(TAG, "Disable Accesspoint");
LOGI(TAG, "Disable Accesspoint");
WiFi.softAPdisconnect(true);
ap_enabled = false;
ledcWrite(LEDC_LED_C, 0);
} else {
Serial.println("Enable Accesspoint");
LOGI(TAG, "Enable Accesspoint");
WiFi.softAP(wifi_ssid, wifi_pass, WIFI_CHANNEL, ap_hidden, WIFI_MAX_STA);
ap_enabled = true;
ledcWrite(LEDC_LED_C, led_brightness);
}
break;
case BUTTON_4: // reserved
@@ -633,7 +654,7 @@ void loop() {
// NMEA2000.loop(); // not implemented yet
NMEA2000.ParseMessages();
if ((millis() - lastSensor >= 5000) and sht_available) {
if ((millis() - lastSensor >= env_interval) and sht_available) {
lastSensor = millis();
sht.read();
temp = sht.getTemperature(); // °C

View File

@@ -1,10 +1,12 @@
#include "main.h"
#include "config.h"
#include "webserver.h"
#include "led.h"
#include <map>
#include <AsyncTCP.h>
#include <ArduinoJson.h>
#include <esp32/clk.h> // for cpu frequency
#include "esp_rom_uart.h" // for uart wait idle
#include <Update.h>
// Logging
@@ -105,6 +107,7 @@ void webserver_init() {
StaticJsonDocument<1024> doc;
doc["systemName"] = config.getString("systemName");
doc["systemMode"] = String(config.getChar("systemMode"));
doc["nightMode"] = config.getBool("nightMode") ? "true" : "false";
doc["instDesc1"] = config.getString("instDesc1");
doc["instDesc2"] = config.getString("instDesc2");
doc["logLevel"] = loglevel;
@@ -119,10 +122,12 @@ void webserver_init() {
doc["apPassword"] = "********";
doc["stopApTime"] = config.getShort("stopApTime");
doc["apHidden"] = config.getBool("apHidden") ? "true" : "false";
doc["cpuSpeed"] = 160;
doc["cpuSpeed"] = config.getShort("cpuSpeed");
doc["tempFormat"] = String(config.getChar("tempFormat"));
doc["ledBrightness"] = led_brightness;
doc["rgbBrightness"] = rgb_brightness;
doc["ledBrightness"] = config.getShort("ledBrightness");
doc["rgbBrightness"] = config.getShort("rgbBrightness");
doc["buzEnable"] = config.getBool("buzEnable") ? "true" : "false";
doc["buzPower"] = config.getByte("buzPower");
doc["switchBank"] = config.getByte("switchBank");
doc["key1"] = keycode[BUTTON_1];
doc["key2"] = keycode[BUTTON_2];
@@ -136,6 +141,8 @@ void webserver_init() {
doc["key4long"] = longcode[BUTTON_4];
doc["key5long"] = longcode[BUTTON_5];
doc["key6long"] = longcode[BUTTON_6];
doc["n2kSysInst"] = config.getByte("n2kSysInst");
doc["n2kDevInst"] = config.getByte("n2kDevInst");
doc["n2kDestA"] = config.getString("n2kDestA");
doc["n2kDestB"] = config.getString("n2kDestB");
doc["n2kDestC"] = config.getString("n2kDestC");
@@ -145,6 +152,18 @@ void webserver_init() {
request->send(200, "application/json", out);
});
server.on("/api/reset", HTTP_GET, [](AsyncWebServerRequest *request) {
LOGD(TAG, "reset called");
StaticJsonDocument<100> doc;
doc["status"] = "OK";
String out;
serializeJson(doc, out);
request->send(200, "application/json", out);
led_blink(LEDC_RGBLED_G, 3, 4095, 500);
esp_rom_uart_tx_wait_idle(0);
ESP.restart();
});
server.on("/api/resetconfig", HTTP_GET, [](AsyncWebServerRequest *request) {
LOGD(TAG, "resetconfig called");
StaticJsonDocument<100> doc;
@@ -155,7 +174,7 @@ void webserver_init() {
});
server.on("/api/status", HTTP_GET, [](AsyncWebServerRequest *request) {
StaticJsonDocument<200> doc;
StaticJsonDocument<512> doc;
doc["version"] = VERSION;
int cpu_freq = esp_clk_cpu_freq() / 1000000;
doc["cpuspeed"] = String(cpu_freq) + "MHz";
@@ -179,6 +198,9 @@ void webserver_init() {
default:
doc["mode"] = "*unknown*";
}
doc["n2kDestA"] = config.getString("n2kDestA");
doc["n2kDestB"] = config.getString("n2kDestB");
doc["n2kDestC"] = config.getString("n2kDestC");
doc["status"] = "OK";
String out;
serializeJson(doc, out);