#include <SPI.h>
#include <SD.h>
#include <DHT.h>
#define DHTPIN 7
#define DHTTYPE DHT22
#define CS_PIN 10
#define LED_PIN 6
DHT dht(DHTPIN, DHTTYPE);
File logFile;
unsigned long lastLog = 0;
int logCount = 0;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
Serial.println("=================================");
Serial.println(" SD Card Data Logger");
Serial.println(" Arduino Uno | Wokwi");
Serial.println("=================================");
dht.begin();
if (!SD.begin(CS_PIN)) {
Serial.println("[ERROR] SD Card init failed!");
while (true) {
digitalWrite(LED_PIN, HIGH); delay(200);
digitalWrite(LED_PIN, LOW); delay(200);
}
}
Serial.println("[OK] SD Card initialized.");
// Write CSV header
logFile = SD.open("datalog.csv", FILE_WRITE);
if (logFile) {
logFile.println("Log#,Temperature(C),Humidity(%),Status");
logFile.close();
Serial.println("[OK] datalog.csv created.");
} else {
Serial.println("[ERROR] Could not create file.");
}
Serial.println("Logging every 3 seconds...\n");
}
void loop() {
if (millis() - lastLog >= 3000) {
lastLog = millis();
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (isnan(temp) || isnan(hum)) {
Serial.println("[WARN] Sensor read failed, skipping...");
return;
}
logCount++;
String status = "Normal";
if (temp > 35) status = "HIGH TEMP";
else if (hum > 80) status = "HIGH HUMIDITY";
else if (temp < 15) status = "LOW TEMP";
// Log to SD
logFile = SD.open("datalog.csv", FILE_WRITE);
if (logFile) {
logFile.print(logCount);
logFile.print(",");
logFile.print(temp);
logFile.print(",");
logFile.print(hum);
logFile.print(",");
logFile.println(status);
logFile.close();
// Blink LED to confirm log
digitalWrite(LED_PIN, HIGH); delay(100);
digitalWrite(LED_PIN, LOW);
Serial.print("[LOG #"); Serial.print(logCount); Serial.print("] ");
Serial.print("Temp: "); Serial.print(temp); Serial.print(" C | ");
Serial.print("Hum: "); Serial.print(hum); Serial.print(" % | ");
Serial.println("Status: " + status);
} else {
Serial.println("[ERROR] Failed to open file for writing.");
}
}
}