#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#include <Adafruit_SSD1306.h> // Include the OLED library
#include <Adafruit_GFX.h> // Required by the OLED library
// WiFi credentials
const char* ssid = "Wokwi-GUEST"; // Wokwi provides a simulated WiFi network
const char* password = ""; // No password for Wokwi WiFi
// MQTT broker address (using a free public broker)
const char* mqtt_server = "test.mosquitto.org";
// Define pin connections for ultrasonic sensors and DHT22
#define trigPin1 32
#define echoPin1 33
#define trigPin2 18
#define echoPin2 19
#define downLevel 14
#define upLevel 12
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
// OLED display settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
long duration1, duration2;
int distance1, distance2, normalLevel = 100;
char msg[70];
float humidity, temperature;
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(upLevel, INPUT);
pinMode(downLevel, INPUT);
// Initialize the OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ArduinoClient")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Get Flood Height Reading
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
distance1 = duration1 * 0.034 / 2;
Serial.print("Actual Water Level: ");
Serial.print(distance1);
Serial.println(" cm");
// Get Rain Gauge Reading
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration2 = pulseIn(echoPin2, HIGH);
distance2 = duration2 * 0.034 / 2;
Serial.print("Rain Gauge: ");
Serial.print(distance2);
Serial.println(" cm");
// Get Temp and Humidity Readings
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" *C");
// Adjust normal level
if(digitalRead(upLevel) == HIGH){
normalLevel += 1;
}
if(digitalRead(downLevel) == HIGH){
normalLevel -= 1;
}
// Display normal Level for adjustments
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Normal Level: ");
display.print(normalLevel);
display.println(" cm");
display.display();
// Send data via MQTT
snprintf(msg, 70, "Flood Height: %d cm, Rain Gauge: %d cm, Normal Level: %d cm", normalLevel-distance1, distance2, normalLevel);
client.publish("sensor/flood_rain", msg);
snprintf(msg, 70, "Temperature: %.2f C, Humidity: %.2f %%", temperature, humidity);
client.publish("sensor/temp_humidity", msg);
delay(500); // Wait 0.5 seconds before the next reading
}