#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define BuzzerPin 5
#define LedPin 6
#define SmokeSensor A0
#define TempHumiditySensor A1
float smokeThreshold = 500; // 烟雾浓度阈值
float tempThreshold = 28; // 温度阈值(摄氏度)
float humidityThreshold = 60; // 湿度阈值(百分比)
bool isAlarmEnabled = true; // 报警是否启用
void setup()
{
pinMode(BuzzerPin, OUTPUT);
pinMode(LedPin, OUTPUT);
pinMode(SmokeSensor, INPUT);
pinMode(TempHumiditySensor, INPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
}
void loop()
{
float smokeValue = analogRead(SmokeSensor);
float tempValue = analogRead(TempHumiditySensor) * 0.48828125;
float humidityValue = analogRead(TempHumiditySensor) * 0.09765625;
display.clearDisplay();
display.setCursor(0, 0);
display.print("Time: ");
display.print(millis() / 1000); // 显示实时时间(秒)
display.setCursor(0, 10);
display.print("Temp: ");
display.print(tempValue, 1); // 显示温度值(1位小数)
display.print(" C");
display.setCursor(0, 20);
display.print("Humidity: ");
display.print(humidityValue, 1); // 显示湿度值(1位小数)
display.print(" %");
display.setCursor(0, 30);
display.print("Smoke: ");
display.print(smokeValue); // 显示烟雾浓度值
display.display();
if (isAlarmEnabled && (tempValue > tempThreshold || humidityValue > humidityThreshold || smokeValue > smokeThreshold))
{
soundAlarm();
flashLed();
}
else
{
stopAlarm();
turnOffLed();
}
delay(1000);
}
void soundAlarm()
{
tone(BuzzerPin, 1000, 100); // 播放报警音(100ms)
}
void stopAlarm()
{
noTone(BuzzerPin);
}
void flashLed()
{
for (int i = 0; i < 3; i++)
{
digitalWrite(LedPin, HIGH);
delay(500);
digitalWrite(LedPin, LOW);
delay(500);
}
digitalWrite(LedPin, LOW);
}
void turnOffLed()
{
digitalWrite(LedPin, LOW);
}
void manuallyDisableAlarm()
{
isAlarmEnabled = false;
}
void manuallySetThresholds(float smoke, float temp, float humidity)
{
smokeThreshold = smoke;
tempThreshold = temp;
humidityThreshold = humidity;
}