#include <Arduino.h>
#include <Wire.h>
#include <DHT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Sensor pins
#define DHT_PIN PA1
#define DHT_TYPE DHT22
#define GAS_PIN PA0
// Alert output pins
#define BUZZER_PIN PB0
#define LED_PIN PB1
// Threshold values
#define TEMP_LIMIT 30.0
#define HUM_LIMIT 75.0
#define GAS_LIMIT 800
// OLED settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDRESS 0x3C
DHT dht(DHT_PIN, DHT_TYPE);
Adafruit_SSD1306 display(
SCREEN_WIDTH,
SCREEN_HEIGHT,
&Wire,
OLED_RESET
);
void setup() {
Serial.begin(115200);
// Initialize sensors and outputs
dht.begin();
pinMode(GAS_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
// Initialize OLED I2C
Wire.setSDA(PB7);
Wire.setSCL(PB6);
Wire.begin();
if (display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("MULTI-SENSOR LOGGER");
display.println("Starting...");
display.display();
} else {
Serial.println("OLED initialization failed!");
}
Serial.println("MULTI-SENSOR MONITOR");
Serial.println("System ready.");
delay(1000);
}
void loop() {
// Read sensor values
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int gasValue = analogRead(GAS_PIN);
// Check whether DHT readings are valid
bool validDHT = !isnan(temperature) && !isnan(humidity);
// Check thresholds
bool highTemperature =
validDHT && temperature >= TEMP_LIMIT;
bool highHumidity =
validDHT && humidity >= HUM_LIMIT;
bool highGas =
gasValue >= GAS_LIMIT;
bool alert =
highTemperature || highHumidity || highGas;
// Print readings to Serial Monitor
Serial.println("------------------------");
Serial.print("Temperature: ");
if (validDHT) {
Serial.print(temperature, 1);
Serial.println(" C");
} else {
Serial.println("Sensor error");
}
Serial.print("Humidity: ");
if (validDHT) {
Serial.print(humidity, 1);
Serial.println(" %");
} else {
Serial.println("Sensor error");
}
Serial.print("Gas reading: ");
Serial.println(gasValue);
// Update OLED display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("MULTI-SENSOR LOGGER");
display.println("--------------------");
display.print("Temp: ");
if (validDHT) {
display.print(temperature, 1);
display.println(" C");
} else {
display.println("Error");
}
display.print("Humidity: ");
if (validDHT) {
display.print(humidity, 1);
display.println(" %");
} else {
display.println("Error");
}
display.print("Gas: ");
display.println(gasValue);
// Activate or deactivate the alert
if (alert) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 1000);
display.println();
display.println("!! THRESHOLD ALERT !!");
Serial.println("WARNING: THRESHOLD EXCEEDED!");
if (highTemperature) {
Serial.println("High temperature!");
}
if (highHumidity) {
Serial.println("High humidity!");
}
if (highGas) {
Serial.println("High gas reading!");
}
} else {
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
display.println();
display.println("Status: NORMAL");
Serial.println("Status: NORMAL");
}
display.display();
delay(2000);
}Loading
stm32-bluepill
stm32-bluepill
Loading
ssd1306
ssd1306