Hardware: Arduino Mega 2560 + W5100 Eth-Shield
MQTT-Broker: Home Assistant - Mosquitto - MQTT Protocol 3.1.1
Folgender Code sendet alle 1000ms (wie in am2_lebenszeichen_interval konfiguriert) erfolgreich(!) den wechselnden Status von am2/lebenszeichen (on/off)
Aber: ca. alle 8 Sek. wird die Verbindung zum MQTT-Broker neu aufgebaut, weil wohl aus irgendeinem Grund "if (!client.connected())" als false ausgewertet wird.
Das wirklich merkwürdige daran: an einem anderen Arduino Mega 2560 läuft ein ähnlicher Code anstandsfrei.
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <Arduino.h>
//----------------------------------
// DEBUG
//----------------------------------
bool debug = true; // Meldungen aus loop() auf seriellem Monitor ausgeben (true/false) - Meldungen aus setup() werden aber immer ausgegeben.
//----------------------------------
// BUZZER
//----------------------------------
const int buzzer = 9; // Pin, an dem der Buzzer (Lautsprecher) angeschlossen ist
//----------------------------------
// LAN SHIELD & MQTT
//----------------------------------
byte mac[] = { 0xZZ, 0xZZ, 0xZZ, 0xZZ, 0xZZ, 0xZZ }; // MAC-Adresse des LAN-Shields, set it manually!
IPAddress ip(192, ZZ, ZZ, ZZ); // IP-Adresse des LAN-Shields
IPAddress MQTTserver(192, ZZ, ZZ, ZZ); // IP Home Assistant / Mosqitto Broker
int MQTTport = ZZ;
EthernetClient ethClient;
PubSubClient client(MQTTserver, MQTTport, ethClient);
//----------------------------------
// MQTT Lebenszeichen
//----------------------------------
String MQTT_am2_is_alive="off";
unsigned long previousMillis_lebenszeichen = 0;
const long am2_lebenszeichen_interval = 1000; // [x] nach wieviel ms soll MQTT-lLebenszeichen gesendet werden, default=60000, achtung: korrespondiert mit HA-Automation
//-----------------------------------------------------------------------------------------------------------
// MQTT connect / reconnect
//-----------------------------------------------------------------------------------------------------------
void reconnect() {
// Loop until we're (re)connected
if (!client.connected()) {
Serial.print("Verbinde zu MQTT-Broker... ");
delay(3000);
if (client.connect("arduinoClient", "ZZ", "KEY")) {
Serial.println("OK!");
Serial.println(" Initialisiere und sende Topics...");
Serial.println(" > am2/lebenszeichen = off");
client.publish("am2/lebenszeichen","off"); // keine Leerzeichen nach Komma, nur Strings !!!
Serial.println(" ...gesendet");
Serial.println("=================================================================================================");
} else {
Serial.print("Fehler! -> rc=");
Serial.print(client.state());
Serial.println(" ...warte 5 Sek...");
delay(5000);
}
}
Serial.println(" ...Starte Loop (delay = 300 ms...)");
Serial.println("=================================================================================================");
if(debug==false) Serial.println("Loop gestartet... keine Ausgabe auf seriellem Monitor, da debug=false gesetzt ist.");
}
//###########################################################################################################//
//###########################################################################################################//
// Setup //
//###########################################################################################################//
//###########################################################################################################//
void setup() {
pinMode(buzzer, OUTPUT); // Setze den Buzzer-Pin als Ausgang
SoundOutput(0); // 0 = play init-sound
// --------------- serial communication ---------------
Serial.begin(9600);
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Serial.println(">> Arduino Mega 2560 für Home Assistant >>");
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
// --------------------- Ethernet ---------------------
Ethernet.begin(mac, ip);
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println("Ethernet-Shield nicht gefunden. Ohne Hardware geht nix! :(");
while (true) {
SoundOutput(6); // 6x Piepser = LAN Shield nicht gefunden, keine Funktion / Programm läuft nicht !
delay(10000); // nix tun, kein Grund ohne LAN-Hardware etwas zu starten
}
}
SoundOutput(102); // 102 = 2x kurzer, hoher Pieps
Serial.println("Ethernet-Shield gefunden...");
Serial.print(" statische IP: ");
Serial.println(Ethernet.localIP());
// --------------------- MQTT ----------------------------
client.setServer(MQTTserver, MQTTport);
Serial.println("====== ENDE SETUP ===========================================================================================");
} // ### Ende Setup ###
//###########################################################################################################//
//###########################################################################################################//
// LOOP //
//###########################################################################################################//
//###########################################################################################################//
void loop() {
delay(100);
if (!client.connected()) {
Serial.print(" ###### MQTT-Client not connected -> ");
SoundOutput(3); // 3x Piepser = (re)connect MQTT wird ausgeführt
reconnect();
}
else {
unsigned long currentMillis = millis();
// ---------------------------------- //
// ---- MQTT am2 Lebenszeichen ------ //
// ---------------------------------- //
if (currentMillis - previousMillis_lebenszeichen >= am2_lebenszeichen_interval) {
previousMillis_lebenszeichen = currentMillis;
if (MQTT_am2_is_alive == "off") {
MQTT_am2_is_alive = "on";
client.publish("am2/lebenszeichen","on"); // keine Leerzeichen nach Komma, nur Strings !!!
if(debug==true) Serial.println("<<< <<< mqtt_is_alive = on >>> >>>");
} else {
MQTT_am2_is_alive = "off";
client.publish("am2/lebenszeichen","off"); // keine Leerzeichen nach Komma, nur Strings !!!
if(debug==true) Serial.println("--- <<< mqtt_is_alive = off >>> ---");
}
}
// ======== //
// LOOP IT! //
client.loop();
}
}
//###########################################################################################################//
//###########################################################################################################//
// Funktionen //
//###########################################################################################################//
//###########################################################################################################//
// #################################################################################### //
// # Funktion: Buzzer / Sound-Ausgabe # //
// #################################################################################### //
// 0 = Init-Sound
// 1-99 = Fehler-Codes
// 101-199 = OKs (Anzahl beeps = buzz_type-100)
void SoundOutput(int buzz_type) {
if(buzz_type == 0){
tone(buzzer, 523); // Spiele 523 Hz auf dem Buzzer: C
delay(210); // Warte 210 ms
noTone(buzzer); // Stoppe die Wiedergabe des Tons
tone(buzzer, 587); // D
delay(310);
noTone(buzzer);
tone(buzzer, 784); // G
delay(400);
noTone(buzzer);
}
else if(buzz_type>0 and buzz_type<100){ // Fehler-Ausgabe
for(int i=0; i<buzz_type; i++){
tone(buzzer, 880); // das ist ein A
delay(270);
noTone(buzzer);
delay(170);
} // for
} // else if
else if(buzz_type>100){ // Bestätigungen / OK
for(int i=0; i<buzz_type-100; i++){
tone(buzzer, 1760); // das ist ein hohes A
delay(170);
noTone(buzzer);
delay(50);
} // for
} // else if
} // void SoundOutput
Alle 8 Sek. höre ich "3 mal lang" auf dem Buzzer, bedeutet client.connected()==false --> reconnect().
In der Konsole:
>> Arduino Mega 2560 für Home Assistant >>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Ethernet-Shield gefunden...
statische IP: 192.ZZ.ZZ.ZZ
====== ENDE SETUP ===========================================================================================
###### MQTT-Client not connected -> Verbinde zu MQTT-Broker... OK!
Initialisiere und sende Topics...
> am2/lebenszeichen = off
...gesendet
=================================================================================================
...Starte Loop (delay = 300 ms...)
=================================================================================================
<<< <<< mqtt_is_alive = on >>> >>>
--- <<< mqtt_is_alive = off >>> ---
<<< <<< mqtt_is_alive = on >>> >>>
--- <<< mqtt_is_alive = off >>> ---
<<< <<< mqtt_is_alive = on >>> >>>
###### MQTT-Client not connected -> Verbinde zu MQTT-Broker... OK!
Initialisiere und sende Topics...
> am2/lebenszeichen = off
...gesendet
=================================================================================================
...Starte Loop (delay = 300 ms...)
=================================================================================================
--- <<< mqtt_is_alive = off >>> ---
<<< <<< mqtt_is_alive = on >>> >>>
--- <<< mqtt_is_alive = off >>> ---
<<< <<< mqtt_is_alive = on >>> >>>
--- <<< mqtt_is_alive = off >>> ---
###### MQTT-Client not connected -> Verbinde zu MQTT-Broker... OK!
Initialisiere und sende Topics...
> am2/lebenszeichen = off
...gesendet
=================================================================================================
...Starte Loop (delay = 300 ms...)
=================================================================================================
<<< <<< mqtt_is_alive = on >>> >>>
Ich verzweifle und bin dankbar für jeden Tipp in jede Richtung. THX.