#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>
#include <ThingSpeak.h>
// Define pins
#define LED1 15
#define LED2 2
#define FAN1 4
#define FAN2 16
#define ECHO_PIN 5
#define TRG_PIN 17
#define DHT_PIN 27
// 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);
// MQTT settings
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "91.121.93.94";
const char* clientID = "ujaisldaaasdh;laslsdja1";
// ThingSpeak settings
const char* thingSpeakApiKey = "Y6TCJ3B6DARY9O0V"; // Replace with your ThingSpeak API Key
const unsigned long channelID = 2639218; // Replace with your ThingSpeak Channel ID
unsigned long previousMillis = 0;
const long interval = 1000; // 1 second
long duration, distance;
String msgStr = "";
bool LEDstate1 = LOW;
bool LEDstate2 = LOW;
bool FANstatus1 = LOW;
bool FANstatus2 = LOW;
int tankPercentage = 0;
int tankDistance = 0; // Variable to store the distance measurement
// Initialize WiFi and MQTT client
WiFiClient espClient;
PubSubClient client(espClient);
// Initialize DHT sensor
DHTesp dhtSensor;
TempAndHumidity data;
void setup() {
Serial.begin(115200);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(FAN1, OUTPUT);
pinMode(FAN2, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(TRG_PIN, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// Initialize OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 initialization failed!"));
for (;;);
}
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
setup_wifi();
client.setServer(mqttServer, 1883);
client.setCallback(callback);
// Initialize ThingSpeak
ThingSpeak.begin(espClient);
}
void setup_wifi() {
delay(10);
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()) {
if (client.connect(clientID)) {
Serial.println("MQTT connected");
client.subscribe("project-smart-house/led1");
client.subscribe("project-smart-house/led2");
client.subscribe("project-smart-house/fan1");
client.subscribe("project-smart-house/fan2");
client.subscribe("project-smart-house/tank");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message: ");
String dataStr = "";
for (int i = 0; i < length; i++) {
dataStr += (char)payload[i];
}
Serial.println(dataStr);
if (String(topic) == "project-smart-house/tank") {
tankPercentage = dataStr.toInt();
} else if (String(topic) == "project-smart-house/led1") {
LEDstate1 = (dataStr == "1");
digitalWrite(LED1, LEDstate1);
} else if (String(topic) == "project-smart-house/led2") {
LEDstate2 = (dataStr == "1");
digitalWrite(LED2, LEDstate2);
} else if (String(topic) == "project-smart-house/fan1") {
FANstatus1 = (dataStr == "1");
digitalWrite(FAN1, FANstatus1);
} else if (String(topic) == "project-smart-house/fan2") {
FANstatus2 = (dataStr == "1");
digitalWrite(FAN2, FANstatus2);
}
}
void getWaterPercentage() {
int prevPer = tankPercentage;
digitalWrite(TRG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
tankPercentage = map(distance, 0, 400, 100, 0);
tankDistance = distance; // Store the distance measurement
if (prevPer != tankPercentage) {
msgStr = String(tankPercentage);
client.publish("project-smart-house/tank", msgStr.c_str());
}
}
void drawLEDStatus(int x, int y, bool status) {
if (status) {
display.fillRect(x, y, 9, 9, SSD1306_WHITE);
} else {
display.drawRect(x, y, 9, 9, SSD1306_WHITE);
}
}
void drawWaterTank(int x, int y, int percentage) {
display.drawRect(x, y, 94, 14, SSD1306_WHITE);
int filledWidth = map(percentage, 0, 100, 0, 94);
display.fillRect(x, y, filledWidth, 14, SSD1306_WHITE);
display.setCursor(x + 97, y + 3);
display.print(percentage);
display.print("%");
}
void updateDisplay() {
display.clearDisplay();
display.setCursor(32, 2);
display.print("Water Tank");
drawWaterTank(4, 12, tankPercentage);
display.drawLine(0, 31, 127, 31, SSD1306_WHITE);
display.drawLine(0, 33, 127, 33, SSD1306_WHITE);
display.setCursor(8, 40);
display.print("LED1:");
drawLEDStatus(40, 39, LEDstate1);
display.setCursor(68, 40);
display.print("LED2:");
drawLEDStatus(100, 39, LEDstate2);
display.setCursor(8, 54);
display.print("FAN1:");
drawLEDStatus(40, 53, FANstatus1);
display.setCursor(68, 54);
display.print("FAN2:");
drawLEDStatus(100, 53, FANstatus2);
// Display temperature, humidity, and distance
display.setCursor(0, 50);
display.print("Temp: ");
display.print(data.temperature);
display.print(" C");
display.setCursor(0, 60);
display.print("Hum: ");
display.print(data.humidity);
display.print(" %");
display.setCursor(100, 50);
display.print("Dist: ");
display.print(tankDistance);
display.print(" cm");
display.display();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
getWaterPercentage();
previousMillis = currentMillis;
// Update ThingSpeak with the latest data
ThingSpeak.setField(1, data.temperature);
ThingSpeak.setField(2, data.humidity);
ThingSpeak.setField(3, tankPercentage);
ThingSpeak.setField(4, tankDistance);
ThingSpeak.writeFields(channelID, thingSpeakApiKey);
}
// Read DHT sensor and print to Serial
data = dhtSensor.getTempAndHumidity();
Serial.print("Humidity: ");
Serial.println(data.humidity);
Serial.print("Temperature: ");
Serial.println(data.temperature);
updateDisplay();
delay(1000); // Update the display every second
}