#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <DHT.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
// SH1106 Display Setup
Adafruit_SH1106G display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// DHT Sensor Setup
#define DHTPIN 16
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// Two LED System
#define GREEN_LED 2 // Represents Normal/Low Temperature
#define RED_LED 5 // Represents High Temperature Alert
const float HIGH_LIMIT = 30;
unsigned long lastBlinkTime = 0;
const int blinkInterval = 500;
bool redLedState = LOW;
void setup() {
Serial.begin(115200);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
// ESP32 Default I2C pins
Wire.begin(21, 22);
if(!display.begin(0x3C, true)) {
Serial.println(F("SH1106 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
// Splash Screen
display.setTextSize(1);
display.setCursor(15, 15);
display.println("BIANCA ANA A SILLACAY");
display.setCursor(10, 35);
display.println("DIGITAL THERMOMETER");
display.display();
delay(3000);
dht.begin();
}
void loop() {
float t = dht.readTemperature();
// Handle sensor disconnection
if (isnan(t)) {
display.clearDisplay();
display.setCursor(20, 30);
display.print("Sensor Error!");
display.display();
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
return;
}
const char* statusText = "";
if (t <= HIGH_LIMIT) {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
statusText = "STATUS: NORMAL";
}
else {
digitalWrite(BLUE_LED, LOW);
unsigned long currentMillis = millis();
if (currentMillis - lastBlinkTime >= blinkInterval) {
lastBlinkTime = currentMillis;
redLedState = !redLedState;
digitalWrite(RED_LED, redLedState);
}
statusText = "STATUS: HIGH!";
}
updateDisplay(t, statusText);
}
void updateDisplay(float t, const char* statusText) {
display.clearDisplay();
// Header UI
display.setTextSize(1);
display.setCursor(30, 0);
display.print("THERMOMETER");
display.drawFastHLine(0, 10, 128, SH110X_WHITE);
// Large Temperature Reading
display.setTextSize(2);
display.setCursor(15, 25);
display.print(t, 1);
display.setTextSize(1);
display.print(" o");
display.setTextSize(2);
display.print("C");
// Status Indicator Box
display.drawRect(0, 50, 128, 14, SH110X_WHITE);
display.setCursor(20, 53);
display.setTextSize(1);
display.print(statusText);
display.display();
}