#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// 初始化DHT传感器
#define DHTPIN 6 // 定义连接DHT传感器的引脚
// 定义超声波传感器的引脚
const int trigPin = 10;
const int echoPin = 11;
// 定义LED引脚
const int ledPin = 13;
const int ledPin1 = 12;
const int smokeSensorPin = A0; // 烟雾传感器连接到A0引脚
const int buzzerPin = 7; // 蜂鸣器连接到数字9引脚
#define DHTTYPE DHT22 // 定义DHT类型,这里使用DHT22
DHT dht(DHTPIN, DHTTYPE);
Servo myservo; // 创建舵机对象以控制一个舵机
// 初始化LCD屏幕
LiquidCrystal_I2C lcd(0x27, 16, 2); // 设置LCD的I2C地址为0x27(或者其他,根据实际情况修改),16个字符,2行显示
// 定义烟雾检测的阈值
const int smokeThreshold = 400; // 依据您的传感器和实验环境调整这个阈值
void setup() {
pinMode(smokeSensorPin, INPUT); // 设定烟雾传感器引脚为输入
pinMode(ledPin1, OUTPUT); // 设定LED灯引脚为输出
pinMode(buzzerPin, OUTPUT); // 设定蜂鸣器引脚为输出
// 初始化串口通信
Serial.begin(9600);
// 开始DHT传感器
dht.begin();
// 初始化LCD屏幕
lcd.init();
// 打开LCD背光
lcd.backlight();
myservo.attach(9); // 将舵机的信号线连接到数字引脚9
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
// 读取温度和湿度值
float h = dht.readHumidity();
float t = dht.readTemperature();
long duration, distance;
int smokeLevel = analogRead(smokeSensorPin); // 读取烟雾传感器的值
Serial.println(smokeLevel); // 将烟雾等级打印到串行监视器
if (smokeLevel > smokeThreshold) { // 如果检测到烟雾等级超过阈值
digitalWrite(ledPin1, HIGH); // 打开LED灯
tone(buzzerPin, 1000); // 在蜂鸣器引脚上产生1000Hz的音调
delay(200); // 等待200毫秒
digitalWrite(ledPin1, LOW); // 关闭LED灯
noTone(buzzerPin); // 停止蜂鸣器响声
delay(200); // 再次等待200毫秒
} else {
// 如果烟雾等级未超过阈值,确保LED灯和蜂鸣器均关闭
digitalWrite(ledPin1, LOW);
noTone(buzzerPin);
}
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
if (distance < 20) { // 如果距离小于20厘米
digitalWrite(ledPin, HIGH); // 打开LED
myservo.write(90); // 使舵机转到90度
delay(1000); // 保持1秒
} else {
digitalWrite(ledPin, LOW); // 关闭LED
myservo.write(0); // 使舵机回到0度
delay(1000); // 保持1秒
}
Serial.print(distance);
Serial.println(" cm");
// 检查读取失败的情况
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 显示温度和湿度数据在串口监视器
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
// 显示温度和湿度数据在LCD
lcd.clear();
lcd.setCursor(0, 0); // 设置LCD光标位置(第一行第一列)
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C");
lcd.setCursor(0, 1); // 设置LCD光标位置(第二行第一列)
lcd.print("Humid: ");
lcd.print(h);
lcd.print(" %");
}