#include <WiFi.h>
#include <HTTPClient.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "DHTesp.h"
#include "ThingSpeak.h"
// Simulated WiFi credentials for Wokwi environment
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak settings
const int myChannelNumber = 2574450;
const char* serverName = "api.thingspeak.com";
const char* apiKey = "BPVBRVMP6XJRZWW6";
// Constants for sensors
#define PHSENSORPIN 34 // Analog pin for pH sensor (potentiometer)
#define TURBIDITYPIN 35 // Analog pin for turbidity sensor (potentiometer)
#define LCD_ADDR 0x27
#define LED_WHITE 13 // LED pin for checking "All ok"
#define LED_BLUE 12 // LED pin for pH
#define LED_RED 14 // LED pin for temperature
#define LED_YLW 15 // LED pin for turbidity
const int DHT22PIN = 16; // Analog pin for temperature sensor
//Initialize the DHT22
DHTesp dhtSensor;
//Create a WiFi client object
WiFiClient client;
// Initialize the LCD
LiquidCrystal_I2C lcd(LCD_ADDR, 16, 2);
// Safe limits
const float SAFE_TEMP_MIN = 26; // Example safe limit for temperature (min)
const float SAFE_TEMP_MAX = 30; // Example safe limit for temperature (max)
const float SAFE_PH_MIN = 6; // Example safe limit for pH (min)
const float SAFE_PH_MAX = 8; // Example safe limit for pH (max)
const float SAFE_TURBIDITY_MAX = 70; // Example safe limit for turbidity (max)
void setup() {
// Set the baud rate
Serial.begin(115200);
// Connect to WiFi (simulated)
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi...");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.println("Connected to WiFi");
Serial.println("IP Address: ");
Serial.println(WiFi.localIP());
WiFi.mode(WIFI_STA); //Set the Wifi mode to station mode
ThingSpeak.begin(client); //Initialize the ThingSpeak library
//DHT sensor setup
dhtSensor.setup(DHT22PIN, DHTesp::DHT22);
// Setup code for sensors and alert components
pinMode(PHSENSORPIN, INPUT);
pinMode(TURBIDITYPIN, INPUT);
pinMode(LED_WHITE, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_YLW, OUTPUT);
// Initialize the LCD
lcd.init();
lcd.backlight();
lcd.print("System Initialized");
delay(2000);
lcd.clear();
Serial.println("Smart Water Quality Monitoring System Initialized");
}
void checkLimits(float temperature, float pH, float turbidity) {
bool alert = false;
lcd.clear();
lcd.setCursor(0, 0);
//Check temperature limits
if (temperature < SAFE_TEMP_MIN || temperature > SAFE_TEMP_MAX) {
Serial.println("Alert: Temperature out of safe limits!");
lcd.print("Temp Alert!");
digitalWrite(LED_RED, HIGH); //Turn ON the LED
digitalWrite(LED_WHITE, LOW);
alert = true;
}
delay(1000);
//Check pH limits
if (pH < SAFE_PH_MIN || pH > SAFE_PH_MAX) {
Serial.println("Alert: pH out of safe limits!");
lcd.print("pH Alert!");
digitalWrite(LED_BLUE, HIGH);
digitalWrite(LED_WHITE, LOW);
alert = true;
}
//Check turbidity limits
if (turbidity > SAFE_TURBIDITY_MAX) {
Serial.println("Alert: Turbidity out of safe limits!");
lcd.print("Turb Alert!");
digitalWrite(LED_YLW, HIGH);
digitalWrite(LED_WHITE, LOW);
alert = true;
}
if (alert){
lcd.setCursor(0, 1);
lcd.print("Check System!");
}
else{
digitalWrite(LED_BLUE, LOW);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_YLW, LOW);
digitalWrite(LED_WHITE, HIGH);
lcd.setCursor(0, 0);
lcd.print("All OK!");
}
}
void loop() {
// Read temperature and humidity from DHT22
TempAndHumidity data = dhtSensor.getTempAndHumidity();
//Check the reading from DHT sensor
if (isnan(data.temperature)) {
Serial.println("Failed to read from DHT sensor!");
delay(2000);
return;
}
// Read pH value (simulated using potentiometer)
int pHValueRaw = analogRead(PHSENSORPIN);
float pHValue = map(pHValueRaw, 0, 4095, 0, 14); // conversion to pH range
// Read turbidity value (simulated using potentiometer)
int turbidityValue = analogRead(TURBIDITYPIN);
float turbidity = map(turbidityValue, 0, 4095, 0, 100); // conversion to turbidity percentage
// Print values to Serial Monitor
Serial.print("Temperature: ");
Serial.print(data.temperature);
Serial.print(" °C, pH Value: ");
Serial.print(pHValue);
Serial.print(", Turbidity Value: ");
Serial.println(turbidity);
// Check if values are within safe limits
checkLimits(data.temperature, pHValue, turbidity);
// Send data to ThingSpeak
ThingSpeak.setField(1,pHValue);
ThingSpeak.setField(2,data.temperature);
ThingSpeak.setField(3,turbidity);
//Write the data to the ThingSpeak Channel
int status = ThingSpeak.writeFields(myChannelNumber , apiKey);
if(status == 200){
Serial.println("Data sent successfully"); // Print a message if the data was successfully pushed to ThingSpeak
}
else{
Serial.println("Push error"); // Print an error message with the HTTP status code if there was an error pushing the data
Serial.println(status);
}
Serial.println("---"); // Print a separator line
delay(15000); // Wait for 15 seconds before next reading
}