1. Arduino居家监测系统

目录

一. 所需硬件

二.连接示意图

三. 代码

四.代码功能模块解析

1. 头文件与引脚定义

2. 全局变量声明

3. 初始化函数 setup() 

4. 主循环函数 loop() 

5. DHT11读取函数 readDHT() 

6. 震动检测函数 checkVibration() 

五.硬件适配注意事项

1. 震动传感器类型:

2. DHT11接线:

3. 冷却时间调整: 


一. 所需硬件

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 可根据需求修改,数值越小震动检测越灵敏,数值越大越不易误触发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值