#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <DHTesp.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define DHT_PIN 1
#define SD_CS 5
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DHTesp dht;
File logFile;
unsigned long lastRead = 0;
const unsigned long interval = 2000; // 2 seconds
void setup() {
Serial.begin(115200);
// I2C OLED
Wire.begin(21, 22);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED not found");
while (true);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Starting...");
display.display();
// DHT22
dht.setup(DHT_PIN, DHTesp::DHT22);
// SD card
SPI.begin(18, 19, 23, SD_CS);
if (!SD.begin(SD_CS)) {
Serial.println("SD card init failed");
display.clearDisplay();
display.setCursor(0, 0);
display.println("SD init failed");
display.display();
while (true);
}
Serial.println("SD card ready");
// Create file header if file does not exist
if (!SD.exists("/temp.csv")) {
logFile = SD.open("/temp.csv", FILE_WRITE);
if (logFile) {
logFile.println("time_ms,temperature_c,humidity_percent");
logFile.close();
}
}
}
void loop() {
if (millis() - lastRead >= interval) {
lastRead = millis();
TempAndHumidity data = dht.getTempAndHumidity();
if (isnan(data.temperature) || isnan(data.humidity)) {
Serial.println("Failed to read from DHT sensor");
showError("Sensor read failed");
return;
}
Serial.print("Temp: ");
Serial.print(data.temperature);
Serial.print(" C Humidity: ");
Serial.print(data.humidity);
Serial.println(" %");
// OLED display
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Temperature Logger");
display.println("------------------");
display.print("Temp: ");
display.print(data.temperature, 1);
display.println(" C");
display.print("Humidity: ");
display.print(data.humidity, 1);
display.println(" %");
display.print("Time: ");
display.print(millis() / 1000);
display.println(" s");
display.display();
// Log to SD card
logFile = SD.open("/temp.csv", FILE_APPEND);
if (logFile) {
logFile.print(millis());
logFile.print(",");
logFile.print(data.temperature, 1);
logFile.print(",");
logFile.println(data.humidity, 1);
logFile.close();
Serial.println("Logged to SD");
} else {
Serial.println("Failed to open log file");
}
}
}
void showError(const char* msg) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("ERROR");
display.println(msg);
display.display();
}