# 3. Apparaat bouwen

Disclaimer Bij deze stap maken we gebruik van een ESP32. Weet je niet wat een ESP32 is, of weet je niet hoe je deze moet programmeren check dan de volgende tutorial om hier eerst bekend mee te raken.

Een ESP32 kan fungeren als een MQTT-Client. Om dit te doen hebben we de Arduino IDE nodig samen een bibliotheek. We maken gebruik van de PubSubClient bibliotheek. Je kan deze vinden in de library manager in de Arduino IDE. Daarna kan je aan de slag met de volgende code:

#include <WiFi.h>
#include <PubSubClient.h>

const char *ssid = "";    // Vul hier je WiFi SSID in
const char *password = ""; // Vul hier je WiFi wachtwoord in
const char *mqtt_server = "mqtt.datalabrotterdam.nl"; // Publieke broker
const int mqtt_port = 8883; // MQTT-poort
const char *clientId = "MijnIoTApparaat32"; // Apparaat naam

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
   Serial.begin(115200);
   
   // Verbind met WiFi
   Serial.print("\nVerbinden met WiFi");
   WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
   }
   Serial.println("\nWiFi verbonden");
  
   // Verbind met MQTT-broker
   client.setServer(mqtt_server, mqtt_port);
   client.setCallback(callback);
   connect();
}

void loop() {
   if (!client.connected()) {
      connect();
   }
   client.loop();
   // Voer hier je code uit
}

void callback(char *topic, byte *payload, unsigned int length) {
   // Verwerk inkomende MQTT-berichten op topics waarop je bent ge-subscribed
   Serial.print("Bericht ontvangen op '");
   Serial.print(topic);
   Serial.print("' : ");
   String message = ""; 
   for (int i = 0; i < length; i++) { message += (char)payload[i]; }
   Serial.println(message);

  // Hier kan je wat doen met het ontvangen bericht op een topic waarop je bent gesubscribed
}

void connect() {
   // Loop totdat we opnieuw verbonden zijn met de MQTT-broker
   while (!client.connected()) {
      Serial.print("Verbinden met MQTT-broker...");
      if (client.connect(clientId)) {
         Serial.println("Verbonden");
         // Hier kun je abonneren op MQTT-topics of andere taken uitvoeren bijv:
         client.subscribe("huiskamer/sensoren/1/command");
         client.publish("huiskamer/sensoren/1/temperatuur", "23°C");
      } else {
         Serial.println("Verbinding mislukt, opnieuw proberen over 5 seconden...");
         delay(5000);
      }
   }
}

Deze code verbind met WiFi en maakt vervolgens verbinding met een publieke MQTT-Broker. In de connect functie wordt deze verbinding opgesteld en wordt er gesubscribed op een MQTT-Topic. De callback functie wordt aangeroepen zodra er een bericht binnenkomt waarop de ESP32 is gesubscribed. Afhankelijk wat de topic of de message is, kan je iets doen, bijvoorbeeld iets op een display zetten, een geluid afspelen, een lamp aan laten gaan, enz.

# Opdracht 1

Probeer zelf je eigen informatie te sturen of informatie te ontvangen van een ander apparaat. Als dit is gelukt kan je je eigen sensor waardes versturen. Denk hierbij aan een temperatuursensor en een display.

TIP! Om te zien wat er gestuurd wordt naar de broker, kan je de software MQTT Explorer downloaden en verbinden met je broker.