#include <Arduino.h>
#include <WiFi.h>
#include "ThingSpeak.h"
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Wi-Fi Credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak
unsigned long myChannelNumber = 2943053;
const char* WriteAPIKey = "0AUA67RCJVZ3KAF3";
WiFiClient client;
// Pin Configuration
#define TRIG_PIN 19
#define ECHO_PIN 18
#define DHT_PIN 17
#define RED_LED 5
#define GREEN_LED 4
#define BUZZER 15
// OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHTesp dhtSensor;
// Bitmaps (16x16)
const unsigned char temp_icon [] PROGMEM = {
0x18, 0x00, 0x24, 0x00, 0x42, 0x00, 0x81, 0x00,
0x81, 0x00, 0x81, 0x00, 0x42, 0x00, 0x24, 0x00,
0x18, 0x00, 0x18, 0x00, 0x24, 0x00, 0x42, 0x00,
0x81, 0x00, 0x81, 0x00, 0xff, 0x00, 0x7e, 0x00
};
const unsigned char humid_icon [] PROGMEM = {
0x18, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x66, 0x00,
0x42, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00,
0x42, 0x00, 0x66, 0x00, 0x3c, 0x00, 0x3c, 0x00,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char alert_icon [] PROGMEM = {
0x10, 0x00, 0x38, 0x00, 0x38, 0x00, 0x7c, 0x00,
0x7c, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00,
0xfe, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x38, 0x00,
0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00
};
float distance_cm, distance_m;
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED failed"));
while (true);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
ThingSpeak.begin(client);
}
void loop() {
// Distance
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
distance_cm = 0.017 * duration;
distance_m = distance_cm / 100.0;
// DHT22 Sensor
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float temperature = data.temperature;
float humidity = data.humidity;
// OLED Display
display.clearDisplay();
// Temperature
display.drawBitmap(0, 0, temp_icon, 16, 16, SSD1306_WHITE);
display.setCursor(20, 4);
display.print("Temp: ");
display.print(temperature, 1);
display.print(" C");
// Humidity
display.drawBitmap(0, 18, humid_icon, 16, 16, SSD1306_WHITE);
display.setCursor(20, 22);
display.print("Hum: ");
display.print(humidity, 1);
display.print(" %");
// Distance
display.setCursor(0, 40);
display.print("Dist: ");
display.print(distance_cm, 1);
display.print(" cm");
// Alert System
if (temperature > 50 || humidity > 55) {
display.drawBitmap(100, 0, alert_icon, 16, 16, SSD1306_WHITE);
display.setCursor(0, 55);
display.print("🚨 ALERT: High T/H");
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
tone(BUZZER, 1000);
} else {
display.setCursor(0, 55);
display.print("✅ Normal");
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
noTone(BUZZER);
}
display.display();
// ThingSpeak update
ThingSpeak.setField(1, distance_cm);
ThingSpeak.setField(2, distance_m);
ThingSpeak.setField(3, temperature);
ThingSpeak.setField(4, humidity);
int status = ThingSpeak.writeFields(myChannelNumber, WriteAPIKey);
if (status == 200) {
Serial.println("✅ ThingSpeak Updated");
} else {
Serial.println("❌ ThingSpeak Error: " + String(status));
}
delay(15000); // Wait 15s
}