V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
adv007
V2EX  ›  程序员

用树莓派制作手机控制的浇花神器

  •  3
     
  •   adv007 · 2016-07-15 19:51:04 +08:00 · 22657 次点击
    这是一个创建于 3047 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道其他人有没有这样的顾虑,就是每次需要外出一些时日的时候总是担心家里的花无人浇水会干死。于是就想着是否能自己动手做一个可以用手机操控实现浇花的“半自动浇花器”呢,之所以称之为“半自动”是因为在一定程度上该设备使用了自动化控制的元件与技术,但操作依然是根据人的意志用手机来完成的因此为“半自动”。当实现自动检测土壤湿度来实现浇花并发送浇花报告到主人手机时可称之为“自动化”。 话不多说,来看看折腾这样一个东西需要准备些什么硬件和软件,有需要的人一定要耐心看完哦,内容有点多。 鉴于网络有点绕,开始前先放一下我的网络拓扑图 net 第一部分:硬件清单 1.树莓派:由于前段时间用树莓派折腾过家里的 NAS ,因此树莓派首当其冲作为智控中心用来相应手机端发出的指令 pi raspberry 2b 2.arduino :此设备与各种智能元器件通信非常方便,因此用他作为终端来和小水泵连接 pi

    adruino uno 3.5v 继电器:此设备与下面提到的小型水泵串联,来实现水泵的运行与停止 pi

    4.5v 小水泵:用来抽水的,如图,我为了方便连线,把这个 usb 头剪掉了用 4 节 7 号电池供电。这里要对水泵的电路进行简单改造,找到里面的红线(正极),剪短分别连到继电器的常开和公共端。 n 5v 小水泵 5.usb 摄像头:用来定时进行拍照,传回运行的监控图片。 a 6.其他设备: a.塑料软管,但由于塑料软管的方向性不好控制导致出水效果不好,后续考虑用一根 pvc 管来替代。 b.万用表, c.电烙铁, d.杜邦线(最好有公对母的,可用母对母和排针自制)若干。 硬件准备的差不多了,现在我们开始连线。 树莓派是一个完整的 linux 系统( debian 系统),因此 arduino 可以以 usb 设备的形式挂载,并且用串口进行通信。当然通信方式还可以有其他,读者有想试的可以自己搜索方案。 继电器的 vcc , gnd 分别连接 arduino 电源的 5v , GND 端,继电器的 in 口连接 arduino 的 13 口。 第二部分:软件清单(不包括 OS ) 1.minicom :这个可以设置树莓派与 arduino 进行串口通信的端口。自行搜索使用方法,设置成功后运行 lsusb 应该能看到 arduino 的设备 2.python :这个其实树莓派中已经内置了,并且对接了跟硬件操作的函数库,非常方便实现跟其他设备的串口通信或者操作树莓派自身的管脚 3.nginx :在树莓派上进行 http 请求转发 4.nodejs :用来处理 http 请求,来进行调用 python 程序进行串口通信进而控制 arduino 。 5.路由器:家里的路由器上设置端口转发用来将公网的 http 请求转发到树莓派的 nginx 上 6.腾讯云 vm :由于是在微信上操作,因此操作一定要在公网进行。 7.运行在腾讯云上的 redis :由于家里的路由器一般采用的动态 ip ,因此从家里路由器定时发送请求到腾讯云,程序获取此 ip 后记录到 redis 中,后续进行操作的时候先从 redis 获取此 ip ,然后请求都绑定到该 ip 上。 8.腾讯云对象存储服务( cos ):此步骤可生,因为 cos 可以当作 CDN 使用,咱可是一名前端工程师,当然需要把 h5 页面、 js 、 css 图片等资源做 cdn 分布 9.重要的 arduino ide :这个用来烧制 arduino 程序,可以在 windows 下编写好后烧制到 arduino 即可。 第三部分:关键实现 1.树莓派上的 python 进行串口通信。 readline 用来获取 arduino 的输出, write 用来向 arduino 发送指令。 2.arduino 代码:用来向继电器发送指令(其实就是高电平与低电平)控制继电器的打开与吸合。 a 3.做一个简单的手机端界面用进行操控,这里的实现方式太多了,此处不列举了。我用 react 做界面, nodejs 做后台,页面的 url 生成二维码用微信扫码后运行(记得放入微信的收藏夹) 4.鉴于网络交互还是挺绕的,这里补充一张网络拓扑图吧。以后有什么需要可以直接在这个框架上进行。 a 至此,浇花设备打造完成,放心外出吧,浇花的事情就交给他吧。浇花的同时会定时回传监控图片,用来协助你判断是否该停止浇花。嗯,到了 2.0 自动化的时候也许就不用这么麻烦了。 点击 http://www.wexincloud.com/wx/site/1531601550378395519/527081829719317795 查看图文信息

    88 条回复    2016-10-09 07:22:40 +08:00
    NeoAtlantis
        1
    NeoAtlantis  
       2016-07-15 21:32:40 +08:00 via Android
    1. 首当其冲 不是 首先的意思。
    2. 我觉得没必要搞 ip 那一段,觉得费劲还不可靠,直接让树莓派拉取指令如何?
    NeoAtlantis
        2
    NeoAtlantis  
       2016-07-15 21:34:08 +08:00 via Android   ❤️ 1
    或者可以用 xmpp 之类的协议也可以实现双向的即时消息,也犯不着这么弄。
    whyishe
        3
    whyishe  
       2016-07-15 21:49:41 +08:00 via iPhone
    没有看到传感器的描述? btw 这么一套要多少大洋?
    ltm
        4
    ltm  
       2016-07-15 21:57:10 +08:00 via Android
    浇个花,真用得着这么兴师动众
    zzutmebwd
        5
    zzutmebwd  
       2016-07-15 21:58:29 +08:00
    不明白为什么要用安德鲁 电机驱动板不好用么?
    adv007
        6
    adv007  
    OP
       2016-07-15 22:44:54 +08:00 via iPhone
    @NeoAtlantis 没有 ip 我从公网无法连接到家里路由器,路由器是动态 ip
    adv007
        7
    adv007  
    OP
       2016-07-15 22:45:29 +08:00 via iPhone
    @ltm 主要场景是出门在外
    adv007
        8
    adv007  
    OP
       2016-07-15 22:45:54 +08:00 via iPhone
    @whyishe 不到 300 人民币
    bluecubic
        9
    bluecubic  
       2016-07-15 22:58:45 +08:00 via Android
    不知道水流量,以不小心浇多了
    xrlin
        10
    xrlin  
       2016-07-15 23:02:25 +08:00
    当年我也想自己做一个,可惜没钱,一直没行动。
    manhere
        11
    manhere  
       2016-07-15 23:05:04 +08:00
    成本太高了,可以用 1/10 成本的 esp8266 来做。
    Arnie97
        12
    Arnie97  
       2016-07-15 23:11:45 +08:00 via Android
    @manhere +1 ,刚从 X 宝上 20 块钱买了个 NodeMCU ,简直神器
    adv007
        13
    adv007  
    OP
       2016-07-15 23:13:33 +08:00 via iPhone
    @manhere 是的, nodemcu 板子是可以的
    zxb
        14
    zxb  
       2016-07-15 23:24:54 +08:00 via Android
    让它自己滴水不好吗
    whyishe
        15
    whyishe  
       2016-07-15 23:26:39 +08:00 via iPhone
    @zxb 自己滴水,没法控制水量...
    Soaper
        16
    Soaper  
       2016-07-15 23:29:17 +08:00 via Android
    @whyishe 可以加一个计算雨滴那个模块改一下,放在花下面。
    zxb
        17
    zxb  
       2016-07-15 23:32:34 +08:00 via Android
    @whyishe 你要多精确的控制水量?每天给一点不会枯死就行了。
    mlhorizon
        18
    mlhorizon  
       2016-07-16 00:13:52 +08:00
    家里头那段,用个 ESP8266 就漂漂亮亮解决了。
    fatedier
        19
    fatedier  
       2016-07-16 00:20:43 +08:00
    想法真好,感觉结合视频监控之类的实现全自动化,可以扩展到很多方向。
    maemo
        20
    maemo  
       2016-07-16 00:48:38 +08:00
    不知现在的 esp8266 稳定性如何了,前年画过板子,测试稳定性不行呀
    Halry
        21
    Halry  
       2016-07-16 00:53:15 +08:00 via Android
    @maemo 是呀,经常掉线
    xiamx
        22
    xiamx  
       2016-07-16 04:32:53 +08:00
    CROS 是啥?
    Asimov
        23
    Asimov  
       2016-07-16 05:07:43 +08:00
    可以讲下浇花器改造吗?关键是硬件部分,怎么弄继电器?
    Asimov
        24
    Asimov  
       2016-07-16 05:09:06 +08:00
    我记得 Arduino 有湿度传感器之类啥的,可以插土里判断要不要浇水……
    Reign
        25
    Reign  
       2016-07-16 07:09:49 +08:00 via Android
    用智能手机控制的浇花神器,我还不如用智能手机给我妈打个电话:妈妈,家里花该浇水啦, mua ~
    shendancan
        26
    shendancan  
       2016-07-16 07:16:21 +08:00
    小米花花草草检测仪, 49
    tcdw
        27
    tcdw  
       2016-07-16 07:22:21 +08:00 via Android
    这排版是怎么回事。。
    xmoiduts
        28
    xmoiduts  
       2016-07-16 07:50:46 +08:00 via Android
    惊现 Arduino 高玩!
    我会写点 arduino ,问题来了,网络和前端的学习路线是什么样的。
    jaylong
        29
    jaylong  
       2016-07-16 08:50:28 +08:00
    完全不需要 arduino 的存在,如果水泵工作电压低于 5v 也完全没必要用继电器,因为树莓派本身的 GPIO 就可以用 Python 控制。
    aprikyblue
        30
    aprikyblue  
       2016-07-16 08:50:46 +08:00
    太复杂了吧。。就为了个浇花。。
    yxzblue
        31
    yxzblue  
       2016-07-16 08:56:28 +08:00
    这逼装得可以给 10 分
    adv007
        32
    adv007  
    OP
       2016-07-16 09:10:10 +08:00 via iPhone
    @xmoiduts 我在 qzone 做了 5 年专职前端,慢慢积累吧,多动手
    adv007
        33
    adv007  
    OP
       2016-07-16 09:10:49 +08:00 via iPhone
    @Soaper 湿度传感器
    googlebot
        34
    googlebot  
       2016-07-16 09:23:54 +08:00 via Android
    这个好,我们现在用最昂贵的方法,请朋友来家里浇花,
    搞个机器好多了,
    xmoiduts
        35
    xmoiduts  
       2016-07-16 09:31:19 +08:00 via Android
    其实相比 arduino 浇花器,这个作品更大的意义,是提供了一种智能家居的架构和思路。
    misaka19000
        36
    misaka19000  
       2016-07-16 09:56:43 +08:00
    为什么不把操作页面直接放在树莓派上面呢?
    Soaper
        37
    Soaper  
       2016-07-16 10:12:37 +08:00 via Android
    @adv007 的确更好,只想到控制水滴,没想到利用土壤湿度呢。。。
    snow9312
        38
    snow9312  
       2016-07-16 10:51:23 +08:00 via iPhone
    Arduino 检测土壤湿度自动浇水部分已经做好了。下一步想怎么让数据在 Web 上显示
    maemo
        39
    maemo  
       2016-07-16 10:52:01 +08:00
    @xmoiduts 有道理,思路很重要。重要的不是折腾的是什么,而是为什么可以这么做,把东西系统组合起来
    zonghua
        40
    zonghua  
       2016-07-16 10:52:57 +08:00
    我看三十年前的报刊是用晶体管电路做此类工具;三十年后还是做一样的东西。
    adv007
        41
    adv007  
    OP
       2016-07-16 11:14:29 +08:00
    @misaka19000 可以的,树莓派上也有 nginx 和 node ,只不过利用了腾讯云的 cdn 分布能力
    adv007
        42
    adv007  
    OP
       2016-07-16 11:15:39 +08:00
    @snow9312 利用开源的前端组件做一个家庭数据门户
    zxb
        43
    zxb  
       2016-07-16 11:19:18 +08:00 via Android
    你这个只能让我想起一句话
    "My stack is bigger than yours"
    genffy
        44
    genffy  
       2016-07-16 12:03:06 +08:00
    最近也入了个 Ruff ,准备玩玩。

    PS :重点不是浇花好么。。。。。
    orient
        45
    orient  
       2016-07-16 12:35:04 +08:00
    这个感觉有点绕了,其实 Arduino+网络模块 就可以完成以上工作
    DT27
        46
    DT27  
       2016-07-16 13:34:01 +08:00
    感觉一个 bug 家里就被淹了。。。
    adv007
        47
    adv007  
    OP
       2016-07-16 13:48:04 +08:00 via iPhone
    @DT27 我也怕,所以没有直接连水龙头,而是用水泵从一个大水桶抽水
    DT27
        48
    DT27  
       2016-07-16 14:16:34 +08:00
    @adv007 机智,哈哈。。。
    dibage
        49
    dibage  
       2016-07-16 14:29:43 +08:00   ❤️ 1
    我觉得你用 @wilddog 比较适合这个场景。。
    ljbha007
        50
    ljbha007  
       2016-07-16 14:40:14 +08:00
    建议加上温湿度传感器 光照传感器 用 spi 总线接 adc 芯片可以跳过 arduino 这一步
    ljbha007
        51
    ljbha007  
       2016-07-16 14:42:22 +08:00   ❤️ 1
    哦 对了,摄像头还可以加上演示摄影功能 大约 10 分钟拍一张照片 最后两个月时间可以合成大概 2 分钟的视频
    hiwljun
        52
    hiwljun  
       2016-07-16 14:55:38 +08:00
    我也使用树莓派做过一个,实现定时和手机远程开关。大概如下:
    1 、树莓派运行一个 python web server ,用来控制 GPIO 。
    2 、树莓派定时任务获取家里网络 IP ,通过 DNS 服务商的 API 修改域名解析的 IP 。
    3 、路由做端口转发,确保可以访问到树莓派上的 web server 。
    4 、水龙头安装电磁阀,通过树莓派来控制开关,水管上接了 10 几个喷头。

    http://imgur.com/vs9snJ6
    http://imgur.com/AqbMXf5
    adv007
        53
    adv007  
    OP
       2016-07-16 14:55:53 +08:00 via iPhone
    @ljbha007 摄像头用到了,浇花过程中每 5 秒传一张现场照片
    adv007
        54
    adv007  
    OP
       2016-07-16 14:57:38 +08:00 via iPhone
    @hiwljun 家用的话安全是首要的,要有强制自毁逻辑
    egen
        55
    egen  
       2016-07-16 15:14:49 +08:00
    lz 充分诠释了什么叫生命在于折腾,不过做的东西还是挺赞的
    xdeng
        56
    xdeng  
       2016-07-16 15:15:21 +08:00
    还联网? 直接配合小米那款检测仪 啊
    whyishe
        57
    whyishe  
       2016-07-16 17:20:34 +08:00 via iPhone
    @egen 程序员的创造力就在于此哈
    276562578
        58
    276562578  
       2016-07-16 17:23:27 +08:00 via Android
    记得初中还是高中物理书上有个图,利用大气压来浇水,如果不是为了练习和折腾的话,还是这个好
    sephinh
        59
    sephinh  
       2016-07-16 17:27:42 +08:00 via Android   ❤️ 1
    弄个定时器,每天 10 分钟,其他都可以省了,操心都不用
    Makoshan
        60
    Makoshan  
       2016-07-16 19:19:49 +08:00
    养花的乐趣,就是每天照料,虽然我大学的时候也做过这个。
    ?from=s1.8-1-1.2
    roadna
        61
    roadna  
       2016-07-16 19:32:13 +08:00 via Android
    想起了 reddit 上某个根据网友投票来决定每天浇水与否的项目。。。
    rockray
        62
    rockray  
       2016-07-16 19:41:04 +08:00 via iPhone
    smilekung
        63
    smilekung  
       2016-07-16 20:29:38 +08:00
    通信部分搞得不漂亮啊,太繁琐了,比较好的方案是跑 mqtt ,腾讯云<-mqtt->树莓派,树莓派到浇花的节点如果比较远或者还有其他节点可以用 zigbee 或者蓝牙组网,还可以很方便的扩展其他节点,树莓派就作为家庭总控来用
    adv007
        64
    adv007  
    OP
       2016-07-16 21:34:23 +08:00 via iPhone
    @smilekung 现在还是有线, zigbee 怕是不行,蓝牙绝壁可以
    wilddog
        65
    wilddog  
       2016-07-17 00:20:12 +08:00
    @dibage 哈哈,是的,用我们的 C/嵌入式 SDK 可以做
    ljbha007
        66
    ljbha007  
       2016-07-17 00:41:38 +08:00
    @adv007 我是说的延时摄影
    NeoAtlantis
        67
    NeoAtlantis  
       2016-07-17 05:24:54 +08:00 via Android
    @adv007 不是理由, XMPP 这种协议把服务器上的消息直接推送到你的树莓派很简单啊,你见过上 qq 或者微信还得改路由的么?
    NeoAtlantis
        68
    NeoAtlantis  
       2016-07-17 05:27:16 +08:00 via Android
    @jaylong 继电器要的不只是电压,还有电流,还得避免各种线圈的自感电压劈坏树莓派,不可能不用驱动模块…
    adv007
        69
    adv007  
    OP
       2016-07-17 08:18:44 +08:00 via iPhone
    @NeoAtlantis 微信的确是要路由的,不过是在服务接入的根据用户身份路由到后端服务
    aheadlead
        70
    aheadlead  
       2016-07-17 08:41:54 +08:00
    家用的话 直接买一套小米智能家居的玩具能轻松解决

    智能插座控制水泵
    花花草草检测仪每株花插一个

    然后就搞定了……
    aheadlead
        71
    aheadlead  
       2016-07-17 08:42:11 +08:00
    @aheadlead 摄像头的话 再买个小米那个啥摄像头……
    hahahasnoopy
        72
    hahahasnoopy  
       2016-07-17 09:12:47 +08:00 via Android
    学自动化的表示你这也太绕了,关键是你为什么要看着花还遥控浇花,你买几个湿度传感器,温度传感器,光线传感器,一个 arduino 一个水泵不就搞定了,程序写好了就不用管,当然,早就有人做出成品了,poi
    Syc
        73
    Syc  
       2016-07-17 10:21:00 +08:00 via Android
    表示当年我是这样, N 个气球,装好定量的水,一个 5 元大塑料盆子,然后 N 个电火花打火器(男票从实验室搜刮),然后几根管子固定好,然后引爆一天一个引爆
    junyi
        74
    junyi  
       2016-07-17 10:46:42 +08:00
    楼主可以看一下这个成品: http://www.parrot.com/zh-hk/products/flower-power
    NeoAtlantis
        75
    NeoAtlantis  
       2016-07-17 12:02:59 +08:00
    @adv007 我不想说啥了,你根本没明白我要说啥。首先你说的这个路由和开始的路由不是一个意思,我只能假设你对这方面的知识是一知半解。

    其次,我只是告诉你,你这个东西只是需要通过一个方法,把信号、指令从外面的互联网传过来。这根本费不上配置路由器、搞类似 DDNS 这种东西。

    如果你把你的树莓派当成一个使用即时通信( QQ 之类)的用户,一个 **人** ,你觉得他为了上个网,收个消息,还要搞这些?你见过现在哪个用手机的要配置这些?

    XMPP 就是一种即时通信的协议,你为啥一定要用 http 协议,为啥一定要让你的树莓派扮演 http 服务器的角色?

    如果我来搞这部分,我只需要申请一个 XMPP 帐号,然后用 strophe.js 或者 node-xmpp 这种,登录到某个 XMPP 服务器上自己收消息,你可以自己架设,也有现成的,然后只要收到符合条件的消息,就回答是了,和路由器有啥关系。

    退一万步,就算你不用 XMPP , 还有很多方法呢。如果能搞定科学上网, 大不了把你的服务器用 Tor 做成隐藏服务。
    adv007
        76
    adv007  
    OP
       2016-07-17 12:46:05 +08:00 via iPhone
    @NeoAtlantis 学习了谢谢这位仁兄
    adv007
        77
    adv007  
    OP
       2016-07-17 12:56:04 +08:00 via iPhone
    @NeoAtlantis 求个 demo ,我的管理页面是 h5 的,一般放在微信收藏夹,那么 h5 页面关闭后跟家里的连接就断开了,再次访问前怎么找到家里的设备
    NeoAtlantis
        78
    NeoAtlantis  
       2016-07-17 13:15:31 +08:00
    @adv007 XMPP 是客户端-服务器-客户端的形式,而且客户端-服务器的长连接总是有办法的。如果是 python 之类的代码写,可以直接做到 TCP 的长连接,如果是 strophe.js ,这个库可以通过 HTTP-BIND (好象是类似 AJAX 论询)解决。

    所以,最简单的方法,可以是你的管理页面用一个 XMPP 帐号登录,树莓派用另一个。 XMPP 也允许匿名帐号登录,所以未必是你每次进管理页面都要用户名密码。这样消息能发过去,剩下的逻辑就好办了。

    DEMO 可以去看我的网站 http://neoatlantis.org ,首页进去右下有个聊天图标,点开之后自动匿名登录,然后可以和我的一个固定的帐号聊天, 我这里电脑在线的话那里也会有显示。我这样就没配置什么网络设备,随时可以召唤我。(所以就是如果我这里挂着一个 nodejs 之类的 daemon ,这样自然就能随时找到我的设备了)。

    我收到消息之后回复可能会慢,也可能呆会干嘛就收不到了,实在不行给我留言,我会把收到的消息转贴到这里 :)
    NeoAtlantis
        79
    NeoAtlantis  
       2016-07-17 13:50:06 +08:00
    @adv007 刚才看了下, XMPP 已经开始搞实验性的拓展了,用于物联网的。

    比如 XEP-0325: Internet of Things - Control ( https://xmpp.org/extensions/xep-0325.html)
    还有 XEP-0323: Internet of Things - Sensor Data ( https://xmpp.org/extensions/xep-0323.html

    我感觉可以就此开发个库了。
    a610569731
        80
    a610569731  
       2016-07-17 14:26:36 +08:00
    楼主那些东西在哪买啊 我想弄一套玩玩
    adv007
        81
    adv007  
    OP
       2016-07-17 14:47:55 +08:00 via iPhone
    @a610569731 大淘宝
    deyu260
        82
    deyu260  
       2016-07-17 23:02:16 +08:00
    战略 mark
    andreby
        83
    andreby  
       2016-07-17 23:50:08 +08:00
    找个女朋友帮你养 不就又有了
    lianxiaoyi
        84
    lianxiaoyi  
       2016-07-18 10:07:35 +08:00
    然而花花草草公司早已实现.....
    CloudnuY
        85
    CloudnuY  
       2016-07-19 01:45:35 +08:00
    问一下, pi2 的音频接口底噪大不大?
    我用的 pi1 代搭 AirPlay 服务底噪简直大的不能听。。。。。。
    adv007
        86
    adv007  
    OP
       2016-07-19 06:59:17 +08:00 via iPhone
    @CloudnuY 我用 mplayer 播放还可以,不过 5.1dts 编码的音源解码出来噪音极大
    xahaha
        87
    xahaha  
       2016-10-09 04:04:04 +08:00
    楼主大神你好,非常有意思的解决方案,如果我是远程喂猫,视频这块希望随时能看到,有什么办法呀?希望多多指教
    adv007
        88
    adv007  
    OP
       2016-10-09 07:22:40 +08:00 via iPhone
    @xahaha 研究下视频采集,应该可以的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5809 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 06:32 · PVG 14:32 · LAX 22:32 · JFK 01:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.