#include <WiFi.h>
#include "ThingSpeak.h"
#include <ESP32Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// --- WiFi & ThingSpeak Setup ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
unsigned long myChannelNumber = 3337884;
const char* myWriteAPIKey = "FDANPCRQ6W7EWVOU";
WiFiClient client;
// --- Pin Definitions ---
#define TRIG_PIN 4
#define ECHO_PIN 5
#define SERVO_PIN 19
#define PIR_PIN 2
#define TEMP_PIN 21
#define LDR_PIN 35
#define GAS_PIN 34
#define RED_LED 14
#define BLUE_LED 15
#define GREEN_LED 17
#define ORANGE_LED 18
#define YELLOW_LED 16
Servo myServo;
OneWire oneWire(TEMP_PIN);
DallasTemperature tempSensor(&oneWire);
unsigned long lastTime = 0;
const unsigned long postingInterval = 3000; // Sending to cloud every 3s
void setup() {
Serial.begin(115200);
// Initialize Sensor Pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
// Initialize LED Pins
pinMode(RED_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(ORANGE_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
myServo.attach(SERVO_PIN);
tempSensor.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
ThingSpeak.begin(client);
}
void loop() {
// --- 1. SENSOR READINGS ---
tempSensor.requestTemperatures();
float temp = tempSensor.getTempCByIndex(0);
digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int distance = pulseIn(ECHO_PIN, HIGH) * 0.034 / 2;
int gas = analogRead(GAS_PIN);
int ldr = analogRead(LDR_PIN);
int motion = digitalRead(PIR_PIN);
// --- 2. LOGIC CONDITIONS ---
// Temperature Logic
if (temp < 50.0) {
digitalWrite(BLUE_LED, HIGH); // Temp below 50
digitalWrite(RED_LED, LOW);
} else {
digitalWrite(BLUE_LED, LOW); // Above 50
digitalWrite(RED_LED, HIGH);
}
// Gas Logic
if (gas > 2500) {
digitalWrite(ORANGE_LED, HIGH);
} else {
digitalWrite(ORANGE_LED, LOW);
}
// Motion Logic
if (motion == HIGH) {
digitalWrite(YELLOW_LED, HIGH);
} else {
digitalWrite(YELLOW_LED, LOW);
}
// Photoresistor Logic
// Brighter environment (Higher LDR value) = Dimmer LED (Lower PWM)
int greenBrightness = map(ldr, 0, 4095, 255, 0); // ESP32 analogRead is 0-4095. analogWrite is 0-255.
analogWrite(GREEN_LED, greenBrightness);
// Servo Logic (Proportional to distance)
int servoAngle = map(distance, 0, 200, 0, 180); // Mapped 0-200cm to 0-180 degrees
servoAngle = constrain(servoAngle, 0, 180); // Keep within bounds
myServo.write(servoAngle);
// --- 3. CLOUD UPDATES (ThingSpeak) ---
if (millis() - lastTime > postingInterval) {
ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, (float)distance);
ThingSpeak.setField(3, (float)gas);
ThingSpeak.setField(4, (float)ldr);
ThingSpeak.setField(5, (float)motion);
int status = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (status == 200) {
Serial.println("Cloud Update: Success");
} else {
Serial.println("Cloud Update: Failed (" + String(status) + ")");
}
lastTime = millis();
}
}