#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
const int DHT_PIN = 9;
DHTesp dhtSensor;
/*
nieuwe file maken vb: secrets.S --> hier kan je wachtwoord in zodat het niet in het script moet.
Dit bestand is dan versleuteld en blijft het veilig tegenover hackeraanvallen.
Zonder broker niet mogelijk om tussen machines te werken! De broker hier is gratis maar deze diensten kosten geld.
*/
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient; //een client maken voor het wifi netwerk
PubSubClient client(espClient); //dit zorgt ervoor dat we kunnen publiceren of subscriben
//Nu zijn we nog niet verbonden, dit zijn allemaal maar gewoon wat variabelen.
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
float temp = 0; //optioneel
float hum = 0; //optioneel
int value = 0; //optioneel
//Met onderstaand codeblok kunnen we verbinding maken met het netwerk. De serial prints is puur om te zien of het werkt.
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); //Vraagt 2 parameters, maakt gebruik van de gedfinieerde parameters
//Zolang het niet verbonden is aan het netwerk gaat dit puntjes printen ter controle/laadscherm.
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//Soort van delay voor dat de printtstatments er op komen
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
//Telkens als er iets in de blok code veranderd geeft dit aan wat er is veranderd(blok informatie met erbij hoelang deze blok is)
//Low betekent aan en HIGH betekent uit!
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
if ((char)payload[0] == '1') {
digitalWrite(2, LOW); //betekent aan
} else {
digitalWrite(2, HIGH); //betekent uit
}
}
//lege topic aanmaken als veronderstelling en dan meteen ook een callbackfunctie.
//een soort van aankondiging dat we er zijn. daarna controleren of we nog steeds met de client verbonden zijn
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP8266Client-"; //stukje random zodat we niet allemaal dezelfde code hebben
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
client.publish("iotfrontier/mqtt", "iotfrontier");
client.subscribe("iotfrontier/mqtt");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
pinMode(2, OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883); //8001 is ook een andere standaardpoort, afhankelijk van servertype weet je ook welke poort je zit
client.setCallback(callback);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
TempAndHumidity data = dhtSensor.getTempAndHumidity();
String temp = String(data.temperature, 2);
Serial.print("Temperature: ");
Serial.println(temp);
client.publish("iotfrontier/temperature", temp.c_str());
String hum = String(data.humidity, 1);
Serial.print("Humidity: ");
Serial.println(hum);
client.publish("iotfrontier/humidity", hum.c_str());
}
}