#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WiFi.h>
#include <ThingSpeak.h>
// #include <Base64.h>
// LCD I2C address 0x27, 16 column and 2 rows!
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Constants:
#define DHTPIN 4 // GPIO4 is the DHT22 data pin
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor for ESP32
#define VOLTAGE_PIN 34 // GPIO34 (ADC1) for voltage measurement
int buzzer = 12;
// unsigned long myChannelNumber = 2748197;
// const char * myWriteAPIKey = "C1262ISK2VWLRA7Y";
float H; // Humidity value
float T; // Temperature value
float V; // Voltage value
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient client;
// Initializing LCD, DHT22 sensor, and buzzer:
void setup() {
lcd.init();
lcd.backlight();
dht.begin();
pinMode(buzzer, OUTPUT);
// Initializing Serial Monitor:
Serial.begin(115200);
Serial.println("DHT22 sensor with ESP32!");
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
// Wifi connection:
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi!");
// Initializing ThingSpeak:
// ThingSpeak.begin(client);
}
void loop() {
delay(10000); // Wait 10 seconds between readings
T = random(0, 51); // Temperature between 0 and 50°C
H = random(0, 101); // Humidity between 0% and 100%
// Analog voltage reading (ESP32 12-bit ADC: 0-4095)
int rawValue = analogRead(VOLTAGE_PIN);
V = random(0, 51);
// V = (rawValue * 3.3) / 4095.0; // Convert to voltage (0-3.3V)
Serial.print("Voltage: ");
Serial.print(V);
Serial.println(" V");
Serial.print("Humidity: ");
Serial.print(H);
Serial.println(" %");
Serial.print("Temperature: ");
Serial.print(T);
Serial.println(" Celsius");
// Send data to ThingSpeak:
// ThingSpeak.setField(1, T);
// ThingSpeak.setField(2, H);
// ThingSpeak.setField(3, V);
// // Write to ThingSpeak
// int httpCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
// if(httpCode == 200) {
// Serial.println("Data sent to ThingSpeak successfully.");
// } else {
// Serial.print("Error sending data to ThingSpeak. HTTP code: ");
// Serial.println(httpCode);
// }
// If humidity is higher than 70% and temperature is higher than 30°C, display warning:
if(H >= 70.00 && T >= 30.00) {
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
lcd.clear();
lcd.println(" Too warm! ");
lcd.setCursor(0, 1);
lcd.println(" Cool down! ");
digitalWrite(buzzer, 1);
tone(buzzer, 900, 100);
delay(400);
digitalWrite(buzzer, 0);
tone(buzzer, 900, 100);
delay(400);
digitalWrite(buzzer, 1);
tone(buzzer, 900, 100);
delay(400);
digitalWrite(buzzer, 0);
tone(buzzer, 900, 100);
delay(400);
}
else {
// If humidity is lower than 70% and temperature is lower than 30°C, display normal:
digitalWrite(9, LOW);
digitalWrite(10, LOW);
lcd.clear();
lcd.println("Temp. & hum. are");
lcd.setCursor(0, 1);
lcd.println("in normal limits");
digitalWrite(buzzer, 0);
}
// If either humidity is lower than 70%, but temperature is higher than 30°C, or
// humidity is higher than 70%, but temperature is lower than 30°C, display appropriate warnings
if(H < 70.00 && T >= 30.00) {
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
lcd.clear();
lcd.println("Be aware! ");
lcd.setCursor(0, 1);
lcd.println("Temp. too high! ");
digitalWrite(buzzer, 1);
tone(buzzer, 400, 400);
delay(400);
digitalWrite(buzzer, 0);
tone(buzzer, 400, 400);
delay(400);
}
if(H >= 70.00 && T < 30.00) {
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
lcd.clear();
lcd.println("Be aware! ");
lcd.setCursor(0, 1);
lcd.println("Hum. too high! ");
digitalWrite(buzzer, 1);
tone(buzzer, 400, 400);
delay(400);
digitalWrite(buzzer, 0);
tone(buzzer, 400, 400);
delay(400);
}
// If voltage is too high and temperature is low, show a voltage warning:
if (V >= 4.5 && T < 30.00) {
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
lcd.clear();
lcd.println("Be aware! ");
lcd.setCursor(0, 1);
lcd.println("Volt. too high! ");
digitalWrite(buzzer, 1);
tone(buzzer, 400, 400);
delay(400);
digitalWrite(buzzer, 0);
tone(buzzer, 400, 400);
delay(400);
}
}
/*#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WiFi.h>
#include <ThingSpeak.h>
// LCD I2C setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// DHT sensor setup
#define DHTPIN 4 // GPIO4 is the DHT22 data pin
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
// WiFi and ThingSpeak setup
const char* ssid = "Wokwi-GUEST";
const char* password = "";
unsigned long myChannelNumber = 2748197;
const char * myWriteAPIKey = "C1262ISK2VWLRA7Y";
#define VOLTAGE_PIN 34 // GPIO34 (ADC1) for voltage measurement
int buzzer = 12;
float H; // Humidity value
float T; // Temperature value
float V; // Voltage
// Flag to control if we are running tests
bool isTesting = true;
void setup() {
lcd.init();
lcd.backlight();
dht.begin();
pinMode(buzzer, OUTPUT);
// Initialize Serial Monitor
Serial.begin(115200);
Serial.println("DHT22 sensor with ESP32!");
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi!");
// Run test cases if in testing mode
if (isTesting) {
runTests();
}
}
void loop() {
if (!isTesting) {
// Main loop for normal operation
delay(2000); // Wait 2 seconds between readings
T = random(0, 51); // Random temperature between 0 and 50°C
H = random(0, 101); // Random humidity between 0% and 100%
// Read voltage (0 to 3.3V for ESP32 ADC)
int rawValue = analogRead(VOLTAGE_PIN);
V = (rawValue * 3.3) / 4095.0;
// Upload data to ThingSpeak
ThingSpeak.setField(1, T);
ThingSpeak.setField(2, H);
ThingSpeak.setField(3, V);
int httpCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
Serial.print("HTTP Response: ");
Serial.println(httpCode);
// Your normal functionality logic
// (The same code as before for checking humidity, temperature, voltage, etc.)
}
}
// Run test cases for different scenarios
void runTests() {
testHighTemperatureHighHumidity();
testLowTemperatureLowHumidity();
testHighTemperatureLowHumidity();
testLowTemperatureHighHumidity();
testVoltageTooHigh();
}
void testHighTemperatureHighHumidity() {
T = 35; // 35°C
H = 80; // 80% humidity
V = 3.3; // Full voltage
// Simulate ThingSpeak data upload
ThingSpeak.setField(1, T);
ThingSpeak.setField(2, H);
ThingSpeak.setField(3, V);
int httpCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
assert(httpCode == 200);
// Check LCD output
if (H >= 70 && T >= 30) {
lcd.clear();
lcd.println(" Too warm! ");
lcd.setCursor(0, 1);
lcd.println(" Cool down! ");
}
// Check buzzer
if (H >= 70 && T >= 30) {
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
Serial.println("Buzzer triggered for high temperature and humidity.");
}
assert(T == 35);
assert(H == 80);
assert(V == 3.3);
Serial.println("Test Passed: High Temperature and High Humidity scenario.");
}
void testLowTemperatureLowHumidity() {
T = 20; // 20°C
H = 40; // 40% humidity
V = 3.3; // Full voltage
ThingSpeak.setField(1, T);
ThingSpeak.setField(2, H);
ThingSpeak.setField(3, V);
int httpCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
assert(httpCode == 200);
if (H < 70 && T < 30) {
lcd.clear();
lcd.println("Temp. & hum. are");
lcd.setCursor(0, 1);
lcd.println("in normal limits");
}
if (!(H >= 70 && T >= 30)) {
digitalWrite(buzzer, LOW);
}
assert(T == 20);
assert(H == 40);
assert(V == 3.3);
Serial.println("Test Passed: Low Temperature and Low Humidity scenario.");
}
void testHighTemperatureLowHumidity() {
T = 32; // 32°C
H = 60; // 60% humidity
V = 3.0; // Voltage at 3.0V
ThingSpeak.setField(1, T);
ThingSpeak.setField(2, H);
ThingSpeak.setField(3, V);
int httpCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
assert(httpCode == 200);
if (H < 70 && T >= 30) {
lcd.clear();
lcd.println("Be aware! ");
lcd.setCursor(0, 1);
lcd.println("Temp. too high! ");
}
if (H < 70 && T >= 30) {
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
Serial.println("Buzzer triggered for high temperature.");
}
assert(T == 32);
assert(H == 60);
assert(V == 3.0);
Serial.println("Test Passed: High Temperature and Low Humidity scenario.");
}
void testLowTemperatureHighHumidity() {
T = 15; // 15°C
H = 85; // 85% humidity
V = 3.2; // Voltage at 3.2V
ThingSpeak.setField(1, T);
ThingSpeak.setField(2, H);
ThingSpeak.setField(3, V);
int httpCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
assert(httpCode == 200);
if (H >= 70 && T < 30) {
lcd.clear();
lcd.println("Be aware! ");
lcd.setCursor(0, 1);
lcd.println("Hum. too high! ");
}
if (H >= 70 && T < 30) {
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
Serial.println("Buzzer triggered for high humidity.");
}
assert(T == 15);
assert(H == 85);
assert(V == 3.2);
Serial.println("Test Passed: Low Temperature and High Humidity scenario.");
}
void testVoltageTooHigh() {
T = 25; // 25°C
H = 50; // 50% humidity
V = 4.7; // Simulate high voltage
ThingSpeak.setField(1, T);
ThingSpeak.setField(2, H);
ThingSpeak.setField(3, V);
int httpCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
assert(httpCode == 200);
if (V >= 4.5 && T < 30) {
lcd.clear();
lcd.println("Be aware! ");
lcd.setCursor(0, 1);
lcd.println("Volt. too high! ");
}
if (V >= 4.5 && T < 30) {
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
Serial.println("Buzzer triggered for high voltage.");
}
assert(T == 25);
assert(H == 50);
assert(V == 4.7);
Serial.println("Test Passed: Voltage Too High scenario.");
}
*/