De perfecte Arduino code voor een ESP32, WiFi, MQTT & OTA
De onderstaande code is de basis van veel van mijn projecten en bevat de code voor FailSafe gebruik van WiFi en MQTT. Behalve dit heeft deze code ook OTA, Over The Air Update mogelijkheden.
Ik heb deze code gedurende een lange tijd getest en daar waar nodig bijgesteld zodat ik er zeker van ben dat deze niet alleen stabiel is, maar ook situaties als een herstartend Access Point of Home Assistant server moeiteloos opvangt.
De ESP32 zal niet alleen het wegvallen van WiFi of MQTT detecteren, maar deze ook zelf herstellen.
In het verleden maakte ik mijn controllers en sensoren zonder een Over The Air Update mogelijkheid. Als er iets niet goed was moest ik met mijn schroevendraaier de behuizing open maken en via een USB kabel en mijn laptop de
betreffende sensor updaten. Niet iets waar je blij van wordt en dankzij OTA gelukkig opgelost.
De code is zo gemaakt dat deze code bevat om waardes via MQTT te versturen en waardes via MQTT te ontvangen.
๐ Bekijk de video op YouTube
Neem deze code gerust over, pas aan naar eigen behoefte en gebruik in projecten. Mocht je deze code gebruiken als basis voor code die openbaar gepubliceerd wordt, vergeet dan niet een vermelding of link naar deze site te maken.
Kijk ook even naar de Disclaimer
In deze code maak ik gebruik van een aantal bibliotheken, zoals WiFi.h, PubSubClient.h, AdruinoOTA.h en Arduino_Secrets.h.
| Bibliotheek | Omschrijving |
|---|---|
| WiFi.h | Deze bibliotheek zit wordt standaard mee geladen met het ESP32 board. |
| PubSubClient.h | Deze bibliotheek moet worden toegevoegd via de 'Library Manager' in Arduino IDE. |
| AdruinoOTA.h | Deze bibliotheek moet worden toegevoegd via de 'Library Manager' in Arduino IDE. |
| Arduino_Secrets.h. | Dit is een extra Tab-blad (toevoegen door op de ... te klikken rechts boven in Arduino IDE en Arduino_Secrets.h te noemen Hier sla ik alle variabelen op die ik niet wil delen met anderen en standaard in mijn code gebruik zoals mijn WiFi SSID, wachtwoorden e.d. |
/*
* Maker : Matteman-Automation
* Project : Verbinden met WiFi, MQTT & OTA
* Version : 1.0
* Date : 10-2025
* Programmer : Ap Matteman
* Board : ESP32 Wroom
*
* [Topic!] moet worden aangepast voor inkomende MQTT berichten
*
*/
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoOTA.h>
#include <Arduino_Secrets.h>
const char* ssid = YourSSID;
const char* password = YourWiFiPassWord;
const char* HostName = "Demo_Code"; //Naam van het apparaat in het netwerk
const char* mqtt_broker = YourMQTTserver;
const char* mqtt_user = YourMQTTuser;
const char* mqtt_password = YourMQTTpassword;
String sMQTTName;
int iWiFiTry = 0;
int iMQTTTry = 0;
//Nodig voor de verzend verzenden SSID
unsigned long lPrivMS = 0;
const unsigned long lInterval = 5000; // 5 seconde
WiFiClient espClient;
PubSubClient MQTTclient(espClient); // MQTT Client
void Connect2WiFi() {
WiFi.mode(WIFI_STA); //WiFi mode, Client
iWiFiTry = 0;
WiFi.begin(ssid, password);
WiFi.setHostname(HostName);
Serial.print("Connecting to WiFi ");
while (WiFi.status() != WL_CONNECTED && iWiFiTry < 11) { //Probeer 11 keer met WiFi te verbinden
++iWiFiTry;
Serial.print(".");
delay(500);
}
if(iWiFiTry < 11){
Serial.println("");
Serial.print("Got IP: "); Serial.println(WiFi.localIP());
} else {
Serial.println("");
Serial.print("Verbinding mislukt");
}
}
void Connect2MQTT() {
// Controleer of WiFi verbonden is, zo niet verbind met WiFi.
if (WiFi.status() != WL_CONNECTED) {
Connect2WiFi;
}
iMQTTTry=0;
sMQTTName = "MQTT-" + String(WiFi.macAddress()); //Unique MQTT Device name
Serial.print("Connecting to MQTT ");
MQTTclient.setServer(mqtt_broker, 1883);
while (!MQTTclient.connect(sMQTTName.c_str(), mqtt_user, mqtt_password) && iMQTTTry < 11) { ///Probeer 11 keer met MQTT te verbinden
++iWiFiTry;
++iMQTTTry;
Serial.print(".");
delay(500);
}
if(iMQTTTry < 11) {
Serial.println("");
Serial.println("Verbonden met MQTT");
} else {
Serial.println("");
Serial.println("Verbinding mislukt");
int iErrorCode = MQTTclient.state();
Serial.print("MQTT connect failed, code = "); Serial.println(iErrorCode);
}
}
void callback(char *topic, byte *payload, unsigned int length) {
String sStatus; // Bevat de waarde
Serial.println("-----------------------");
// Convert Char* to String
String STopic = topic;
payload[length] = 0; String recv_payload = String(( char *) payload);
Serial.print("Message arrived in topic: "); Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
sStatus+= (char)payload[i];
}
sStatus.trim();
Serial.println();
if(strcmp(topic,"[Topic!]")==0) {
// Doe iets als de [Topic!] binnenkomrt met sStatus
}
}
void setup() {
Serial.begin(115200); //Nodig voor de Serial Monitor
Connect2WiFi();
Connect2MQTT();
// (optioneel) naam en wachtwoord voor OTA
ArduinoOTA.setHostname(HostName);
ArduinoOTA.setPassword(OTAPassword); // Wachtwoord opgeslagen in Arduino_Secrets.h
// OTA starten
ArduinoOTA.begin();
MQTTclient.setCallback(callback);
// MQTTclient.subscribe("[Topic!]");
}
void loop() {
unsigned long lNowMS = millis();
int iRSSI;
MQTTclient.loop();
ArduinoOTA.handle();
if (lNowMS - lPrivMS >= lInterval) {
lPrivMS = lNowMS;
// Is MQTT nog verbonden?
if (!MQTTclient.connect(sMQTTName.c_str(), mqtt_user, mqtt_password)) {
Connect2MQTT();
}
if (iWiFiTry < 11) {
iRSSI = WiFi.RSSI();
MQTTclient.publish("video/demo/wifi/rssi", String(iRSSI).c_str());
Serial.print("video/demo/wifi/rssi = "); Serial.println(iRSSI);
} else {
Serial.print("*** ERROR *** Geen WiFi.");
}
}
}