#include <WiFi.h>
#include <ThingSpeak.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// ThingSpeak credentials
const char* ssid = "Wokwi-GUEST";
const char* pass = "vnkhdcnk";
WiFiClient client;
unsigned long myChannelNumber = 2753291;
const char* myWriteAPIKey = "BKWC5O4V4QDGT1S8";
// OLED display setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// DHT22 sensor setup
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Ultrasonic sensor setup
#define TRIG_PIN 14
#define ECHO_PIN 27
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Other setup
int buzzer = 5;
float humidity, temperature;
int batteryLevel, batteryPercent;
long duration, distance;
void setup() {
Serial.begin(9600);
// Initialize WiFi
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
// Initialize ThingSpeak
ThingSpeak.begin(client);
// Initialize sensors and displays
dht.begin();
lcd.init();
lcd.backlight();
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Failed to start SSD1306 OLED"));
while (1);
}
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(buzzer, OUTPUT);
// Initial messages
oled.clearDisplay();
oled.setTextSize(2);
oled.setCursor(15, 30);
oled.println("Ready");
oled.display();
delay(2000); // Allow sensors to initialize
}
void loop() {
// Read DHT22 values
humidity = dht.readHumidity();
temperature = dht.readTemperature();
// Calculate distance using ultrasonic sensor
distance = getDistanceInCentimeters();
// Read battery level
batteryLevel = analogRead(34);
batteryPercent = map(batteryLevel, 0, 4095, 0, 100);
// Display data on OLED
oled.clearDisplay();
oled.setTextSize(1.5);
oled.setCursor(0, 0);
oled.print("Temp: ");
oled.print(temperature);
oled.println(" C");
oled.print("Hum: ");
oled.print(humidity);
oled.println(" %");
oled.print("Dist: ");
oled.print(distance);
oled.println(" cm");
oled.print("Batt: ");
oled.print(batteryPercent);
oled.println(" %");
oled.display();
// Display data on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print("%");
// Trigger buzzer for abnormal conditions
if (humidity >= 70 || temperature >= 30) {
tone(buzzer, 1000, 500);
delay(500);
} else {
noTone(buzzer);
}
// Update ThingSpeak
ThingSpeak.setField(1, temperature);
ThingSpeak.setField(2, humidity);
ThingSpeak.setField(3, batteryPercent);
ThingSpeak.setField(4, distance);
int statusCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (statusCode == 200) {
Serial.println("ThingSpeak update successful");
} else {
Serial.println("ThingSpeak update failed: " + String(statusCode));
}
delay(15000); // ThingSpeak updates every 15 seconds
}
long getDistanceInCentimeters() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
return (duration * 0.034 / 2);
}