#原创新人# 利用"树莓派"打造家庭环境监控系统Plus
写在最前面
这篇文章可能有一定的阅读门槛,适合有电子电路和编程基础的人阅读。如果你没有任何以上基础,我也尽量会用通俗的语言分享我的经验和知识,也乐意接受大家的指导和评判。另外,据我观察,混迹张大妈的有不少程序员同行,欢迎大家对我做的这个家庭作业级别的简单的小项目进行审阅和指正。
正文
为了方便大家阅读,文章将按照以下思路展开:
1.树莓派是个什么玩意?
2.用树莓派能做些什么事情?
3.我用树莓派做了个什么小项目?
4.我是怎么做的?
前面两个问题算是科普性质的餐前小菜,后面是可能需要一定基础才能畅快阅读的正餐。
树莓派是什么
以下论述默认以树莓派3b为准
简单来说,树莓派就是一台电脑主机,接上显示器,插上键盘鼠标,就是一台完整的电脑。那树莓派跟普通电脑有什么区别呢?
(使用测评必须插入卡片,实际在淘宝购买)
首先是架构不同,我们平时用的Intel或者AMD的CPU的电脑大都是X86架构的。而树莓派和我们的手机,平板,电视盒子一样,大都是ARM架构的。ARM架构的处理器因为其低功耗等特点,广泛应用于便携式通信产品、手持运算、多媒体和嵌入式解决方案等领域。因为ARM架构可以让厂商把产品做的更省电,更小巧。从操作系统层面来讲,普通电脑和树莓派从用户角度看来区别并不大,普通电脑运行Windows和Linux,树莓派也能运行Windows IOT和Linux,但由于架构不同,普通电脑运行的Linux和树莓派运行的Linux本质上是利用不同架构的编译器生成可执行文件的。树莓派在Linux阵营的软件资源更为丰富一些。
其次,树莓派和普通电脑一样都有的usb、hdmi、以太网,音频输出等常用接口。除此之外,树莓派还有一组GPIO,正是这组GPIO,给广大极客提供了更为广阔的创造空间,赋予了这个小小的卡片大小的主机更多可能性。GPIO(General Purpose I/O Ports)意思为通用输入/输出端口。通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。树莓派的GPIO共有40PIN,包括串口、I2C、PCM、SPI、UART等等,很多接口的PIN是复用的。
详细的介绍可以参考这个网页,上面对每个PIN都有很详细的说明链接 。
有了这些接口,树莓派就可以用来点亮一个LED,连接各种传感器接收数据,驱动显示LED,控制电机马达,发射接收红外信号等等。利用这些GPIO,再加上使用者的奇思妙想,造就了树莓派各种新奇有趣的应用。
自2012年树莓派第一代推出以来,目前已经进化到第三代,全系列出货量已经已达1250万块,可见其流行程度。树莓派的成功,得益于官方到位的支持和推广,活跃的社区和用户群,健全的生态体系。不过国内比较活跃的社区似乎也就百度贴吧了,其他几个论坛都不怎么热闹,nxez和52pi倒是时常更新。但是如果想获取支持查阅相关资料的话,网上上优秀的资源还是挺多的。归根结底,树莓派还是一个小众的东西。
树莓派能做什么
树莓派的应用案例网上有许多,大致上可以分为两种:
添加最基本的外设,甚至没有任何外设,把树莓派当作一台主机用。
你可以接上显示器,连上键盘鼠标,单纯地把树莓派当作一个小巧的电脑主机,浏览网页,听听音乐,写写代码等等。
你还可以把树莓派当作一台7X24小时开机的服务器,跑跑网络爬虫,架设个人博客,搭建个FTP服务器,邮箱服务器,科学上网,下载机,家庭监控系统,挖矿等等。
你更可以下载烧写已经做好的不同用途系统镜像文件,经过一些简单的配置,把树莓派打造成路由器,游戏机,电视盒子,家庭控制中心,家庭多媒体中心等等。
利用GPIO和极客们的奇思妙想,让树莓派做更多的事情。
这里能举的例子简直太多了。
接上LED小灯,加上光线传感器,人体传感器,就能做一个智能小夜灯。
利用原子镜加上DIY的笔记本显示器,然后还需要一些木工活,就能打造一个酷酷的魔镜。
利用摄像头、电机。轮子、底盘等,就能做一个自动壁障的小车。
你还可以做水下机器人、四轴无人机、空气测量仪、电子闹钟、智能语音机器人、数码相框、自动浇花机、3D打印机。加上通信模块,你甚至可以DIY出一台能打电话的手机。
以上我列举的应用只是九牛一毛,更多有趣的案例,可以搜索网络。这么多新奇有趣的点子,没准你也想试一下呢。
上面列举的各种应用案例里面,烧写镜像加配置的那种,比如游戏机,电视盒子,家庭娱乐中心等,是不需要编程基础的,只要有耐心按照教程一步一步来就可以了,文科生都能玩转。其他的应用案例,可能或多或少都需要一些编程基础。
我用树莓派做了什么
其实我买树莓派最主要的目的是折腾着玩。以玩为目的的话,成本就不是主要考虑的因素。比如我做的这个小项目,应该有更廉价的方案或者会有功能相似的成品,但是廉价方案可能就没那么好玩了,直接买成品更是根本没法玩了。像这样,做点小东西,写点小程序,就是很多程序员闲暇时间的娱乐方式。
初衷
我用树莓派做这个小项目的初衷很简单,就是想测量一下家里的甲醛浓度。人生第一套老破小,去年装修完毕,入住一年了想知道甲醛浓度是否达标。毕竟夏天天气炎热,整天待在密闭的空调屋里面实在有些担心。市面上现成的甲醛测试仪我也看过了,普通民用的几十块钱到几百块钱不等,但是就算差价这么大,里面的甲醛传感器是否准确灵敏,我实在是很怀疑。与其买那些不知道里面是什么乱七八糟低劣传感器的成品,不如自己买一个靠谱的传感器,DIY一个测试仪。经过一番检索,我选择了口碑还算不错的攀藤科技的PMS5003S,可以同时监测空气中颗粒物浓度和甲醛浓度。
前传
在继续讲述前,我觉得有必要说下我去年做过的另外一个小项目。去年冬天,我想做一个远程开关空调的东西,这样就能提前打开空调,到家就能享受温暖了。当时并没有用树莓派,而是选择了Arduino。Arduino也是一款十分流行的开源开发板,也有很丰富的GPIO,可以连接传感器、马达等装置,所以有不少能用树莓派做的东西,也可以用更廉价的Arduino来实现。但是Arduino所用的处理芯片和树莓派不是一个级别的,仅仅16MHz处理速度限制了Arduino只能用于一些数据量不大,且对处理速度要求不高的领域。对于远程开关空调这个项目,我的思路是利用一台旧Arduino手机接收远程指令,然后手机通过蓝牙串口与Arduino通信,给Arduino下达指令,Arduino判断当前室内温度,达到一定条件就通过红外发射模块发送空调开关信号。思路有了,就开始购置设备了。我没有选择官方原版的Arduino,而是选择的Ywrobot的,一来他们对原版的Arduino做了一些我认为合理的改进,使用起来更方便;二来他们家的各种电子模块传感器比较齐全,配色漂亮,做工也不错,配套有扩展板,连线方便。缺点呢,就是价格稍微有点贵了。最终采购清单如下:Arduino,温湿度传感器,红外接收模块,红外发送模块,蓝牙通讯模块,有扩展板,lcd模块,杜邦线。
到手后立马接线,并写程序。折腾了一段时间,本地调试已经成功。手机上写了个app,通过蓝牙串口与Arduino通信,Arduino红外收发开关空调都可以了,但是苦于远程发送指令没有很好的方案(现在的话,实现远程控制我应该有比较好的方案了),所以就放弃了。最后把Arduino连上lcd模块,接上温湿度传感器,实时监控显示室内温湿度。
现在
有了之前项目的基础,要实现家庭环境实时监控的话,把PMS5003S接到Arduino再添加些代码就可以了。但是我想把功能做的很强大一些,不仅要实时查看家中的各种环境指标,也要用数据库把这些数据记录下来,并支持远程查看。为了实现这些功能,也为了方便以后进行更多功能的扩展,我排除了一些可替代方案(比如nodemcu/esp8266+Yeelink),直接一步到位使用树莓派来实现我的需求。后续又购入了显示器,键盘鼠标等。到货后接线,写代码,又是一番折腾,最终初步完成了项目开发。
那么这个初步完成的项目具体实现了哪些功能呢?
1.监控家庭环境指标:包括温湿度、甲醛、PM2.5、PM10,记录这些数据,查看实时和历史数据,通过网页展示。
2.查看树莓派的状态:包括树莓派的CPU温度、CPU使用率、内存占用率、存储使用情况,通过网页展示。
3.室外天气情况:显示三天天气预报,通过网页展示。
4.顺手搭建了个个人博客:支持Markdown写文章
5.支持外网访问。
6.树莓派聊天机器人:支持手机端远程发送指令,与树莓派对话,给树莓派下达指令或者得到想要的信息。
所以不仅仅是家庭环境监控,还有顺手加了些其他功能,这就是标题加上Plus的原因了。
下面放几张图展示一下最终效果。首先是首页图,包含了实时环境数据,树莓派状况,天气状况。
然后是可以以年月日为周期查看单项环境指标曲线
然后是博客首页和文章的示意图。支持代码高亮哦。
最后是一个简单的树莓派聊天机器人,手机端发送定义好的指令,会做相应的回答。
还有一个图灵机器人,能进行简单的聊天。
我是怎么做的
这一章估计需要一定基础了才能无障碍阅读了。我将分为硬件和软件两方面进行阐述。
硬件方案
因为我之前已经有Arduino了,并且配了扩展板,为了充分利用手头这些硬件设备,所以我就把温湿度传感器和攀藤PMS5003S直接接到了Arduino的扩展板上。这样既能简化接线,又能省出树莓派的GPIO。
温湿度传感器是3PIN:VCC GND DAT,扩展板上随便找一排数字接口插上去就行。
攀藤PMS5003S一共是8PIN(如下图所示),但实际使用中,只需要用到3PIN:VCC GND TX。TX接到扩展板的RX上,即通过串口PMS5003S发送数据,arduino接收数据。买回来传感器附送的排线尺寸并不能和Arduino很好连接,需要手动把相应的线头剪开,在用母对母杜邦线接到相应的接口上
还有一个1602液晶模块,用的是并口(早知道用I2C了),占用了7PIN,好浪费,具体接线根据DATASHEET来就好了,不赘述了
这样Arduino的外围模块就接完了,我相当于把Arduino当作了一个协处理器,大脑呢还是树莓派,他们之前通过usb串口通信,Arduino把从传感器接受到的环境数据通过USB 串口发送给树莓派,顺便也由树莓派通过USB给arduino供电,一举两得。1602液晶模块实时更新数据,更多作为调试校准用。
树莓派本-+身因为并没有利用其GPIO,所以只是连接了一些常见的外设,并没有什么好说的。硬件方案基本上就是以上这些了。最终的硬件组成如下图所示。本来应该有一个10寸显示器,由于某些原因退货了,准备换7寸的触摸屏显示器了、
软件方案
Arduino的程序并不复杂,主要工作就是开了三个伪线程分别用来读取温湿度传感器数值,读取攀藤PMS5003S传感器数值,串口与树莓派通信传输数据。读取温湿度Arduino有封装好的库可以用,调用其API即可。攀藤PMS5003S需要读取串口数据,因为Arduino本身只有一个物理串口,用来和树莓派进行串口通信时物理串口不能复用,所以就用到了软串口。代码里设置好波特率,就可以接收到PMS5003S输出过来的一帧帧数据,按照说明书上给出的数据格式进行解析,就能得到PM2.5、PM10、甲醛浓度等环境数据。Arduino与树莓派的串口通讯代码就是把采集到的数据按照自己定义的格式发送出去。然后Arduino端的程序就完成了。
树莓派这边,我刷的是官方的最新系统RASPBIAN JESSIE,开发语言主要是Python。Python我并没有系统学习过,自己也是边用边学,前端开发我也基本是个小白,所以能写出这个简单的网页也是经历了一番摸索的。这也就意味着这个项目的代码质量并不高,充斥着一些并不优雅的实现和用法,当然也必然存在着不少已知或者未知的缺陷,如果能得到一些大神的意见或指导,将不胜感激。
下面,我将根据已经实现的功能分别阐述软件方案:
1.监控家庭环境指标
树莓派这边首先要写一个串口程序接收Arduino传过来的数据,并按照规定的格式解析出来。现在监测家庭环境的各项数据有了,我还需要利用树莓派把这些数据展示出来和并做记录。对于这一步,大部分人都会选择yeelink、乐联网等现有的物联网平台,注册帐号,添加传感器,借助其api将数据上传到网站上,登陆自己的帐号就能查看数据。这样做确实挺方便的,但也有弊端,首先在这些平台上创建的传感器设备节点是公开的,也就是你的位置和传感器数据不具备隐私性,其次其网站核心功能并没有开源,想做些定制化的功能无法实现。所以我就索性写个网页做展示和记录,DIY的乐趣也正在于此,而且这也并不是一件很困难的事。Python的Flask框架可以使开发一个简单的网站变得十分容易和快捷。同时Flask支持Bootstrap主题,即使不会前端开发也能套用现有主题做出漂亮的网页来。
具体的做法是:首先将环境数据展示在首页上,并以10S为间隔定时刷新,同时后台以半个小时为间隔将数据记录到数据库中,在相应的页面可以查看到单项指标的历史数据,以年月日划分,通过Chart.js以图表的方式展现出来。所使用的Bootstrap主题是Github上找的一款个人觉得比较好看的主题,通过一系列精简和修改,最终满足了我的需求,因为我本身对HTML、JavaScrpt、CSS等前端开发知识知之甚少,所以遇到了不少坑。。。不过经历了一番折腾后,总算把坑都跨过去了,最基本的功能也算实现了,如果标题没有写Plus的话就可以收尾了。但是我明显还没有折腾够。
2.查看树莓派的状态
在首页显示树莓派的状态,算是一个简单的小控件。像是CPU使用情况、CPU温度、内存使用情况、存储使用情况都可以通过基本的Linux命令获取。通过Python去执行这些命令拿到数据展示出来,简简单单,几乎不值一提。参考代码可以在这里找到网址链接
3.室外天气情况
我发现首页还是有些空间可以利用的,不能就这么浪费掉了。所以就用来显示室外的天气情况。首页正文区用来显示实时的室外天气状况,用的是和风天气:网址链接的API。和风天气的免费版本比较良心,天气信息比较全,温湿度、风力、空气质量等都有,一天4000次调用足够了。在侧边栏的位置想放一个天气预报控件用来展示三天的天气预报,经过一番检索最终选择了心知天气的网页天气插件,既美观又简洁,和主题风格比较契合。具体插件代码可以在这里找到。网址链接
4.个人博客
我很久之前就用过Flask写了个简单的个人博客,放到SAE上跑了两年了。不过最近SAE帐号余额不足了,也不想继续充值使用了,就把代码拿过来整合到这个项目里面。这个极简的基于Flask的个人博客没有用到数据库,可以直接使用MarkDown撰写博客,写好后放到指定目录,访问的时候自动渲染成HTML,而且支持代码高亮。张大妈的文章发布系统什么时候能支持代码高亮呢?害得我一篇文章下来一行代码都不想贴。。。
5.网站的部署和内网穿透
目前为止代码层面的工作已经基本完结了。怎么把这个网站运行起来呢?最简单的方法当然是直接执行python脚本文件就可以了。但是这样的方式不够灵活,你很难保证树莓派永远不会断电重新启动,总不能每次开机都要手动去执行一下这个脚本吧。要想实现开机网站代码自动运行,就涉及到了网站的部署。一般Python Web应用的部署,都会用到三样工具:Nginx,一个高性能的HTTP和反向代理服务器;uWSGI,一个实现了WSGI协议、uwsgi、http等协议的Web服务器;supervisor,用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。说实话,前两个工具的作用我也不是很清楚,但按照文档教程配置一下还是没问题的。具体配置步骤网上有一大把比较详细的文章,我就不再赘述了。如果安装和配置的过程中没有出现什么差错的话,开机后不用输入任何命令,PS下就可以看到Web应用已经跑起来了,你当然就可以通过浏览器访问了。当然目前为止,所有的访问都是在本机上进行的,外网是没法访问到的。
在这个公网IP非常稀缺的年代,为了实现外网也能进行访问,就需要内网穿透了。这时另外一款神器就登场了,那就是Ngrok。Ngrok是一个反向代理,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。通俗地讲,Ngrok能够将你本机的HTTP服务(站点)或TCP服务,通过部署有Ngrok服务的外网伺服器暴露给外网访问。Ngrok对于普通人可能没什么卵用,但是对于Web应用开发者来说,是可以带来极大的便捷的。Ngrok官方也提供了相关服务,并且有免费版本。然而就是这么好用的官方的服务,竟然被GFW墙了。全世界都能用的好服务既然在大中华局域网里用不了,就只能在局域网里找中国版的Ngrok啦(当然也可以用VPS自己架设一个Ngrok服务器)。
这里我选择了ngrok.cc,它提供了免费版本,注册后简单配置,一条命令,内网穿透瞬间实现了。具体操作步骤可以参阅官方的文档。虽然免费版本访问起来肯定很慢。但是我这种凭一时兴趣搭建的简单的网站对速度也没那么高的需求了。也有很多人用花生壳做内网穿透,花6块钱开通功能后,免费版每个月1G流量限制,似乎也足够我用了,但是只支持电信的内网穿透,而我是长城宽带 。
ngrok.cc还能自定义域名,我这里偷懒直接用二级域名了。曾经dylangao.com这个域名我持有了两三年,机会成熟的时候再把它买回来吧。一切妥当之后,浏览器中输入配置好的二级域名,就可以在任何地方访问树莓派上的部署的这个网站了。
6.树莓派聊天机器人
现在环境监测网页有了,个人博客有了,也能从外网访问这个网站了,但是手机越来越成为我们生活中主要的上网和通讯工具,所以我还想要实现一个用手机和树莓派交流甚至控制树莓派的功能。那就做一个树莓派聊天机器人吧。目前树莓派聊天机器人最流行的方案是使用一些用Python包装Web微信协议实现的微信机器人框架,比如常用的wxBot网址链接、itchat网址链接。他们的使用都很简单,短短几行代码,就可以自己实现一个简易的微信聊天机器人,但是也有不少限制条件。首先,每次启动微信机器人的时候都可能需要去扫码登录,毕竟是模拟了网页端的微信,这是不可少的步骤;其次,保持7X24小时在线有一定的困难,你必须保证所登陆的微信号在手机上7X24小时保持在线,重启手机,退出微信都会导致微信机器人下线,这依然是网页端微信的限制,最靠谱的解决方式是使用一台不用的手机,登录一个微信小号维持登录帐号一直在线。有了这些限制去实现一个树莓派聊天机器人总觉得不太畅快。直到我发现了另外一种和微信机器人一样便捷开发,功能强大的开源框架,SlackBot。
Slack其实是一个方便进行团队协作和交流的聊天工具,官网在此:官网链接。SlackBot是Slack提供的一个Python聊天机器人框架。毕竟是官方支持的机器人框架,所以就没有模拟网页端的微信机器人框架的那些限制了。在官网注册帐号,并创建一个SlackBot,会得到一个Api Token,然后就可以用这个Token基于SlackBot框架开发自己的聊天机器人了。手机端有Slack客户端,打开客户端和机器人对话,就能实现与树莓派上运行的这个SlackBot交流了。具体文档可以参考:网址链接。这么好用方便的东西,千万别墙了啊。
现在我实现的树莓派聊天机器人的功能还比较简单,通过在手机客户端给机器人发送不同指令就能够获取家庭环境指标和树莓派的状态,同时也集成了免费版的图灵聊天机器人:网址链接,能够进行简单的对话。既然目前这个架构已经搭好了,以后要添加实现更多指令远程让树莓派做事情也就成为了可能,比如远程开关空调什么的也不是梦想了。
给树莓派安个家吧
这个项目的开发讲到这里基本上已经结束了。这么一堆硬件以及传感器,凌乱的连线,怎么看都不美,所以有必要给这堆东西找个安身之处。网上也有很多卖树莓派盒子的,但是不能只给树莓派安家把,其他东西怎么办,连线乱的问题还是没解决?那接下来能想到的就是用3d打印自己做个合适的外壳,但是我并不会建模,自己入门3d建模,怎么说也要学个十天半个月,可能还更久,暂时也没有那个时间和经历。正惆怅时怎么才能给这堆东西找个好的归宿时,我想到了另外一个好东西。我可以自己用无限可能的乐高积木,自己搭建一个满足需求的外壳。具体的设计可以利用乐高官方的设计软件LEGO Digital Designer,这个软件就是搭积木而已,没有什么难度和学习成本。在经过一番仔细测量和多次设计之后,我画出了还算满意,成本也比较低的模拟图。
为了节约成本,我选择了廉价的国产积木,和乐高是兼容的。一番拼装后,一个树莓派漂亮清爽的小家完成了。最终的效果图大致如下图所示。这样看起来是不是就好多了。
代码分享。
只要有一定的编程基础,实现以上功能其实都不是难事。之前已经说过了,我没有什么Python和前端经验,代码写的不太好,但是已经写了那么多文字了,不把代码分享出来也有点不像话。你可以在这里找到所有的代码:网址链接,注意有几处需要写上自己申请的key或者Token。如果你在做类似项目或者想做类似项目,希望我的代码能够供一些参考,但是不要拿来学习。欢迎大家提issue,欢迎提PR。
4.后记
这套东西算下成本吧,两个开发板、一堆用到或没用到的传感器、一些外设、还有个没到货的7寸触摸屏显示器,加起来有1000了 。所以,玩嘛,成本就不要考虑那么多了。。。。 。
其实后面能想到的可以做的东西还是很多的,比如智能语音播报,远程监控等等。本来还想做个游戏机呢,用来玩玩模拟器游戏,可是想想我现在已经有不少游戏机了,估计树莓派没机会玩吧,就放弃了。
唔。。。 不知不觉已经手写8000字了。
最后,感谢你的阅读,感谢开源世界,感谢互联网,F@ck G@F@W。欢迎有爱评论,拒绝无脑喷。
沉默的潜水艇
校验提示文案
geminishao
校验提示文案
HanQ
校验提示文案
天空有时很蓝
校验提示文案
心轩
校验提示文案
俩会照耀我成长
校验提示文案
paopao330
校验提示文案
黑暗魔君索伦
校验提示文案
_小哥
校验提示文案
Jack___
校验提示文案
weishenma2012
校验提示文案
rnd123
校验提示文案
杨kai
校验提示文案
MasonQian
校验提示文案
一罐
校验提示文案
sgldl2008
校验提示文案
值友6613270205
校验提示文案
chrishou
校验提示文案
火烈鸟索菲亚
校验提示文案
曹植友
校验提示文案
大米克
校验提示文案
Chunssu
校验提示文案
chenwu
校验提示文案
曹植友
校验提示文案
vipnec
校验提示文案
卧龙大熊猫
校验提示文案
火烈鸟索菲亚
校验提示文案
darkblue
校验提示文案
沉默的潜水艇
校验提示文案
值友9731304859
校验提示文案
攀登mm
校验提示文案
chrishou
校验提示文案
放个屁炸了你
校验提示文案
還沒想好
校验提示文案
extuba
校验提示文案
CharlySu
校验提示文案
值友6613270205
校验提示文案
sgldl2008
校验提示文案
林爱iSmile
校验提示文案
niuniu1900
校验提示文案