#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#include <DHT.h>
// ---------- Pin Settings ----------
#define SDA_PIN 21
#define SCL_PIN 22
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define LED_RED 25
#define LED_BLUE 26
#define BUZZER 27
// ---------- OLED ----------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// ---------- RTC ----------
RTC_DS1307 rtc;
// ---------- DHT ----------
DHT dht(DHT_PIN, DHT_TYPE);
void setup() {
Serial.begin(115200);
// I2C
Wire.begin(SDA_PIN, SCL_PIN);
// LED
pinMode(LED_RED, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
// Buzzer
pinMode(BUZZER, OUTPUT);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_BLUE, LOW);
// ---------- OLED Start ----------
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED ERROR!");
while (1);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(2);
display.setCursor(10, 10);
display.println("SYSTEM");
display.setCursor(10, 35);
display.println("TEST");
display.display();
// ---------- RTC Start ----------
if (!rtc.begin()) {
Serial.println("RTC ERROR!");
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 20);
display.println("RTC ERROR");
display.display();
while (1);
}
// Only set RTC if it is not running
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// ---------- DHT Start ----------
dht.begin();
// ---------- LED + Buzzer Test ----------
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_BLUE, HIGH);
tone(BUZZER, 1000);
delay(500);
noTone(BUZZER);
delay(1000);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_BLUE, LOW);
Serial.println("SYSTEM TEST STARTED");
}
void loop() {
// Read RTC
DateTime now = rtc.now();
// Read DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// ---------- Serial Monitor ----------
Serial.print("Time: ");
if (now.hour() < 10) Serial.print("0");
Serial.print(now.hour());
Serial.print(":");
if (now.minute() < 10) Serial.print("0");
Serial.print(now.minute());
Serial.print(":");
if (now.second() < 10) Serial.print("0");
Serial.println(now.second());
Serial.print("Date: ");
Serial.print(now.day());
Serial.print("/");
Serial.print(now.month());
Serial.print("/");
Serial.println(now.year());
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.println("----------------");
// ---------- OLED ----------
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 0);
if (now.hour() < 10) display.print("0");
display.print(now.hour());
display.print(":");
if (now.minute() < 10) display.print("0");
display.print(now.minute());
display.print(":");
if (now.second() < 10) display.print("0");
display.println(now.second());
display.setTextSize(1);
display.setCursor(0, 25);
display.print("Date: ");
display.print(now.day());
display.print("/");
display.print(now.month());
display.print("/");
display.println(now.year());
display.setCursor(0, 40);
if (isnan(temperature)) {
display.print("Temp: ERROR");
} else {
display.print("Temp: ");
display.print(temperature, 1);
display.print(" C");
}
display.setCursor(0, 52);
if (isnan(humidity)) {
display.print("Hum: ERROR");
} else {
display.print("Hum: ");
display.print(humidity, 1);
display.print(" %");
}
display.display();
delay(2000);
}