#include <WiFi.h>
#include <DHT.h>
#include "ThingSpeak.h"
// Pin definitions
#define DHT_PIN 25
#define MQ135_PIN 36
#define PIR_PIN 13
#define LDR_PIN 39
#define TRIG_PIN 14
#define ECHO_PIN 12
#define RELAY_IN1 27
#define RELAY_IN2 26
#define LED1_PIN 16
#define LED2_PIN 17
#define SW420_PIN 18
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* thingSpeakApiKey1 = "ZCFL4UHND3T4BZCG"; // First ThingSpeak API Key
const char* thingSpeakApiKey2 = "LGH0W89EMU6A87KZ"; // Second ThingSpeak API Key
const int ThingSpeakChannelID1 = 2495094; // First Channel ID
const int ThingSpeakChannelID2 = 2693648; // Second Channel ID
// Sensor objects and variables
DHT dht(DHT_PIN, DHT22);
WiFiClient client;
int relay1_state = LOW;
int relay2_state = LOW;
const float gammaFactor = 0.7;
const float rl10 = 50;
void setup() {
Serial.begin(115200);
// Pin modes
pinMode(RELAY_IN1, OUTPUT);
pinMode(RELAY_IN2, OUTPUT);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(SW420_PIN, INPUT);
// Initialize sensors
dht.begin();
connectToWiFi();
ThingSpeak.begin(client);
}
void loop() {
// Reading sensor values
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int mq135Value = analogRead(MQ135_PIN);
int pirState = digitalRead(PIR_PIN);
int nilaiLDR = analogRead(LDR_PIN);
nilaiLDR = map(nilaiLDR, 4095, 0, 1024, 0); // Mapping ADC values for ESP32
float lux = calculateLux(nilaiLDR); // Calculate brightness in lux
int vibrationState = digitalRead(SW420_PIN); // Read SW420 vibration state
int distance = measureDistance();
// Log to serial
Serial.println("---- Sending Data to Channel 1 ----");
Serial.print("Field 1 - Temperature: "); Serial.println(temperature);
Serial.print("Field 2 - Humidity: "); Serial.println(humidity);
Serial.print("Field 3 - LDR Lux (Brightness): "); Serial.println(lux);
Serial.print("Field 4 - PIR Motion: "); Serial.println(pirState);
Serial.print("Field 5 - Distance (cm): "); Serial.println(distance);
Serial.print("Field 6 - MQ135 Gas Sensor: "); Serial.println(mq135Value);
Serial.print("Field 7 - Relay 1 State: "); Serial.println(relay1_state);
Serial.print("Field 8 - Relay 2 State: "); Serial.println(relay2_state);
// Check vibration sensor and control LED
if (vibrationState == HIGH) {
digitalWrite(LED1_PIN, HIGH); // Turn on LED if vibration is detected
} else {
digitalWrite(LED1_PIN, LOW); // Turn off LED if no vibration
}
// Get MAC address for Field 5 of the second channel
String macAddress = WiFi.macAddress();
Serial.println("\n---- Sending Data to Channel 2 ----");
Serial.print("Field 1 - MAC Address: "); Serial.println(macAddress);
Serial.print("Field 2 - SW420 Vibration State: "); Serial.println(vibrationState);
if (WiFi.status() == WL_CONNECTED) {
// Send data to first ThingSpeak channel
ThingSpeak.setField(1, temperature);
ThingSpeak.setField(2, humidity);
ThingSpeak.setField(3, lux);
ThingSpeak.setField(4, pirState);
ThingSpeak.setField(5, distance);
ThingSpeak.setField(6, mq135Value);
ThingSpeak.setField(7, relay1_state);
ThingSpeak.setField(8, relay2_state);
int httpCode1 = ThingSpeak.writeFields(ThingSpeakChannelID1, thingSpeakApiKey1);
if (httpCode1 == 200) {
Serial.println("\nData successfully sent to ThingSpeak Channel 1.");
} else {
Serial.println("Failed to send data to ThingSpeak Channel 1. HTTP Code: " + String(httpCode1));
}
// Send data to second ThingSpeak channel
ThingSpeak.setField(1, macAddress);
ThingSpeak.setField(2, vibrationState);
int httpCode2 = ThingSpeak.writeFields(ThingSpeakChannelID2, thingSpeakApiKey2);
if (httpCode2 == 200) {
Serial.println("Data successfully sent to ThingSpeak Channel 2.");
} else {
Serial.println("Failed to send data to ThingSpeak Channel 2. HTTP Code: " + String(httpCode2));
}
} else {
Serial.println("WiFi not connected. Reconnecting...");
connectToWiFi();
}
delay(15000);
}
void connectToWiFi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi.");
}
int measureDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.034 / 2;
return distance;
}
float calculateLux(int nilaiLDR) {
float voltage = nilaiLDR / 1024.0 * 5;
float resistance = 2000.0 * voltage / (1.0 - voltage / 5);
return pow(rl10 * 1e3 * pow(10, gammaFactor) / resistance, (1.0 / gammaFactor));
}