1. 项目概述:为什么需要智能牙刷消毒架?
每天早晚刷牙是我们保持口腔健康的基本习惯,但很少有人关注牙刷本身的卫生状况。实际上,牙刷长期处于潮湿的卫生间环境中,刷毛间残留的牙膏和食物残渣会成为细菌滋生的温床。研究表明,使用一个月后的牙刷可能携带超过100万细菌,包括大肠杆菌和葡萄球菌等致病菌。
传统解决方法是定期更换牙刷(建议每3个月更换一次)或用开水烫洗,但这些方式要么成本较高,要么杀菌效果有限。紫外线杀菌技术(UV-C)作为一种成熟的消毒手段,被广泛应用于医疗设备和饮用水处理领域。其原理是通过253.7nm波长的紫外线破坏微生物的DNA/RNA结构,使其失去繁殖能力,杀菌率可达99.9%。
这个DIY项目将实现一个具备以下功能的智能牙刷架:
- 每日定时紫外线杀菌(默认设置:每天两次,每次5分钟)
- 人体感应安全保护(检测到有人靠近时自动关闭UV灯)
- 刷牙习惯养成提醒(可设置固定时间提醒)
- 所有功能通过Arduino编程灵活可调
2. 硬件选型与电路设计
2.1 核心控制器选择
在嵌入式开发领域,Arduino Uno R3是最经典的入门级开发板,特别适合此类智能家居小项目。选择理由如下:
-
开发友好性:
- 基于ATmega328P单片机,16MHz主频完全满足本项目需求
- 丰富的社区资源和示例代码(本项目所有代码都可在Arduino IDE中直接编译)
- 通过USB接口即可烧录程序,无需额外编程器
-
硬件扩展能力:
- 14个数字I/O引脚(本项目仅需占用5个)
- 6个模拟输入引脚(备用)
- 支持5V和3.3V外设供电
注意:虽然ESP32在WiFi功能上更有优势,但本项目不需要联网功能,且Arduino更简单可靠。如果后续需要添加手机提醒功能,可考虑升级到ESP8266或ESP32。
2.2 功能模块详解
2.2.1 UV杀菌模块
选用5V供电的UV LED模块(波长254nm),关键参数:
- 功率:3W
- 杀菌范围:直径30cm内有效
- 工作电流:600mA
- 寿命:约8000小时
由于UV LED工作电流超过Arduino引脚的最大输出能力(20mA),必须通过继电器控制:
arduino复制// UV灯控制引脚定义
#define UV_PIN 8
void setup() {
pinMode(UV_PIN, OUTPUT);
digitalWrite(UV_PIN, LOW); // 初始状态关闭
}
void startSterilization() {
digitalWrite(UV_PIN, HIGH);
Serial.println("UV杀菌启动");
}
void stopSterilization() {
digitalWrite(UV_PIN, LOW);
Serial.println("UV杀菌停止");
}
2.2.2 人体感应模块(HC-SR501)
这是一个基于红外热释电原理的运动传感器,在本项目中用于安全防护:
技术特性:
- 检测角度:<100°
- 检测距离:3-7米可调
- 输出信号:高电平(3.3V)触发
- 延时时间:0.5-200秒可调
接线示意图:
code复制HC-SR501 Arduino
VCC → 5V
OUT → D2
GND → GND
消抖处理代码示例:
arduino复制#define PIR_PIN 2
bool humanDetected = false;
void setup() {
pinMode(PIR_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(PIR_PIN), pirInterrupt, CHANGE);
}
void pirInterrupt() {
static unsigned long lastInterrupt = 0;
unsigned long currentTime = millis();
// 消抖处理(500ms内只响应一次)
if(currentTime - lastInterrupt > 500) {
humanDetected = digitalRead(PIR_PIN) == HIGH;
lastInterrupt = currentTime;
}
}
2.2.3 RTC时钟模块(DS3231)
相比软件计时,硬件RTC具有以下优势:
- 独立晶振,计时精准(误差±2ppm,约每年1分钟)
- 断电后继续运行(内置电池)
- 自动处理闰年、月份天数
初始化代码:
arduino复制#include <RTClib.h>
RTC_DS3231 rtc;
void setup() {
if (!rtc.begin()) {
Serial.println("找不到RTC模块!");
while(1);
}
// 首次使用时需要设置时间
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
2.2.4 蜂鸣器提醒模块
选用5V有源蜂鸣器(内置振荡电路),特点:
- 驱动简单(高电平即响)
- 声音频率固定(约2.7kHz)
- 电流消耗:<30mA
典型控制代码:
arduino复制#define BUZZER_PIN 9
void remindBrushTeeth() {
for(int i=0; i<3; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
delay(200);
}
}
2.3 完整电路连接
遵循"共地"原则的接线方案:
| Arduino引脚 | 连接模块 | 备注 |
|---|---|---|
| 5V | 所有模块VCC | 并联供电 |
| GND | 所有模块GND | 必须共地 |
| D2 | HC-SR501 OUT | 人体检测中断引脚 |
| D8 | 继电器IN | 控制UV灯 |
| D9 | 蜂鸣器正极 | 刷牙提醒 |
| A4 (SDA) | DS3231 SDA | I2C通信 |
| A5 (SCL) | DS3231 SCL | I2C通信 |
安全提示:UV灯工作时避免直视,建议将灯珠朝向牙刷内侧安装。继电器建议选用光耦隔离型号(如SRD-05VDC-SL-C),增强电路安全性。
3. 软件设计与实现
3.1 系统流程图设计
核心逻辑遵循"初始化→检测→控制"的循环:
mermaid复制graph TD
A[系统初始化] --> B[读取RTC时间]
B --> C{是否到达提醒时间?}
C -->|是| D[触发蜂鸣器提醒]
C -->|否| E{是否到达消毒时间?}
E -->|是| F[检测人体存在]
F -->|无人| G[启动UV消毒5分钟]
F -->|有人| H[延迟检测]
G --> I[完成消毒]
D --> J[等待2分钟]
J --> K{检测牙刷移动?}
K -->|是| L[记录刷牙事件]
K -->|否| M[再次提醒]
3.2 核心功能实现
3.2.1 时间管理
使用RTC模块实现精准计时:
arduino复制// 默认设置:早上7:30和晚上21:00提醒刷牙
const TimeSpan remind1 = TimeSpan(0, 7, 30, 0);
const TimeSpan remind2 = TimeSpan(0, 21, 0, 0);
// 默认消毒时间:提醒后30分钟开始
const TimeSpan sterilizeAfter = TimeSpan(0, 0, 30, 0);
bool checkReminderTime(const DateTime& now) {
TimeSpan current(0, now.hour(), now.minute(), now.second());
return (current >= remind1 && current <= remind1 + TimeSpan(0,0,2,0)) ||
(current >= remind2 && current <= remind2 + TimeSpan(0,0,2,0));
}
3.2.2 安全保护机制
双重防护设计:
- 人体检测立即中断UV工作
- 消毒时长硬限制(不超过10分钟)
arduino复制void runSterilization() {
unsigned long startTime = millis();
const unsigned long MAX_DURATION = 10 * 60 * 1000; // 10分钟上限
while(millis() - startTime < MAX_DURATION) {
if(humanDetected) {
stopSterilization();
return;
}
delay(1000);
}
stopSterilization();
}
3.2.3 状态指示灯设计
利用板载LED(D13)显示不同状态:
- 常亮:系统正常运行
- 慢闪(1Hz):等待消毒时间
- 快闪(5Hz):正在消毒中
- 双闪:检测到人体
arduino复制void updateStatusLED() {
static unsigned long lastBlink = 0;
static bool ledState = false;
if(sterilizing) {
// 快闪模式
if(millis() - lastBlink > 100) {
ledState = !ledState;
digitalWrite(LED_BUILTIN, ledState);
lastBlink = millis();
}
}
else if(humanDetected) {
// 双闪模式
if(millis() - lastBlink > 200) {
ledState = !ledState;
digitalWrite(LED_BUILTIN, ledState);
if(!ledState) delay(100);
lastBlink = millis();
}
}
else {
// 常亮/慢闪
digitalWrite(LED_BUILTIN, checkReminderTime(rtc.now()) ? HIGH : LOW);
}
}
3.3 完整代码架构
模块化设计便于维护:
arduino复制#include <Wire.h>
#include <RTClib.h>
// 引脚定义
#define UV_PIN 8
#define PIR_PIN 2
#define BUZZER_PIN 9
// 全局变量
RTC_DS3231 rtc;
volatile bool humanDetected = false;
bool sterilizing = false;
void setup() {
initHardware();
initRTC();
Serial.begin(9600);
}
void loop() {
DateTime now = rtc.now();
if(checkReminderTime(now)) {
remindBrushTeeth();
}
if(shouldStartSterilize(now) && !humanDetected) {
startSterilization();
runSterilization();
}
updateStatusLED();
delay(1000);
}
// 各功能函数实现...
4. 组装与调试要点
4.1 机械结构设计
建议采用3D打印外壳,设计考虑:
- 防水处理:UV灯区域与电子仓隔离
- 散热设计:UV LED需要铝基板散热
- 牙刷固定:倾斜15°角利于排水
尺寸参考:
- 主体尺寸:120mm × 80mm × 60mm
- UV灯安装高度:距牙刷头50mm
- 人体传感器视角:向下倾斜20°
4.2 常见问题排查
问题1:UV灯不工作
- 检查继电器是否吸合(可听到"咔嗒"声)
- 测量UV LED两端电压(应为5V±0.5V)
- 确认程序是否正确输出高电平
问题2:人体感应误触发
- 调整HC-SR501上的两个电位器:
- 距离调节(顺时针增大)
- 延时调节(逆时针缩短)
- 确保传感器不被阳光直射
问题3:时间不准
- 检查DS3231电池电压(应≥3V)
- 重新烧录程序时会自动同步电脑时间
- 可通过串口命令手动调整:
arduino复制void setManualTime() {
if(Serial.available()) {
int y = Serial.parseInt();
int m = Serial.parseInt();
int d = Serial.parseInt();
int hh = Serial.parseInt();
int mm = Serial.parseInt();
rtc.adjust(DateTime(y, m, d, hh, mm, 0));
}
}
4.3 参数优化建议
通过修改以下常量调整系统行为:
arduino复制// 在代码开头修改这些参数
const int STERILIZE_DURATION = 5 * 60; // 消毒时长(秒)
const int REMIND_INTERVAL = 120; // 提醒间隔(秒)
const int MAX_RETRY = 3; // 最大提醒次数
5. 项目优化方向
-
低功耗改进:
- 改用ATTiny85等低功耗MCU
- 添加运动唤醒功能(通过PIR传感器)
- 预计可使待机电流从50mA降至5μA
-
功能扩展:
- 增加OLED显示屏显示状态
- 添加蓝牙模块连接手机APP
- 记录刷牙时长统计数据
-
生产工艺优化:
- 设计PCB替代杜邦线连接
- 使用SMD元件缩小体积
- 批量生产可降低成本至50元以内
实际使用中发现,早晨的刷牙提醒比晚上更有效。建议将第一次消毒时间设置在提醒后15分钟(而非30分钟),这样更能匹配大多数人的起床后作息。另外,在潮湿地区使用时可考虑在壳体内加入少量硅胶干燥剂,延长电子元件寿命。