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
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:
1 parent
f468f09ad2
commit
16e2851696
7 files changed
+237
-46
No files matched your search
+160
-32
@@ -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)
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user