给竹子垫高一层,再教它自己开灯
给竹子垫高一层再教它自己开灯为了给竹子接上 AMS、解决料盘卡料我搜了一圈没有找到完全满足要求的现成产品于是自己画模型、3D 打印做了一个会看人、会看打印动作、也能远程控制的智控增高架。本文沿着脑图、四根 GPIO 和装配过程讲起对照早期视频与当前公开固件拆开灯带计时、MQTT 控制和网页升级并说明风扇与复刻资料还缺哪些部分。鸿尘客 Honchic · 机器人开发这是我的第一个 DIY 作品算是开端。当时脑子里突然冒出一个想法竹子的 AMS 要装到 P1S 上料盘卡料的问题也一直挂着能不能给打印机垫一层架子顺便把它变得更好用一点想法有了我先去搜现成的产品。搜来搜去没有一款完全满足我的要求那就自己动手。我的要求是自己一条条理出来的架子要能承重要能封箱打印四周要有灯要能联网远程控制还要能靠红外感知人和打印动作。这些后来都写进了脑图里。增高架本来是件很朴素的东西。垫高一层扛住上面的重量任务就算完成了。可这一层空间都腾出来了不往里塞点东西总觉得有点亏。于是它多了一圈灯带、两个红外检测模块和一块 ESP-01S。走过去看打印进度灯自己亮打印结束过一会儿自己灭人不在旁边也能从手机上给它下指令。一层垫子就这样变成了打印机的小中控。先在脑图里把账算清楚动手之前我先开了一张脑图把这件事拆成功能、硬件、软件三支。视频里能看到它是一点点长出来的起初只有三个空分支后来才填进增高架、人体检测和云端控制。功能这一支写得很贪心。增高架要承重要能封箱打印前后装风扇四周再绕一圈灯带做顶部照明。电控部分另加三样人体检测、打印任务检测还有云端联网控制。硬件清单倒是不长部件在这里干什么ESP-01S 继电器模块主控负责联网用继电器开关灯带红外检测模块 ×2一个看机外有没有人一个看机内有没有打印动作COB 灯带环绕增高架一圈做顶部照明静音风扇 ×6前后通风为封箱打印准备USB 转端子线取电接线自锁 LED 按钮风扇总控开关主控选 ESP-01S理由也写在制作流程里利用它的四个小端口同时完成外部人体检测和内部打印动作检测。整块模块能拿来干活的 GPIO 就四根要接一路继电器、两路红外还想给风扇留个位置。四个小端口极限压榨。四根 GPIO一根不剩当前仓库的固件里四根引脚是这样分的引脚GPIO用途RelayPINGPIO2继电器开关灯带Relay2PINGPIO0预留的第二路继电器TXDPINGPIO1机内红外检测占用串口 TXRXDPINGPIO3机外人体红外检测占用串口 RX灯带继电器按低电平开、高电平关来控制固件运行起来后会先拉低 GPIO2让灯亮起来。复刻时要先核对自己手上模块的触发电平。ESP-01S 的这几根脚每根都有自己的本职工作。GPIO0 和 GPIO2 跟启动有关。上电那一刻它们的电平参与决定芯片怎么启动正常从 Flash 运行需要两根都是高电平GPIO0 被拉低芯片就进了下载模式乖乖等人烧录。GPIO1 和 GPIO3 原本是串口的 TX、RX烧录固件、打印日志都走它们。拿来读红外串口调试就得让一让路。视频里的代码用Debug开关控制部分串口打印。当前仓库只屏蔽了部分调试日志仍会初始化串口、输出连接信息不能把这个开关当成串口已经彻底空出来。复刻时可以记两件小事。烧录或者看串口日志前先把接在 GPIO1、GPIO3 上的红外模块断开免得它们和串口抢线。接在 GPIO0、GPIO2 上的模块也要确认上电时不会把引脚拉低否则板子可能卡在启动阶段看起来像是坏了其实只是没起来。第二路继电器留在 GPIO0。视频里风扇还没装电路图先把端口留了出来。灯什么时候亮听谁的一圈灯带一个继电器听起来很简单。麻烦的是规矩。什么时候该亮什么时候该灭几路信号一起来了到底听谁的。脑图里的软件那一支我先写了五条设计规则。灯带和红外先做起来风扇那两条留给后面的安装与控制补齐云端下发指令时自动检测全部停下。有打印任务时灯带自动打开打印完成后延时关闭。没有任务时灯带默认关着感应到有人才亮延时后自动关闭。自锁按钮打开后风扇才加入自动检测否则风扇全关。风扇加入后有任务时自动开启打印完成后自动关闭。第一条放在最前面。如果手机上点了「开」灯却因为没检测到人又自己灭掉云端那一下就白点了。这张脑图和下面的示意图画的是我想要的控制顺序。当前固件的接管方式还要分开、关来看。收到on后灯持续亮着自动检测暂停收到off后灯先关闭同时恢复自动检测。随后红外再次触发灯仍可能亮起来。远程关灯不会一直锁住关闭状态。脑图里「没任务时默认关灯」也是目标规则。当前代码上电先亮灯再进入检测和计时逻辑启动时的表现要分开看。两个红外的分工很明确。机外那个看人有人走近就亮灯。机内那个看打印动作里面一直在动就当作有任务在跑。它没有去读打印机的任务状态靠的是机内那个红外模块。代价是它只认动作两次动作之间隔得久一点它分不清机器是在歇口气还是真的打完了。关灯前留一段延时就是给这种间隙留的余量。延时多长脑图里一开始写的是 10 秒后来改成了「XX 秒」留给调试再定。视频里的早期版本写得很直接检测到信号就拉继电器delay(10000)等上 10 秒再切回去。delay()写起来省事代价是整个循环在这 10 秒里停住。早期版本把 MQTT 消息处理排在检测后面这段时间轮不上它云端发来的指令只能等着两路检测接连触发等待还会叠加。当前仓库已经把这两段长等待改成了millis()计时。每一圈记下现在的时间再跟上一次动作的时间比较主循环继续往下跑。当前固件的检测逻辑动作与等待条件机内红外有动作开灯刷新机内计时并清空机外计时机内最后一次动作后满 30 秒才进入机外人体检测与关灯判断机外红外有动作开灯刷新机外计时已进入机外判断机外最后一次动作后满 20 秒关灯若机外从未触发也关灯这两个时间是代码中实际比较的数值不是简单把 30 秒和 20 秒相加。两路检测还各留了 50 毫秒的消抖等待所以它去掉了原先的 10 秒阻塞但还没有完全消除短暂停顿。从一块板子到一层架子规矩定好下面就是动手开干。先建模。板子上阵列了一排长条通风槽一格一格排得整整齐齐。模型画完零件交给 P1S 自己打。打印机给自己打增高垫这活儿它干得倒是一点不含糊。然后是代码框架和电路图。再然后就是接线、调试、接线、调试。灯带沿着增高架内圈贴了一整圈装回打印机上点亮打印区域一下子亮堂了。ESP-01S 继电器模块这个小中控我给它做了个磁吸架藏在打印机侧边。视频里装好后又测了一轮。机外检测正常机内检测正常云端控制也正常。云端那一路视频里录的这一版云端接的是阿里云物联网平台。代码按平台规则拼出属性主题设备订阅/sys/{PRODUCT_KEY}/{DEVICE_NAME}/thing/service/property/set。消息到了先用 ArduinoJson 解析再从params里取出开关状态写给继电器。上报用的.../thing/event/property/post主题也一并定义好了。测试时我在手机上打开物联网平台的调试页找到「智能灯开关」点一下设置灯带就跟着亮了。视频记录的是早期阿里云版本。后来代码接入了自建 MQTT、微信小程序和 Home Assistant现在公开的DIY_3DPrint_Parts仓库保存的是这一版。两条链路分开看视频中的阿里云主题不能直接拿来控制当前固件。自建 MQTT 版的客户端 ID 是3D_Print主题也重新起了名字主题方向内容3D_client/sub设备发布上报继电器状态Wechat/pub设备订阅微信小程序的控制指令HA/3D_Control设备订阅Home Assistant 的控制指令固件每 5 秒上报一次继电器状态。灯开着时数据长这样{info:{name:3D_Print},param:{relay_pin:on}}关灯时relay_pin的值换成off。这个值来自 GPIO2 的电平表示控制输出的状态不是灯带是否真的发光也不是打印机的任务状态。小程序控制使用info.name和equipment.switch1。一条开灯消息可以这样写{info:{name:Wechat},equipment:{switch1:on}}关灯时把switch1改为off。协议里也留了info.time但当前代码没有用它判断消息先后或重复。Home Assistant 那一路更省事消息体直接发on或off。两个入口的格式不同发错主题或消息结构不能指望设备猜出你的意思。这份代码用 PlatformIO 管理platformio.ini定义esp01_1m环境和 Arduino 框架库依赖约束为 ArduinoJson^7.0.3、PubSubClient^2.8。具体控制逻辑集中在src/main.cpp。Wi-Fi 与 MQTT 服务配置也写在这个文件里。当前代码会调用WiFi.config(...)使用静态 IP换网络时要一起检查设备 IP、网关、子网和 DNS不能只改 Wi-Fi 名称与密码。代码还接入了ESP8266WebServer和网页 HTTP OTA默认升级入口在设备本地 IP 下的/update。先通过串口烧好固件、让设备连入局域网再从浏览器上传新的固件文件才有机会少拆一次藏在侧边的小盒子。MQTT 连接使用 1883 明文端口当前connect()调用只传客户端 ID没有传用户名和密码网页升级也没有设置登录凭据。复刻时要改成自己的配置认证需要补进连接代码不能只在服务端设密码。网络部分还写了断线重连和约 48 小时自动重启。这里也留着需要继续打磨的地方MQTT 重连会反复等待 broker连不上时后面的检测和网页服务也会等控制主题只在启动时订阅重连后还需要重新订阅。定时重启接上了长期稳定性仍要靠设备运行来检验。想先把固件跑起来可以先从灯带和两路检测开始把最小的一圈接通再考虑风扇。当前公开仓库收录了电控固件增高架模型、电路源文件和完整物料规格还没有放进去文章里的部件表和视频截图能帮助理解但还不是一套完整的复刻资料。仓库也未附许可证使用范围需要另行明确。用 PlatformIO 打开仓库根目录选esp01_1m环境。在src/main.cpp中换成自己的网络与 MQTT 配置再核对继电器触发电平和两路传感器的信号。编译后用自己的串口烧录器首次上传。烧录时断开 GPIO1、GPIO3 上的红外模块按 ESP-01S 的下载模式连接 GPIO0烧录后再恢复正常启动接线。分别验证机内动作、机外人体检测、MQTT 开关与恢复自动的行为再试设备本地的/update页面。先确认灯带控制符合预期再继续扩展。工程的编译与串口上传命令是pio run-eesp01_1m pio run-eesp01_1m--targetupload串口上传还需要实际烧录器、供电和正确的下载模式接线。这两行命令不会替你把线接好。风扇的位置先空着六个静音风扇和那颗自锁按钮是为夏天准备的。脑图里写着「夏天就可以愉快的封箱打印 PLA 材料啦」风扇就是为这一句准备的。视频里风扇这一路还没装。位置、端口和设计规则先留着当前固件也仅声明了 GPIO0 这根预留脚没有初始化风扇输出更没有自锁按钮和风扇的控制逻辑。后面要补的是供电、接线和代码不只是把六个风扇拧上去。脑洞先落地细节慢慢打磨。增高架里的位置先给它留着。AMS 最后稳稳坐了上去。我用它打了一块多色的磁吸封箱板吸在正面顺手把多色打印也测了一遍。一开始只是想给 AMS 垫高一层。现在这一层会看人会看打印机也听手机的话。走过去灯亮了。走开一会儿它自己熄掉。灯先亮起来了风扇的位置还给下一步留着。鸿尘客 Honchic · 把脑洞焊到电路板上