目录
一. 所需硬件
Arduino Uno控制器
1个四位数码管
1个震动传感器
1个DHT11传感器
1个面包版
二.连接示意图

三. 代码
#include <DHT.h>
// 1. 定义引脚
#define DHTPIN 4 // DHT11数据引脚
#define VIBRATION_PIN 8 // 数字震动模块连接引脚
#define DHTTYPE DHT11 // 传感器类型
// 2. 初始化DHT传感器
DHT dht(DHTPIN, DHTTYPE);
// 时间控制变量
unsigned long previousDHTMillis = 0; // 上次读取DHT的时间
const long dhtInterval = 2000; // DHT读取间隔(毫秒)
// 震动检测变量
bool lastVibrationState = HIGH; // 上次震动状态
unsigned long lastVibrationTime = 0; // 上次震动触发时间
const long vibrationCooldown = 1000; // 震动冷却时间(1秒内不重复检测)
void setup() {
Serial.begin(9600);
while (!Serial) {
; // 等待串口连接(仅限某些板子)
}
Serial.println("系统启动 - DHT11 & 数字震动传感器");
dht.begin(); // 初始化DHT11
// 初始化数字震动引脚
pinMode(VIBRATION_PIN, INPUT);
delay(10); // 短暂延时确保引脚稳定
lastVibrationState = digitalRead(VIBRATION_PIN);
// 初始读取DHT11
readDHT();
}
void loop() {
unsigned long currentMillis = millis(); // 获取当前时间
// 1. 定时读取DHT11(非阻塞方式)
if (currentMillis - previousDHTMillis >= dhtInterval) {
previousDHTMillis = currentMillis;
readDHT();
}
// 2. 检测震动信号
checkVibration();
}
// 读取DHT11温湿度数据
void readDHT() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检测读取是否失败
if (isnan(humidity) || isnan(temperature)) {
Serial.println("读取DHT11失败!");
} else {
Serial.print("湿度: ");
Serial.print(humidity);
Serial.print("% 温度: ");
Serial.print(temperature);
Serial.println("°C");
}
}
// 检测震动
void checkVibration() {
bool currentState = digitalRead(VIBRATION_PIN);
unsigned long currentMillis = millis();
// 状态变化检测(从高到低或从低到高)
if (currentState != lastVibrationState) {
// 防抖动:等待一段时间再次确认
delay(5); // 短暂延时
bool confirmedState = digitalRead(VIBRATION_PIN);
// 确认状态变化有效
if (confirmedState == currentState) {
// 状态从高变低:通常表示检测到震动(适配大多数震动传感器的低电平触发)
if (lastVibrationState == HIGH && currentState == LOW) {
// 检查冷却时间,避免重复触发
if (currentMillis - lastVibrationTime >= vibrationCooldown) {
Serial.println(">> [警报] 检测到震动! <<");
lastVibrationTime = currentMillis;
}
}
// 更新上次震动状态
lastVibrationState = currentState;
}
}
}
这份代码是基于Arduino实现DHT11温湿度检测+数字震动传感器检测的程序
四.代码功能模块解析
1. 头文件与引脚定义
引入 DHT.h 库用于驱动DHT11传感器,定义DHT11数据引脚、震动传感器引脚,指定传感器类型为DHT11。
2. 全局变量声明
定义DHT11读取的时间间隔和计时变量,实现非阻塞式定时读取;定义震动检测的状态、计时和冷却时间变量,避免震动信号重复触发。
3. 初始化函数 setup()
初始化串口通信(波特率9600)、DHT11传感器和震动传感器引脚为输入模式,同时读取初始震动状态并执行首次DHT11数据读取。
4. 主循环函数 loop()
采用非阻塞延时( millis() )实现每2秒读取一次DHT11温湿度;持续调用 checkVibration() 函数检测震动信号。
5. DHT11读取函数 readDHT()
调用DHT库的 readHumidity() / readTemperature() 获取温湿度,通过 isnan() 判断读取是否失败,成功则通过串口输出数据。
6. 震动检测函数 checkVibration()
读取震动传感器引脚状态,通过5ms延时防抖确认状态变化;检测到低电平触发(多数震动传感器的触发方式)且满足冷却时间时,串口输出震动警报。
五.硬件适配注意事项
1. 震动传感器类型:
代码适配数字型震动传感器(高低电平输出),若高低电平输出),若使用模拟型震动传感器,需将引脚改为 INPUT 并使用 analogRead() 读取数值,再设置阈值判断震动。
2. DHT11接线:
DHT11的VCC接5V、GND接GND、DATA接引脚4,需串联4.7KΩ上拉电阻在DATA与VCC之间,否则易读取失败。
3. 冷却时间调整:
vibrationCooldown 可根据需求修改,数值越小震动检测越灵敏,数值越大越不易误触发。
1万+

被折叠的 条评论
为什么被折叠?



