本帖最后由 云天 于 2026-5-26 22:47 编辑
【项目简介】
每天坐在电脑前,总是忘记喝水?传统的定时闹钟不够智能——人不在座位上也响,人在座位上时反而不提醒。本项目利用 C4002 毫米波人体存在传感器 精准检测"室内是否有人",配合 Bluno Nano 实现智能提醒逻辑:当检测到有人时,每 30 秒通过继电器点亮 3V 柔性灯丝 10 秒(测试),用柔和的灯光提醒你起身喝水。人离开后自动停止,节能又贴心。
【项目亮点】
| C4002 支持运动 + 静止/微动检测,即使你坐着不动也能识别 | 【材料清单】
| | | | | | | | | | | | | | | | | | | | | | | 移动电源,5V 给 Nano,3V/3.3V 给灯丝 | | | | |
【模块介绍】
1 Bluno Nano(主控)- 兼容 Arduino Nano,体积小巧
- 板载 TI CC2540 蓝牙 4.0 芯片,支持串口透传与无线编程
- 单引脚最大输出 40mA,不能直接驱动灯丝或继电器线圈,需通过继电器隔离
2 C4002 毫米波传感器- 基于 24GHz FMCW 技术,探测角度 120°×120°
- 支持运动检测(11m)与静止/微动检测(10m)
- 通过 UART 输出目标状态(无人 / 运动 / 静止存在)
- 首次使用需进行环境底噪采集,过滤窗帘、空调等干扰
3 Gravity 简易继电器模块- 逻辑端:3.3~5.5V 宽电压,直接兼容 Nano D13
- 负载端:VIN 支持 5V~30V,通过拨动开关切换常开(NO)/常闭(NC)
- 自带 LED 指示继电器吸合状态,方便调试
4 3V 柔性软灯丝- 长度 260mm,直径 2mm,可任意弯曲造型
- 工作电压 3V,工作电流约 80mA
- 小圆孔端为正极,无孔端为负极
【电路连接】1 供电分配(18650 电池座)- 5V 输出 → Bluno Nano VIN(Nano 板载稳压器转为 5V/3.3V 工作)
- 3.3V/3V 输出 → 继电器模块负载端 VIN → 灯丝正极
- GND → 所有模块共地
提示:若你的电池座输出为单节 3.7V(无稳压),可直接接灯丝,但亮度会略高于 3V;建议串联 10Ω 电阻限流,或确认灯丝可短时承受 3.7V。
2 信号接线
注意:C4002 与 Nano 通过 SoftwareSerial(4,5) 通信,因为 Nano 的硬件串口 Serial 已被 BLE/USB 占用。【硬件组装】







【软件准备】
1 安装 Arduino IDE
下载并安装 Arduino IDE,开发板选择 Arduino Nano(若包装盒日期为 2015.09.21 或 2015.10.08,请选择 Arduino Nano (328))。
2 安装 DFRobot_C4002 库【代码实现】
1 首次使用:环境底噪采集(必做!)
C4002 在新环境中必须先学习背景噪声,否则容易误报。请单独烧录官方校准示例 autoEnvCalibration.ino,上电后 10 秒内离开房间,保持 40 秒无人状态完成校准。详细步骤见 C4002 维库(https://wiki.dfrobot.com.cn/SKU_ ... 20Presence%20Module)。
2 主程序:喝水提醒器
- /*!
- * 智能喝水提醒器
- * 主控:Bluno Nano + C4002 毫米波传感器
- * 功能:检测到室内有人时,每 30 秒点亮灯丝 10 秒
- */
- #include <SoftwareSerial.h>
- #include "DFRobot_C4002.h"
-
- // C4002 软串口:Nano.D4(RX) <- C4002.TX, Nano.D5(TX) -> C4002.RX
- SoftwareSerial mySerial(4, 5);
- DFRobot_C4002 c4002(&mySerial, 115200);
-
- const int RELAY_PIN = 13; // D13 接继电器 SIG
- const unsigned long CYCLE_MS = 30000; // 30 秒周期
- const unsigned long ON_MS = 10000; // 10 秒点亮
-
- bool someonePresent = false;
- unsigned long cycleStart = 0;
-
- void setup() {
- Serial.begin(115200); // USB/蓝牙调试口
- pinMode(RELAY_PIN, OUTPUT);
- digitalWrite(RELAY_PIN, LOW);
-
- // 初始化 C4002
- while (c4002.begin() != true) {
- Serial.println("C4002 初始化失败,1秒后重试...");
- delay(1000);
- }
- Serial.println("C4002 初始化成功!");
-
- // 关闭模块 LED,避免光污染
- c4002.setRunLedState(eLedOff);
- delay(50);
- c4002.setOutLedState(eLedOff);
- delay(50);
-
- // 分辨率 80cm,15 个距离门,最大约 11.6m
- c4002.setResolutionMode(eResolution80Cm);
- delay(50);
-
- // 检测范围 0 ~ 11m(根据房间大小调整,单位 cm)
- c4002.setDetectRange(0, 1100);
- delay(50);
-
- // 启用全部 15 个距离门
- uint8_t gateState[15] = {
- C4002_ENABLE, C4002_ENABLE, C4002_ENABLE, C4002_ENABLE,
- C4002_ENABLE, C4002_ENABLE, C4002_ENABLE, C4002_ENABLE,
- C4002_ENABLE, C4002_ENABLE, C4002_ENABLE, C4002_ENABLE,
- C4002_ENABLE, C4002_ENABLE, C4002_ENABLE
- };
- c4002.configureGate(eMotionDistGate, gateState);
- delay(50);
- c4002.configureGate(ePresenceDistGate, gateState);
- delay(50);
-
- // 目标消失延迟 2 秒(人离开后多久判定为无人)
- c4002.setTargetDisappearDelay(2);
- delay(50);
-
- // 数据上报周期 1 秒(10 × 0.1s)
- c4002.setReportPeriod(10);
- delay(50);
-
- Serial.println("系统就绪,开始检测...");
- }
-
- void loop() {
- // 读取传感器数据
- sRetResult_t ret = c4002.getNoteInfo();
-
- if (ret.noteType == eResult) {
- eTargetState_t state = c4002.getTargetState();
- bool detected = (state == ePresence || state == eMotion);
-
- if (detected && !someonePresent) {
- someonePresent = true;
- cycleStart = millis();
- Serial.println("检测到有人,启动 30s 提醒周期");
- } else if (!detected && someonePresent) {
- someonePresent = false;
- digitalWrite(RELAY_PIN, LOW);
- Serial.println("人员离开,停止提醒");
- }
- }
-
- // 周期控制:30s 内前 10s 吸合继电器(灯亮),后 20s 断开(灯灭)
- if (someonePresent) {
- unsigned long phase = (millis() - cycleStart) % CYCLE_MS;
- digitalWrite(RELAY_PIN, (phase < ON_MS) ? HIGH : LOW);
- }
-
- delay(50);
- }
复制代码 【演示视频】
|