#include "WiFi.h"
#include <Wire.h>
#include <WebServer.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHTesp.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SENSOR_PIN 12
#define LED_PIN 18
const int DHT_PIN = 16;
#define POT_PIN 34
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
DHTesp dhtSensor;
struct TempHumidity {
float temperature;
float humidity;
};
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
WebServer server(80);
unsigned long lastUpdateTime = 0;
const unsigned long updateInterval = 10000;
int totalCrossings = 0;
int airQualityIndex = 0;
TempHumidity currentEnvironment = {0.0, 0.0};
void setup() {
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 10);
display.println("Init hardware");
display.display();
delay(1000);
// Initialize WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Initialize server route
server.on("/", HTTP_GET, sendHtml);
server.begin();
Serial.println("Web server started");
display.clearDisplay();
display.println("Init PIR/Temp Sensor");
display.display();
pinMode(SENSOR_PIN, INPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(POT_PIN, INPUT);
delay(1000);
display.clearDisplay();
}
void loop() {
server.handleClient();
totalCrossings = CrossLine();
if (millis() - lastUpdateTime >= updateInterval) {
lastUpdateTime = millis();
currentEnvironment = readTemperatureAndHumidity();
airQualityIndex = readAirQualityIndex();
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("Environment Monitor");
display.setTextSize(1);
display.print("Crossings: ");
display.println(totalCrossings);
display.print("Temp: ");
display.print(currentEnvironment.temperature);
display.println(" C");
display.print("Humidity: ");
display.print(currentEnvironment.humidity);
display.println(" %");
display.print("AQI: ");
display.println(airQualityIndex);
display.display();
}
}
int CrossLine() {
static int i = 0;
int sensorValue = digitalRead(SENSOR_PIN);
if (sensorValue == HIGH) {
i++;
delay(500);
}
return i;
}
TempHumidity readTemperatureAndHumidity() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
if (isnan(data.temperature) || isnan(data.humidity)) {
Serial.println("Failed to read from DHT sensor!");
return {0.0, 0.0};
}
return {data.temperature, data.humidity};
}
int readAirQualityIndex() {
int potValue = analogRead(POT_PIN);
int airQualityIndex = map(potValue, 0, 4095, 0, 500);
return airQualityIndex;
}
void sendHtml() {
// Prepare HTML response
String response = R"(
<!DOCTYPE html><html>
<head>
<title>Data of Pollution</title>
</head>
<body>
<h1>Environment Monitor</h1>
<p><strong>Total Crossings:</strong> )" +
String(totalCrossings) +
R"(</p>
<p><strong>Temperature:</strong> )" +
String(currentEnvironment.temperature) +
R"( C</p>
<p><strong>Humidity:</strong> )" +
String(currentEnvironment.humidity) +
R"( %</p>
<p><strong>AQI:</strong> )" +
String(airQualityIndex) +
R"(</p>
</body>
</html>
)";
server.send(200, "text/html", response);
}