公司动态
基于ESP8266与振动传感器的烘干机智能通知器DIY指南
1. 项目缘起一个被遗忘的“家务定时器”你有没有过这样的经历把一堆湿漉漉的衣服塞进烘干机设定好程序然后转身就去忙别的事了。可能是去处理工作邮件可能是去陪孩子玩也可能是窝在沙发里刷手机。然后一两个小时过去了甚至更久你才猛然想起“哎呀我的衣服”冲过去打开烘干机门一股闷热潮湿的气味扑面而来原本应该蓬松柔软的衣服已经因为长时间闷在里面而变得皱巴巴甚至有些地方已经捂出了异味不得不重新再烘一遍。更糟的是如果烘的是容易缩水的羊毛衫或者娇贵的面料一次遗忘可能就意味着这件衣服的“职业生涯”提前结束了。这个场景就是我决定动手做这个“烘干机通知器”Dryer Notifier的最初动机。它本质上是一个极其简单的物联网小装置核心任务就一个在烘干机工作结束时第一时间通知我。听起来是不是有点“杀鸡用牛刀”毕竟烘干机本身就有结束提示音。但现实是在嘈杂的居家环境里比如开着电视、吸尘器或者人在另一个房间那个微弱的“滴滴”声太容易被忽略了。而手机推送通知几乎是我们这个时代最无法忽视的提醒方式。所以这个项目的目标非常明确不改造烘干机本身避免保修和安全隐患不依赖复杂的云端服务保证响应速度和隐私用最低的成本和最简单的技术实现一个可靠、及时的本地化通知系统。下面我就把自己从构思、选型到实现、优化的完整过程以及踩过的几个坑毫无保留地分享出来。2. 核心方案选型为什么是“振动传感器ESP8266”市面上能实现类似功能的思路有很多比如用电流传感器监测烘干机是否耗电、用温湿度传感器探测出风口温度变化、甚至用声音传感器识别烘干机特有的噪音模式。但在经过一番对比和实际测试后我最终选择了“振动传感器”作为感知单元搭配“ESP8266”微控制器作为大脑。这里详细拆解一下为什么这么选。2.1 感知层振动传感器的压倒性优势烘干机在工作时尤其是滚筒式烘干机内部滚筒会持续转动带动整个机器产生规律性的、低频的振动。当工作结束滚筒停止这种振动会立刻消失。监测这种“从有到无”的状态变化比监测“从无到有”如结束提示音要稳定和直接得多。对比电流监测智能插座智能插座方案看似优雅但存在两个问题。一是烘干机功率很大通常2000-3000瓦对智能插座的负载能力和安全性要求很高成本陡增。二是烘干机的工作周期并非持续高功率它可能有加热、吹风、冷却等多个阶段功率曲线复杂准确判断“真正结束”而非“暂停”的算法比较复杂容易误报。对比温湿度传感器出风口温度确实会在结束时下降但下降是个相对缓慢的过程而且受环境温度影响大。你需要设定一个阈值和延时来判断响应不够及时。湿度变化同样缓慢且滞后。对比声音传感器家庭环境背景噪音复杂洗衣机、说话声、电视声都是干扰。要精准识别烘干机结束的特定声音模式需要做音频模式识别对微控制器算力和算法都是挑战不稳定。振动传感器则完美避开了上述问题。它只关心一件事有没有持续的、规律性的机械振动。安装极其简单用双面胶贴在烘干机外壳上即可成本极低一个模块不到10元判断逻辑极其简单持续检测到振动 - 工作中持续一段时间检测不到振动 - 工作结束。这种“物理接触式”的感知受环境干扰最小可靠性最高。我选用的是常见的SW-420 常闭型振动传感器模块。它输出的是数字信号高电平或低电平ESP8266只需要读取一个GPIO引脚的状态即可无需复杂的模拟信号处理和AD转换大大简化了程序。注意一定要选“常闭型”Normally Closed。这意味着在静止状态下模块输出低电平0当检测到振动时内部簧片断开输出高电平1。这样设计的好处是即使传感器连线意外脱落微控制器会读取到持续的低电平静止状态而不会误判为持续振动安全性更好。2.2 控制与通信层ESP8266为何是唯一解有了传感器信号我们需要一个设备来读取它、判断烘干机状态、并在状态改变时发送通知。这个设备需要1) 能运行逻辑程序2) 有Wi-Fi功能3) 低功耗可选4) 足够便宜且易用。ESP8266以及其升级版ESP32几乎是这个场景下的标准答案。强大的网络能力与生态系统ESP8266自带Wi-Fi可以直接连接家庭路由器。围绕它有无数的开源库如Arduino Core for ESP8266和社区支持实现HTTP请求、MQTT通信等都易如反掌。足够的IO和性能对于读取一个数字传感器、处理些简单逻辑、发起网络请求来说ESP8266的性能绰绰有余。成本与供电一个NodeMCU或D1 Mini开发板价格在15-25元之间。它可以通过Micro USB供电我直接用一个旧的手机充电插头USB线就能让它7x24小时工作功耗大约在70-150mA长期运行电费可忽略不计。为什么不直接用手机App因为你需要一个始终在线、持续监测的“哨兵”。手机App无法在后台持续监听传感器耗电和系统限制巨大。这个“哨兵”角色正是ESP8266这类物联网设备的专长。2.3 通知渠道舍弃复杂云端拥抱轻量级Bot发送通知的途径很多比如邮件、短信、或者自己搭一个推送服务器。但我追求的是极致的简单和快速。我选择了Telegram Bot作为通知渠道。原因如下零成本创建Bot、发送消息都是免费的没有条数限制。极低延迟Telegram的推送服务非常迅速几乎可以做到秒级到达。配置简单只需要在Telegram里和BotFather对话创建一个Bot获取一个Token再获取你自己的Chat ID即可。无需注册第三方推送服务无需处理复杂的OAuth。跨平台Telegram有手机App、电脑客户端、网页版通知能同步到达所有设备。整个数据流就非常清晰了振动传感器 - ESP8266 - 家庭Wi-Fi - 互联网 - Telegram 服务器 - 我的手机/电脑。所有环节都在我控制之下没有数据经过不必要的第三方。3. 硬件搭建与电路连接五分钟完成的物理部分这部分其实非常简单几乎可以说是“即插即用”。你需要准备以下硬件ESP8266开发板一块如NodeMCU或Wemos D1 Mini。SW-420 常闭型振动传感器模块一个。杜邦线若干公对公或公对母根据你的板子接口决定。Micro USB数据线及5V充电器一个。双面胶或纳米胶少许用于固定传感器。电路连接示意图如下ESP8266 (NodeMCU) 引脚SW-420 振动传感器模块引脚说明3.3VVCC给传感器供电。切记接3.3V不要接5VGNDGND共地。D5 (GPIO14)DO(数字输出)用于读取传感器数字信号。这里选择D5你也可以选其他数字引脚如D1、D2等。重要提示SW-420模块上通常有一个电位器用于调节灵敏度。顺时针旋转增大灵敏度更易触发逆时针减小。建议先逆时针调到灵敏度最低然后慢慢顺时针调整直到烘干机正常工作时能稳定触发板载LED灯亮而周围人走过或轻微触碰机器不会误触发为止。这是一个关键的调试步骤能有效防止误报。连接好后用双面胶把传感器模块牢牢贴在烘干机外壳的侧面或顶部。位置选择有讲究不要贴在门或者控制面板这些本身不震动的部位要贴在主箱体上最好是靠近滚筒电机的位置这样振动信号最强烈。贴好后可以手动晃动一下烘干机看看ESP8266这边的信号指示灯如果有的话或者后续程序能否正确检测到。硬件部分至此结束。是不是比想象中简单真正的核心在软件逻辑。4. 软件逻辑详解从振动信号到可靠通知硬件只是感官软件才是大脑。程序需要完成几个关键任务连接Wi-Fi、持续监测传感器信号、准确判断“工作结束”事件、以及触发网络通知。这里面的坑主要就在“准确判断”上。4.1 核心状态机防抖与延时判定最天真的想法是传感器输出高电平1 - 机器在转输出低电平0 - 机器停了发通知。但这样会疯狂误报。因为滚筒转动不是绝对匀速传感器信号可能会有微小的抖动造成瞬间的“低电平”毛刺。此外烘干机可能有“暂停”或“冷风”阶段滚筒暂时停转几分钟。因此必须引入状态机和延时判定。我的逻辑是这样的工作状态WORKING当持续检测到振动信号高电平超过一个很短的时间比如2秒则认为烘干机确实启动了进入WORKING状态。监测状态MONITORING在WORKING状态下我们开始留心“停止”的信号。一旦检测到振动信号消失变为低电平不要立即行动而是启动一个延时计时器。结束判定END_JUDGEMENT在这个延时期间我设置为90秒持续检查振动信号。如果期间振动信号恢复说明只是短暂暂停则清零计时器回到WORKING状态。如果90秒内再无任何振动则确信工作已结束触发通知。空闲状态IDLE发送通知后系统回到IDLE状态等待下一次振动信号到来重新进入WORKING状态。这个90秒的延时是关键参数。设得太短如30秒容易在烘干机暂停时误报结束设得太长如3分钟则通知不够及时。根据我对自家烘干机的观察其暂停间隔很少超过1分钟90秒是一个兼顾了可靠性和及时性的值。你需要根据自家机器的特性调整这个参数。4.2 网络通知实现Telegram Bot API调用判断工作结束后需要调用Telegram Bot的API发送一条消息。这本质上就是一个HTTP GET请求。在Arduino环境下我们可以使用WiFiClientSecure和UniversalTelegramBot库来简化操作。首先你需要在代码开头定义你的Wi-Fi凭证和Bot信息const char* ssid 你的Wi-Fi名称; const char* password 你的Wi-Fi密码; #define BOT_TOKEN 你的Bot Token #define CHAT_ID 你的Chat IDBot Token从BotFather那里创建Bot时获得。Chat ID可以通过给Bot发送一条消息然后访问https://api.telegram.org/botYourBOTToken/getUpdates这个链接来查看。你会看到一串JSON数据里面的chat.id就是你的ID。发送消息的核心函数类似这样void sendNotification(const char* message) { WiFiClientSecure client; client.setInsecure(); // 对于简单应用可以跳过证书验证。生产环境建议处理证书。 HTTPClient https; String url https://api.telegram.org/bot String(BOT_TOKEN) /sendMessage; String payload chat_id String(CHAT_ID) text String(message); https.begin(client, url); https.addHeader(Content-Type, application/x-www-form-urlencoded); int httpCode https.POST(payload); if (httpCode 0) { Serial.printf([HTTP] POST... code: %d\n, httpCode); } else { Serial.printf([HTTP] POST... failed, error: %s\n, https.errorToString(httpCode).c_str()); } https.end(); }当判定结束时调用sendNotification(✅ 烘干机工作已完成);即可。4.3 完整程序框架与关键代码片段以下是主循环逻辑的伪代码体现了上述状态机// 定义状态和引脚 enum DryerState { IDLE, WORKING, MONITORING }; DryerState currentState IDLE; const int vibrationSensorPin D5; unsigned long stopDetectionStartTime 0; const unsigned long WORK_DELAY_MS 2000; // 持续2秒振动认为工作开始 const unsigned long STOP_DELAY_MS 90000; // 持续90秒无振动认为工作结束 void loop() { int sensorValue digitalRead(vibrationSensorPin); // 高电平振动中 switch (currentState) { case IDLE: if (sensorValue HIGH) { delay(WORK_DELAY_MS); // 简单防抖实际应用建议用非阻塞式计时 if (digitalRead(vibrationSensorPin) HIGH) { Serial.println(进入工作状态); currentState WORKING; } } break; case WORKING: if (sensorValue LOW) { // 振动停止 Serial.println(振动停止开始监测); currentState MONITORING; stopDetectionStartTime millis(); } break; case MONITORING: if (sensorValue HIGH) { // 振动恢复 Serial.println(振动恢复回到工作状态); currentState WORKING; } else if (millis() - stopDetectionStartTime STOP_DELAY_MS) { // 持续90秒无振动 Serial.println(确认工作结束发送通知); sendNotification( 烘干已完成请及时取出衣物); currentState IDLE; } break; } delay(100); // 主循环延迟 }这是一个简化版本实际代码中你需要用millis()实现非阻塞的定时避免使用delay()影响响应。还要加入Wi-Fi连接管理、断线重连、以及更完善的错误处理。5. 部署、调试与优化心得把程序烧录到ESP8266接好硬件通电事情还没完。从“能跑”到“好用”还有几步关键的调试和优化。5.1 安装位置与灵敏度微调这是确保系统可靠性的物理基础。我把ESP8266开发板和传感器模块用一个小塑料盒装起来防止灰尘和短路放在烘干机旁边的柜子上。传感器通过杜邦线引出用纳米胶牢牢贴在烘干机侧面的中部位置。第一次调试启动烘干机。观察串口监视器或通过LED指示确认机器运行时传感器信号能稳定保持在HIGH或频繁触发。如果信号不稳定需要顺时针微调传感器模块上的蓝色电位器提高灵敏度。第二次调试在烘干机运行时模拟环境干扰。比如在旁边走路、关门、说话。观察是否有误触发。如果干扰导致信号抖动则需要逆时针微调电位器降低一点灵敏度。目标是在烘干机工作时稳定触发在环境干扰下保持稳定。这个过程可能需要反复几次找到那个最佳的平衡点。我自己的经验是灵敏度调到刚好能让烘干机正常工作时模块上的指示灯常亮或频繁闪烁即可。5.2 软件层面的抗干扰与健壮性Wi-Fi断线重连家庭Wi-Fi可能不稳定。必须在代码中加入健壮的重连机制。可以在loop()开始时检查WiFi.status()如果断开则尝试重连。重连时最好有个指数退避策略避免频繁连接请求堵塞网络。通知防重复发送确保在一次“工作结束”事件中只发送一次通知。我的状态机设计从MONITORING到IDLE自然避免了这个问题。但如果你用其他逻辑务必设置一个标志位防止在结束状态徘徊时重复调用sendNotification。添加心跳或状态指示为了让我知道这个设备还“活着”我让它每24小时向Telegram发送一条“设备在线”的心跳消息。这不仅能确认设备运行正常也能间接验证网络连接。如果某天没收到心跳我就知道该去检查一下了。串口日志输出在开发调试阶段通过Serial.println()输出详细的状态变化、传感器读数、计时器信息等是排查问题的利器。即使部署后保留一些关键日志输出也有助于远程诊断。5.3 功耗与供电的考量虽然ESP8266插电运行功耗不高但如果你考虑用电池供电比如不想拉线就需要深入优化了。NodeMCU开发板因为带了USB转串口芯片待机功耗也有几十mA不适合电池供电。你需要使用裸ESP8266模块如ESP-12F并启用深度睡眠模式。在深度睡眠模式下ESP8266可以做到微安级的待机功耗。但这就带来了新的挑战振动传感器需要持续监测而深度睡眠的ESP8266无法处理中断。一个解决方案是使用带中断唤醒功能的传感器或者用一颗超低功耗的MCU如Attiny85来监测传感器当检测到状态变化时再通过一个IO口唤醒ESP8266。这会让项目复杂度提升一个数量级对于插电应用来说完全没必要但却是电池供电方向的一个可行思路。我因为方便插电就选择了最简单的常供电方案。6. 效果评估与扩展设想这个“烘干机通知器”已经在我家稳定运行了超过半年。它的效果立竿见影我再也没有忘记过正在烘干的衣服。每次手机“叮”的一声看到“烘干已完成”的消息都是一种小小的解脱和愉悦。它完美地解决了一个具体、微小的痛点。可靠性经过长时间测试误报率极低半年内可能出现过一两次与环境剧烈震动有关漏报率为零。90秒的延时判定经受住了考验。成本总计不超过50元人民币ESP8266开发板约20元传感器模块5元其余线材和电源利用闲置品。维护几乎为零。通电后就不用再管。当然任何项目都有可以优化和扩展的空间多设备与统一管理可以很容易地将这个模式复制到洗衣机上洗衣机结束时的蜂鸣同样容易被忽略。只需要再增加一套传感器和ESP8266甚至可以用一个ESP8266接两个振动传感器区分两个机器。通知消息可以改为“洗衣机任务完成”或“烘干机任务完成”。本地化Web界面给ESP8266烧录一个Web服务器固件如ESPAsyncWebServer就可以在同一个局域网内通过浏览器访问它的IP地址看到一个简单的控制面板。上面可以显示当前状态工作中/空闲、手动测试通知、甚至调整延时判定参数无需再修改代码上传。集成到智能家居平台如果你使用Home Assistant、OpenHAB等平台可以让ESP8266通过MQTT协议发布状态例如home/laundry/dryer/state的主题消息为on或off。这样烘干机状态就可以和你家的其他自动化联动比如工作结束时自动打开洗衣房的灯。电量统计进阶如果想更精确可以在振动传感器的基础上增加一个非侵入式电流传感器如SCT-013钳在烘干机的电源线上。这样不仅能判断状态还能估算本次烘干的耗电量对于能源管理有参考价值。这个项目最让我满意的不是它用了多么高深的技术而是它用一种极简、低成本、高可靠的方式实实在在地改善了我的日常生活。它证明了物联网并不总是意味着复杂的云平台、昂贵的智能家电有时候一个十几块钱的芯片一个几块钱的传感器加上一点动手的热情就能创造出专属于你自己的、贴心的小智能。如果你也有类似的烦恼不妨花上一个周末的下午动手试试看。从点亮第一颗LED到收到第一条推送通知整个过程带来的成就感远比买一个现成的产品要大得多。