#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>
#include <DHT.h>
#define CS_PIN 5
#define SENSOR_PIN 4 // Change to the pin corresponding to the DHT sensor
#define GAS_SENSOR_PIN 13
File root;
File dataFile;
DHT dht(SENSOR_PIN, DHT22);
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool isFirstSlide = true;
void setup() {
Serial.begin(115200);
Serial.print("Initializing SD card... ");
if (!SD.begin(CS_PIN)) {
Serial.println("Card initialization failed!");
while (true);
}
Serial.println("Initialization done.");
Serial.println("Files in the card:");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("");
dataFile = SD.open("/wokwi.txt", FILE_WRITE);
if (dataFile) {
Serial.println("wokwi.txt opened for writing.");
dataFile.println("Time,Temperature (C),Humidity (%RH),Air Quality,Gas Sensor");
} else {
Serial.println("Error opening wokwi.txt for writing!");
}
pinMode(GAS_SENSOR_PIN, INPUT);
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Air Quality Sensor");
lcd.setCursor(0, 1);
lcd.print("Initialization...");
delay(2000);
lcd.clear();
}
void loop() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Add a condition for air quality
String airQualityStatus;
if (temperature > 25.0 && humidity > 70.0) {
airQualityStatus = "Poor (high temperature and humidity)";
} else if (temperature < 20.0 && humidity < 30.0) {
airQualityStatus = "Poor (low temperature and humidity)";
} else {
airQualityStatus = "Normal";
}
int airQualityValue = analogRead(SENSOR_PIN);
int gasSensorValue = digitalRead(GAS_SENSOR_PIN);
Serial.print("Temperature: ");
if (!isnan(temperature)) {
Serial.print(temperature);
Serial.println(" °C");
} else {
Serial.println("Failed to read temperature!");
}
Serial.print("Humidity: ");
if (!isnan(humidity)) {
Serial.print(humidity);
Serial.println(" %RH");
} else {
Serial.println("Failed to read humidity!");
}
Serial.print("Air Quality: ");
Serial.println(airQualityStatus);
Serial.print("Gas Sensor: ");
Serial.println(gasSensorValue);
// Display data on the LCD
lcd.clear();
if (isFirstSlide) {
lcd.setCursor(0, 0);
lcd.print("Temp: ");
if (!isnan(temperature)) {
lcd.print(temperature);
lcd.print(" C");
} else {
lcd.print("Error");
}
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
if (!isnan(humidity)) {
lcd.print(humidity);
lcd.print(" %RH");
} else {
lcd.print("Error");
}
isFirstSlide = false;
} else {
lcd.setCursor(0, 0);
lcd.print("AirQual: ");
lcd.print(airQualityStatus); // Display air quality status instead of the raw value
lcd.setCursor(0, 1);
lcd.print("Gas: ");
lcd.print(gasSensorValue);
isFirstSlide = true;
}
// Log data to SD card
if (dataFile) {
dataFile.print(millis()); // Time stamp
dataFile.print(",");
dataFile.print(temperature);
dataFile.print(",");
dataFile.print(humidity);
dataFile.print(",");
dataFile.print(airQualityValue);
dataFile.print(",");
dataFile.print(gasSensorValue);
dataFile.print(",");
dataFile.println(airQualityStatus);
dataFile.flush();
}
delay(10000);
}
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (!entry) {
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}