neues Module SKP, Übertragung der Signalleuchte zustand von Winde an SKP
build_release.yaml / Build heltec_wifi_lora_32_V3_sailplane (push) Successful in 4m31s
build_release.yaml / Build heltec_wifi_lora_32_V3_skp (push) Successful in 2m53s
build_release.yaml / Build heltec_wifi_lora_32_V3_winde (push) Successful in 3m19s
build_release.yaml / Release (push) Successful in 11s

This commit is contained in:
FCS committed 2026-08-30 12:40:52 +02:00
1 parent f468f09ad2
commit 16e2851696
7 files changed
+237 -46

No files matched your search

+160 -32
View File
@@ -22,17 +22,87 @@ bool sensors_ready = false;
SX1262 radio = new Module(LORA_NSS, LORA_DIO1, LORA_NRST, LORA_BUSY);
bool radio_ready = false;
String nmea_checksum(String str)
{
byte cs = 0;
for (unsigned int n = 1; n < str.length(); n++)
{
if (str[n] == '*')
break;
cs ^= str[n];
}
if (cs < 0x10)
return "*0" + String(cs, HEX);
else
return "*" + String(cs, HEX);
}
#ifdef DEVICE_WINDE
volatile bool receivedFlag = false;
bool warning_light_active = false;
bool last_warning_light_state = false;
unsigned long last_warning_light_tx_ms = 0UL;
#if defined(ESP8266) || defined(ESP32)
ICACHE_RAM_ATTR
#endif
void setFlag(void)
{
// we got a packet, set the flag
receivedFlag = true;
}
bool read_warning_light_voltage()
{
int raw = analogRead(WARN_LIGHT_SENSE_PIN);
return raw > WARN_LIGHT_DETECT_THRESHOLD;
}
void send_warning_light_state(bool active)
{
String payload = "$PWTLW," + String(active ? "1" : "0");
payload += nmea_checksum(payload);
Serial.println(payload);
int state = radio.transmit(payload);
if (state != RADIOLIB_ERR_NONE)
{
Serial.print("Warnleuchte Status senden fehlgeschlagen, code ");
Serial.println(state);
}
}
#endif
#ifdef DEVICE_SKP
volatile bool skpReceivedFlag = false;
bool relay_active = false;
unsigned long relay_off_deadline = 0UL;
unsigned long last_valid_warning_ms = 0UL;
#if defined(ESP8266) || defined(ESP32)
ICACHE_RAM_ATTR
#endif
void skpSetFlag(void)
{
skpReceivedFlag = true;
}
void set_relay_state(bool active)
{
relay_active = active;
digitalWrite(RELAY_PIN, active ? HIGH : LOW);
if (active)
relay_off_deadline = millis() + RELAY_PULSE_MS;
else
relay_off_deadline = 0UL;
}
void trigger_relay_pulse()
{
last_valid_warning_ms = millis();
if (relay_active)
digitalWrite(RELAY_PIN, LOW);
delay(20);
set_relay_state(true);
}
#endif
#ifdef HELTEC_WIFI_LORA_32_V3
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, OLED_RST, OLED_CLK, OLED_DATA);
@@ -66,6 +136,29 @@ void setup()
Serial.println(state);
Serial.println(F("Webinterface bleibt verfuegbar"));
}
#ifdef DEVICE_WINDE
pinMode(WARN_LIGHT_SENSE_PIN, INPUT);
analogReadResolution(12);
analogSetPinAttenuation(WARN_LIGHT_SENSE_PIN, ADC_11db);
last_warning_light_state = read_warning_light_voltage();
#endif
#ifdef DEVICE_SKP
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
relay_active = false;
last_valid_warning_ms = millis();
radio.setPacketReceivedAction(skpSetFlag);
if (radio_ready)
{
state = radio.startReceive();
if (state != RADIOLIB_ERR_NONE)
{
Serial.print(F("SKP Receive failed, code "));
Serial.println(state);
radio_ready = false;
}
}
#endif
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB14_tr);
@@ -105,21 +198,6 @@ void setup()
u8g2.sendBuffer();
}
String nmea_checksum(String str)
{
byte cs = 0;
for (unsigned int n = 1; n < str.length(); n++)
{
if (str[n] == '*')
break;
cs ^= str[n];
}
if (cs < 0x10)
return "*0" + String(cs, HEX);
else
return "*" + String(cs, HEX);
}
void draw_rssi(int Rssi){
u8g2.drawFrame(102,8,4,3);
u8g2.drawFrame(107,6,4,5);
@@ -222,22 +300,6 @@ String getSplitValue(String data, char separator, int index)
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
#ifdef DEVICE_WINDE
void decode_start(String data)
{
data_from = getSplitValue(data, ',', 1);
data_speed = (getSplitValue(data, ',', 2)).toInt();
data_min = (getSplitValue(data, ',', 3)).toInt();
data_max = (getSplitValue(data, ',', 4)).toInt();
}
void decode_airborn(String data)
{
data_from = getSplitValue(data, ',', 1);
data_speed = 0;
data_min = 0;
data_max = 0;
}
bool valid_nmea(String data)
{
@@ -256,6 +318,23 @@ bool valid_nmea(String data)
return received_checksum == expected_checksum;
}
#ifdef DEVICE_WINDE
void decode_start(String data)
{
data_from = getSplitValue(data, ',', 1);
data_speed = (getSplitValue(data, ',', 2)).toInt();
data_min = (getSplitValue(data, ',', 3)).toInt();
data_max = (getSplitValue(data, ',', 4)).toInt();
}
void decode_airborn(String data)
{
data_from = getSplitValue(data, ',', 1);
data_speed = 0;
data_min = 0;
data_max = 0;
}
bool decode_msg(String data)
{
String pos1 = getSplitValue(data, ',', 0);
@@ -281,6 +360,55 @@ bool decode_msg(String data)
void loop()
{
webinterface_handle();
#ifdef DEVICE_WINDE
bool current_warning_light_state = read_warning_light_voltage();
if (current_warning_light_state != last_warning_light_state)
{
last_warning_light_state = current_warning_light_state;
last_warning_light_tx_ms = millis();
send_warning_light_state(current_warning_light_state);
}
#endif
#ifdef DEVICE_SKP
if (relay_active && millis() >= relay_off_deadline)
{
set_relay_state(false);
}
if (radio_ready && skpReceivedFlag)
{
skpReceivedFlag = false;
String str;
int state = radio.readData(str);
if (state == RADIOLIB_ERR_NONE)
{
if (!valid_nmea(str))
{
Serial.println("Ungueltige SKP-Nachricht");
}
else if (getSplitValue(str, ',', 0) == "$PWTLW")
{
String status_field = getSplitValue(str, ',', 1);
status_field.trim();
bool warning_active = status_field == "1" || status_field == "ON" || status_field == "true";
if (warning_active)
{
trigger_relay_pulse();
Serial.println("Warnleuchte aktiv -> Relais an");
}
else
{
set_relay_state(false);
last_valid_warning_ms = millis();
Serial.println("Warnleuchte inaktiv -> Relais aus");
}
}
}
}
if (millis() - last_valid_warning_ms > WARNING_TIMEOUT_MS)
{
set_relay_state(false);
}
#endif
#ifdef DEVICE_SAILPLANE
if (!sensors_ready)
{