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

ESP32 WROOM

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.");
    }
  }
}