#include <LiquidCrystal.h>
#include <DHT.h>
// Pin configuration
#define DHTPIN PA0
#define DHTTYPE DHT22
#define LDR_PIN PA6
#define BUTTON_PIN PA4
#define LED_PIN PA2
// LCD: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(PB0, PB1, PB10, PB11, PB12, PB13);
DHT dht(DHTPIN, DHTTYPE);
// Override state
bool overrideActive = false;
void setup() {
Serial.begin(115200);
Serial.println("STM32 Sensor System Starting...");
dht.begin();
lcd.begin(16, 2);
lcd.print("Initializing...");
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Button is active LOW
delay(2000);
lcd.clear();
}
void loop() {
static bool lastButtonState = HIGH;
bool currentButtonState = digitalRead(BUTTON_PIN);
// Debounce + toggle override on button press
if (lastButtonState == HIGH && currentButtonState == LOW) {
overrideActive = !overrideActive;
delay(200); // debounce delay
}
lastButtonState = currentButtonState;
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int ldrValue = analogRead(LDR_PIN);
// LED logic
if (overrideActive) {
digitalWrite(LED_PIN, LOW); // LED off in override mode
} else {
if (temp > 30.0 || ldrValue < 300) {
digitalWrite(LED_PIN, HIGH); // Alert: high temp or dark
} else {
digitalWrite(LED_PIN, LOW); // Normal
}
}
// Serial output
Serial.print("Temp: ");
Serial.print(temp);
Serial.print(" C, Hum: ");
Serial.print(hum);
Serial.print(" %, LDR: ");
Serial.print(ldrValue);
Serial.print(", Override: ");
Serial.println(overrideActive ? "ON" : "OFF");
// LCD output
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print("C H:");
lcd.print(hum, 0);
lcd.print("% ");
lcd.setCursor(0, 1);
lcd.print("LDR:");
lcd.print(ldrValue);
lcd.print(" ");
lcd.print(overrideActive ? "OVR:ON " : "OVR:OFF");
delay(1000);
}