#include <SdsDustSensor.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ThingSpeak.h>
#include <WiFi.h>
// Constants
#define DHTPIN 15
#define DHTTYPE DHT22
// SDS011 sensor setup
SdsDustSensor sds(Serial1); // Use Serial1 for SDS011
// LCD setup
LiquidCrystal_I2C lcd(0x27, 20, 4); // Address 0x27 for I2C
// DHT sensor setup
DHT dht(DHTPIN, DHTTYPE);
// ThingSpeak details
const char* ssid = "Wokwi-GUEST";
const char* password = "";
unsigned long myChannelNumber = 2658416;
const char* myWriteAPIKey = "Q6YX0Z7SBYX4Y33R";
WiFiClient client;
void setup() {
Serial.begin(115200);
Serial1.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17 for SDS011
// Initialize DHT sensor
dht.begin();
// Initialize SDS011 sensor
sds.begin();
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("IoT Air Quality");
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
// Initialize ThingSpeak
ThingSpeak.begin(client);
}
void loop() {
// Read humidity and temperature values
float h = dht.readHumidity();
float t = dht.readTemperature();
// Read PM2.5 and PM10 values from SDS011
PmResult pm = sds.readPm();
if (pm.isOk()) {
float pm25 = pm.pm25;
float pm10 = pm.pm10;
// Display data on LCD
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C");
lcd.setCursor(0, 2);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print(" %");
lcd.setCursor(0, 3);
lcd.print("PM2.5: ");
lcd.print(pm25);
lcd.print(" PM10: ");
lcd.print(pm10);
// Update ThingSpeak channel
ThingSpeak.setField(1, t);
ThingSpeak.setField(2, h);
ThingSpeak.setField(3, pm25);
ThingSpeak.setField(4, pm10);
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (x == 200) {
Serial.println("Data updated");
} else {
Serial.println("Update failed");
}
} else {
Serial.println("SDS011 read failed");
}
delay(20000); // Wait 20 seconds before updating again
}