Hallo Leute,
bisher war ich hier nur stiller Mitleser, hab mir Code Schnipsel "geklaut" und damit meine Sachen realisieren können.
In einem Sketch hab ich das Problem, dass ständig ein "Soft WDT reset" passiert.
Ich habe einen bisher schon funktionsfähigen Sketch um etwas erweitern wollen. Und zwar um die ESPnow Funktion. Dabei ist der ESP der ständig neu startet der Empfänger der Nachricht.
Kurz zusammengefasst was der ESP machen soll.
Ich hab am ESP ein Relais. Diese wiederum hängt am Garagentoröffner.
Bisher konnte ich per Telegram Bot die Garage öffnen.
Jetzt wollte ich noch das öffnen per RFID hinzufügen.
Und da hakt es :-/
Ich hab auch die Stelle gefunden, verstehe es aber nicht.
Ggf. kann mir jemand den notwendigen Gedankenstoß geben
Der Fehler tritt in der Funktion "void recive" auf, und zwar dann, wenn das Relais das erste mal geschaltet wurde.
und dann, zack, der ESP startet neu
Hier mal der gesamte Code
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoOTA.h>
// Wifi network station credentials
#define WIFI_SSID "
#define WIFI_PASSWORD "
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN ""
const unsigned long BOT_MTBS = 1000; // mean time between scan messages
const int GarageRechts = 13; //Pin D7 = GPIO 13 // linkes Relais (da spiegelverkehrt)
const int GarageLinks = 4; //Pin für Garage links, D2 als GPIO 4 //rechtes Relais, da spiegelverkehrt
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
unsigned long bot_lasttime; // last time messages' scan has been done
int ledStatus = 0;
String chat_id = "";
String woher = "";
// Bnoetgte Bibliotheken
#include <ESP8266WiFi.h>
#include <espnow.h>
// struct welches durch ESPnow übertragen wird
// Muss mit Empfaenger uebereinstimmen
typedef struct message {
long number;
// Speicher reserviert
char string[64];
} message;
// Erzeuge struct
message myMessage;
const char* host = "OTA-Garage";
void handleNewMessages(int numNewMessages) {
Serial.println("handleNewMessages");
Serial.println(String(numNewMessages));
for (int i = 0; i < numNewMessages; i++) {
// String chat_id = bot.messages[i].chat_id;
chat_id = bot.messages[i].chat_id;
String text = bot.messages[i].text;
Serial.println(chat_id);
Serial.println(text);
String from_name = bot.messages[i].from_name;
if (from_name == "")
from_name = "Gast";
if (text == "/rechts") {
woher = "Telegram";
schalteRechts();
}
if (text == "/links") {
woher = "Telegram";
schalteLinks();
}
if (text == "/beide") {
woher = "Telegram";
schalteBeide();
}
if (text == "/status") {
//nix
}
if (text == "/options") {
String keyboardJson = "[[\"/links\", \"/rechts\"], [\"/beide\", \"/status\"]]";
bot.sendMessageWithReplyKeyboard(chat_id, "eine der Optionen auswählen", "", keyboardJson, true);
}
if (text == "/start") {
String welcome = "willkommen " + from_name + " im Garagen Chat.\n";
bot.sendMessage(chat_id, welcome, "Markdown");
}
}
}
void setup() {
Serial.begin(115200);
// attempt to connect to Wifi network:
Serial.print("Connecting to Wifi SSID ");
Serial.print(WIFI_SSID);
Serial.print(" ");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("WiFi connected. IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Retrieving time: ");
configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
time_t now = time(nullptr);
while (now < 24 * 3600) {
Serial.print(".");
delay(100);
now = time(nullptr);
}
Serial.println(now);
pinMode(GarageRechts, OUTPUT);
pinMode(GarageLinks, OUTPUT);
digitalWrite(GarageRechts, HIGH);
digitalWrite(GarageLinks, HIGH);
bot.sendMessageWithReplyKeyboard(chat_id, "", "", keyboardJson, true);
bot.sendMessage(chat_id, "ESP wurde neu gestartet", "");
// Gibt MAC-Adresse aus
Serial.print("MAC Address: ");
Serial.println(WiFi.macAddress());
// Setze Geraet in Station mode
WiFi.mode(WIFI_STA);
// Init ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
}
// Setze Rolle
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
// Sezte Callback Funktion
esp_now_register_recv_cb(recive);
//neu Funktionen für den OTA UPdate Server
ArduinoOTA.setHostname(host);
ArduinoOTA.onStart([]() { // wird ausgeführt, wenn das Update ausgeführt wird
});
ArduinoOTA.onEnd([]() { // do a fancy thing with our board led at end
});
ArduinoOTA.onError([](ota_error_t error) {
(void)error;
ESP.restart();
});
/* setup the OTA server */
ArduinoOTA.begin();
Serial.println("OTA Update Server Ready");
Serial.println(WiFi.localIP());
}
void loop() {
ArduinoOTA.handle();
if (millis() - bot_lasttime > BOT_MTBS) {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while (numNewMessages) {
//Serial.println("got response");
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
bot_lasttime = millis();
}
if (WiFi.status() != WL_CONNECTED) {
Wiederaufnahme_WLAN();
}
}
void Wiederaufnahme_WLAN() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
}
// Diese Funktion wird aufgerufen wenn Daten empfangen werden
void recive(uint8_t* incommingMacAddress, uint8_t* incomingData, uint8_t len) {
// Daten umkopieren um ggf. spaeter nutzen zu koennen
memcpy(&myMessage, incomingData, sizeof(myMessage));
// Daten ausgeben
Serial.print("Number: ");
Serial.println(myMessage.number);
Serial.print("String: ");
Serial.println(myMessage.string);
Serial.println();
woher = "RFID";
schalteRechts();
}
void schalteRechts() {
digitalWrite(GarageRechts, LOW);
delay(1000);
digitalWrite(GarageRechts, HIGH);
delay(1000);
bot.sendMessage(chat_id, "Garage rechts wird über " + woher + " geschaltet", "");
woher = "";
}
void schalteLinks() {
digitalWrite(GarageLinks, LOW);
delay(1000);
digitalWrite(GarageLinks, HIGH);
delay(1000);
bot.sendMessage(chat_id, "Garage links wird über " + woher + " geschaltet", "");
woher = "";
}
void schalteBeide() {
digitalWrite(GarageLinks, LOW);
digitalWrite(GarageRechts, LOW);
delay(1000);
digitalWrite(GarageLinks, HIGH);
digitalWrite(GarageRechts, HIGH);
delay(1000);
bot.sendMessage(chat_id, "beide Garagen über " + woher + " geschaltet", "");
woher = "";
}