1 line
204 KiB
Plaintext
1 line
204 KiB
Plaintext
|
|
{"code":200,"data":{"page":1,"posts":[{"ID":311135688323072,"Title":"我用树莓派+旧手机摄像头做了一个自动浇花系统(含全部踩坑记录)","Description":"从土壤湿度传感器生锈到程序崩溃植物渴死,分享一个自动浇花系统从零到一的全过程踩坑记录。含详细材料清单、代码和四节课。","Keywords":"树莓派,智能家居,DIY,浇花系统,IoT,传感器,自动灌溉,Python","ContentMD":"去年夏天出差一周,回来发现养的薄荷全干死了。痛定思痛,决定做一个自动浇花系统。\n\n**成品效果**:手机 App 远程查看土壤湿度、手动/自动浇水、低水位微信通知。总成本 ¥120,周末两天搞定。\n\n---\n\n## 材料清单\n\n| 组件 | 型号 | 价格 | 用途 |\n|------|------|------|------|\n| 主控 | 树莓派 Zero 2W | ¥50 | 大脑 |\n| 土壤湿度传感器 | 电容式(非电阻式!) | ¥15 | 测干湿 |\n| 继电器模块 | 1路5V继电器 | ¥8 | 开关水泵 |\n| 水泵 | 微型潜水泵 3-5V | ¥12 | 抽水 |\n| 旧手机摄像头 | 闲置安卓手机 | ¥0 | 实时画面 |\n| 软管+接头 | 4mm管材 | ¥15 | 输水 |\n| 塑料瓶 | 1.5L可乐瓶 | ¥0 | 储水罐 |\n| **总计** | | **¥100-120** | |\n\n---\n\n## 核心教训 #1:电容式 vs 电阻式湿度传感器\n\n第一次买的是电阻式(就是那种两片裸露金属的),结果插在土里三天就生锈了。而且通电时金属会发生电解反应,长期使用会腐蚀电极还污染土壤。\n\n**正确做法**:买电容式湿度传感器(型号如 SEN0193),表面覆膜不直接接触土壤,用五年都不会坏。\n\n---\n\n## 核心教训 #2:阈值不能拍脑袋\n\n一开始我设的阈值是:土壤湿度 \u003c 30% 就浇水。结果每两小时浇一次,花差点淹死。\n\n后来我做了个实验:把传感器插在浇透水的花盆里,记录 72 小时的湿度变化曲线。发现:\n\n- 刚浇完:湿度 85%-95%\n- 12 小时后:60%-70%(土壤表层开始干)\n- 24 小时后:40%-50%(可以浇水了)\n- 36 小时后:20%-30%(太干了)\n\n**最终阈值**:湿度低于 45% 开始浇水,浇到 75% 停止。每次浇水控制在 5-10 秒(根据花盆大小调整)。\n\n---\n\n## 核心教训 #3:旧手机当摄像头比 USB 摄像头好用\n\n一开始买了个 ¥30 的 USB 摄像头,结果:\n- 树莓派 Zero 的 USB OTG 供电不稳定\n- 驱动要折腾(尤其是老款摄像头)\n- 画质渣\n\n后来发现闲置的旧手机通过 DroidCam 或者 IP Webcam App 当网络摄像头,效果出奇好:\n- 1080P 画质\n- 自带红外夜视(有的手机有)\n- 通过 WiFi 连接,不需要 USB\n- 手机自己供电\n\n---\n\n## 核心教训 #4:程序意外退出是最大隐患\n\n我的 Python 脚本跑了三天,突然因为 SD 卡日志写满挂了。植物渴了一天才被发现。\n\n**解决方案**:\n1. 用 systemd 做自动重启(Restart=always)\n2. 设置看门狗(watchdog)\n3. 日志用 logrotate 自动轮转\n4. 增加「看门狗浇水」:如果程序超过 2 小时没更新状态,自动浇一次保命水(硬件定时器方案)\n\n---\n\n## 代码\n\n核心逻辑其实很简单:\n\n```python\nimport RPi.GPIO as GPIO\nimport time\nimport requests\n\n# 配置\nSOIL_PIN = 17 # 土壤传感器 GPIO\nRELAY_PIN = 27 # 继电器 GPIO\nTHRESHOLD_LOW = 45 # 低于此值浇水\nTHRESHOLD_HIGH = 75 # 高于此值停止\nWATER_TIME = 8 # 每次浇水秒数\n\ndef read_soil():\n # 读取土壤湿度 (0-100)\n # 这里需要根据实际传感器类型调 ADC\n return moisture_percent\n\ndef water_plants():\n GPIO.output(RELAY_PIN, GPIO.HIGH) # 开泵\n time.sleep(WATER_TIME)\n GPIO.output(RELAY_PIN, GPIO.LOW) # 关泵\n\nwhile True:\n moisture = read_soil()\n if moisture \u003c THRESHOLD_LOW:\n water_plants()\n send_notification(f\"已浇水,当前湿度: {moisture}%\")\n time.sleep(60) # 每分钟检查一次\n```\n\n完整代码开源在 GitHub,加上了 Telegram B
|