#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// OLED display setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Pin definitions
#define ONE_WIRE_BUS PB1 // DS18B20 data pin
#define PHOTO_PIN PA1 // Photoresistor analog input
#define LED_PIN PC13 // Built-in LED
#define BUTTON_PIN PB0 // Pushbutton
// Sensor setup
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Thresholds
float tempThreshold = 25.0; // Default temperature threshold (°C)
int lightThreshold = 500; // Default light threshold (ADC value)
bool alertActive = false;
bool overrideMode = false;
unsigned long lastButtonPress = 0;
void setup() {
// Initialize pins
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLDOWN); // Use internal pull-down
// Initialize serial for debugging
Serial.begin(9600);
// Initialize temperature sensor
sensors.begin();
// Initialize OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while(1); // Don't proceed if display failed
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Sensor Panel Init");
display.display();
delay(2000);
}
void loop() {
// Read sensors
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
int lightLevel = analogRead(PHOTO_PIN);
// Check button for override with debounce
if(digitalRead(BUTTON_PIN)) {
if(millis() - lastButtonPress > 300) { // 300ms debounce
overrideMode = !overrideMode;
lastButtonPress = millis();
}
while(digitalRead(BUTTON_PIN)); // Wait for button release
}
// Determine alert state if not in override
if(!overrideMode) {
alertActive = (temperature > tempThreshold) || (lightLevel > lightThreshold);
}
// Control LED
digitalWrite(LED_PIN, alertActive ? HIGH : LOW);
// Update display
updateDisplay(temperature, lightLevel, alertActive, overrideMode);
delay(500); // Update twice per second
}
void updateDisplay(float temp, int light, bool alert, bool override) {
display.clearDisplay();
display.setCursor(0,0);
// Display temperature
display.print("Temp: ");
display.print(temp, 1);
display.println(" C");
// Display light level
display.print("Light: ");
display.println(light);
// Display thresholds
display.print("Thresholds: ");
display.print(tempThreshold, 0);
display.print("C/");
display.print(lightThreshold);
display.println("L");
// Display status
display.println();
if(override) {
display.println("MANUAL OVERRIDE");
display.print("Alert: ");
display.println(alert ? "ON" : "OFF");
} else {
display.println("AUTO MODE");
if(alert) {
display.println("ALERT ACTIVE!");
}
}
display.display();
}