2、核心硬件选型:主流传感器模块与主控芯片对比

好,咱们进入第二章。这一章我打算聊聊硬件选型。说实话,很多初学者一上来就纠结「用 ESP32 还是 Arduino?」「人体红外和雷达到底哪个靠谱?」——这些问题我在项目里都踩过坑,今天一次性给你讲透。

2.1 传感器模块:三员大将

安防传感器,说白了就三类最常用:人体红外、门磁、烟雾。我个人的习惯是,先根据场景定传感器,再根据传感器选主控。

2.1.1 人体红外传感器(PIR)

这个最常见。你想想看,楼道里的感应灯,用的就是它。原理很简单:检测人体发出的红外辐射。

推荐型号:HC-SR501 / AM312

  • HC-SR501:经典款,灵敏度可调,延时可调。我早期项目基本都用它。
  • AM312:体积小,功耗低,适合电池供电的设备。

我的经验:HC-SR501 有个坑——它上电后需要 30-60 秒的稳定时间。我曾经在客户现场调试,一上电就触发告警,搞得大家虚惊一场。后来我习惯在代码里加一段延时,等传感器稳定后再开始检测。

2.1.2 门磁传感器

门磁,其实就是干簧管加磁铁。门关上时磁铁靠近,开关闭合;门打开时开关断开。简单粗暴,但非常可靠。

推荐型号:MC-38

  • 常闭型(NC):门关着时电路导通,门打开时断开。我个人更推荐这种,因为一旦线路断了,系统能立刻发现异常。
  • 常开型(NO):反过来,门开时导通。

注意:门磁的安装位置很关键。磁铁和干簧管的距离不要超过 1cm,否则容易误报。我见过有人把磁铁装在门框上,干簧管装在门扇上,结果门一关,距离太远,信号时断时续。

2.1.3 烟雾传感器

这个比较特殊。烟雾传感器分两种:离子式和光电式。家用安防场景,我建议用光电式,它不容易误报,而且对阴燃火(比如电线短路冒烟)反应更灵敏。

推荐型号:MQ-2 / MQ-135

  • MQ-2:对液化气、丙烷、氢气敏感,也适合烟雾检测。
  • MQ-135:对空气质量敏感,能检测氨气、硫化物等。

嗯,这里要注意:MQ 系列传感器需要预热。通电后要等几分钟,输出才会稳定。我刚开始用的时候,一上电就读数据,结果数值乱跳,还以为传感器坏了。

2.2 主控芯片:ESP32 vs Arduino

选主控,说白了就是选「大脑」。市面上主流的就是 ESP32 和 Arduino(以 Uno/Nano 为代表)。我两个都用过,给你做个对比。

对比项 ESP32 Arduino Uno/Nano
处理器 双核 Xtensa LX6,240MHz ATmega328P,16MHz
WiFi/蓝牙 内置 WiFi + 蓝牙 无,需外接模块
GPIO 数量 34 个(可复用) 14 个(数字)/ 6 个(模拟)
功耗 较高(约 80mA) 较低(约 20mA)
价格 约 15-30 元 约 10-20 元
开发难度 中等(需配置环境) 低(上手快)

2.2.1 什么时候选 ESP32?

我个人习惯,只要项目需要联网,直接上 ESP32。为什么?因为它自带 WiFi 和蓝牙,省去了外接模块的麻烦。而且双核处理器,跑 MQTT 协议的同时还能处理传感器数据,完全不卡顿。

典型场景:智能家居网关、远程告警系统、云平台联动。

2.2.2 什么时候选 Arduino?

如果你只是做本地控制,比如门磁触发后本地蜂鸣器响,或者电池供电的场景,Arduino 更合适。它的功耗低,而且开发环境简单,小学生都能上手。

我的建议:初学者可以先从 Arduino 开始,把传感器逻辑调通。等需要联网了,再换成 ESP32。代码移植起来也不难,因为 Arduino 的库和 ESP32 的 Arduino 核心基本兼容。

2.3 实战选型建议

好了,理论说完了,咱们来点实际的。假设你要做一个「门窗告警 + 烟雾检测 + 远程推送」的系统,我会怎么选?

  1. 传感器:门磁用 MC-38(常闭型),烟雾用 MQ-2,人体红外用 HC-SR501。
  2. 主控:ESP32。因为需要联网推送告警到手机。
  3. 供电:如果门磁和红外用电池,建议用 AM312(低功耗)和 ESP32 的深度睡眠模式。

代码示例(ESP32 + 门磁 + MQTT 推送):

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "你的WiFi名";
const char* password = "你的WiFi密码";
const char* mqtt_server = "broker.emqx.io";

WiFiClient espClient;
PubSubClient client(espClient);

const int doorPin = 4;  // 门磁接 GPIO4
bool lastState = HIGH;

void setup() {
  Serial.begin(115200);
  pinMode(doorPin, INPUT_PULLUP);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  bool currentState = digitalRead(doorPin);
  if (currentState != lastState) {
    if (currentState == LOW) {
      client.publish("home/door", "opened");
      Serial.println("门开了!");
    } else {
      client.publish("home/door", "closed");
      Serial.println("门关了。");
    }
    lastState = currentState;
  }
  delay(200);
}

避坑指南:我曾经在门磁代码里忘了加 INPUT_PULLUP,结果门磁信号一直不稳定,时高时低。后来才发现,干簧管需要上拉电阻才能正常工作。ESP32 内部有上拉,但记得在代码里声明。

2.4 小结

这一章咱们聊了传感器和主控的选型。说白了,没有最好的硬件,只有最合适的。我的建议是:

  • 先确定你的场景(本地告警还是远程推送?)
  • 再选传感器(人体、门磁、烟雾,按需组合)
  • 最后定主控(需要联网就 ESP32,本地简单控制就 Arduino)

下一章,咱们会把这些硬件连起来,写一个完整的告警逻辑。到时候你会发现,硬件选型这一步走对了,后面写代码会顺畅很多。