// Include WiFi library for ESP32 WiFi functions
#include <WiFi.h>
// Include ThingSpeak library to send data to cloud
#include <ThingSpeak.h>
// Include DHT sensor library
#include "DHTesp.h"
// WiFi credentials (Wokwi default WiFi)
char ssid[] = "Wokwi-GUEST"; // WiFi network name
char pass[] = ""; // WiFi password (empty for Wokwi)
// Create a WiFi client object
WiFiClient client;
// ThingSpeak channel number
unsigned long myChannelNumber = 2581126;
// ThingSpeak Write API Key
const char * myWriteAPIKey = "ARI56ZCIQ06EBI6H";
// Create DHT sensor object
DHTesp dhtSensor;
// Structure to store temperature and humidity values
TempAndHumidity data;
// Define DHT sensor pin
const int DHT_PIN = 15;
// Define Ultrasonic sensor pins
const int TRIG_PIN = 2;
const int ECHO_PIN = 4;
// Variables to store ultrasonic pulse duration and distance
long duration, distance;
// Variable to store HTTP status code from ThingSpeak
int statusCode;
void setup() {
// Start serial communication for debugging
Serial.begin(115200);
// Set ESP32 WiFi mode as Station
WiFi.mode(WIFI_STA);
// Initialize ThingSpeak with WiFi client
ThingSpeak.begin(client);
// Initialize DHT22 sensor on specified pin
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// Set TRIG pin as OUTPUT
pinMode(TRIG_PIN, OUTPUT);
// Set ECHO pin as INPUT
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// Ensure WiFi connection is active
connectToCloud();
// Read sensor values
computeData();
// Upload data to ThingSpeak
writeData();
// Delay before next cycle
delay(1000);
}
// Function to connect ESP32 to WiFi
void connectToCloud(){
// Check if WiFi is not connected
if(WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect");
// Keep trying until connected
while(WiFi.status() != WL_CONNECTED) {
// Start WiFi connection
WiFi.begin(ssid, pass);
// Print dots while waiting
for(int i=0;i<5;i++) {
Serial.print(".....");
delay(1000);
}
}
// Print confirmation message
Serial.println("\nConnected.");
}
}
// Function to read DHT and Ultrasonic sensor data
void computeData(){
// Measure distance using ultrasonic sensor
distance = getDistanceInCentimeters();
// Read temperature and humidity from DHT sensor
data = dhtSensor.getTempAndHumidity();
// Display sensor values on Serial Monitor
Serial.println("-----------");
Serial.println("Humidity: " + String(data.humidity));
Serial.println("Temperature: " + String(data.temperature));
Serial.println("Distance: " + String(distance));
Serial.println("-----------");
}
// Function to upload data to ThingSpeak
void writeData()
{
// Set Field 1 with humidity value
ThingSpeak.setField(1, data.humidity);
// Set Field 2 with temperature value
ThingSpeak.setField(2, data.temperature);
// Set Field 3 with distance value
ThingSpeak.setField(3, distance);
// Send data to ThingSpeak
statusCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
// Check if data upload is successful
if(statusCode == 200)
Serial.println(" \n Channel Update Successful");
else
Serial.println("Problem Writing data. HTTP error code :" + String(statusCode));
// Delay to avoid rapid uploads
delay(1500);
}
// Function to calculate distance using Ultrasonic sensor
long getDistanceInCentimeters() {
// Ensure trigger pin is LOW
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
// Send 10 microsecond HIGH pulse
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Measure pulse duration on ECHO pin
duration = pulseIn(ECHO_PIN, HIGH);
// Calculate distance using speed of sound
return (duration * 0.034 / 2);
}