4847| 4
|
[讨论交流] IoT具体应用案例学习:实时环境监测系统的搭建(壹) |
IoT具体应用案例学习:实时环境监测系统的搭建(壹) 基于DFRobot-Gravity与阿里云 Hi! 我是Shuuei. 一眨眼过了快一个月了,差不多试完了套件中的部件与阿里云的连接。 下面就其过程进行简要叙述。 ---------------------------------------------- 一. 开始之前 I. 什么是ESP32? ● 也许该问,什么是FireBeetle?在猴急似的试着连上阿里云后,瞅着这块开发板,发现我好像连TA是什么都有点分不清楚。查了查单词,噢,这是萤火虫。Beetle是甲虫的意思,大众有款车也是这名字。喂,不对,重点不是这个。 ● 手里的小玩意儿全名称为FireBeetle Board-ESP32,是搭载了ESP-WROOM-32芯片的主板控制器。嗯?主板控制器,之前也鼓捣过。联系一下。 ①. 51单片机 ‧ 翻了翻以前电子实训时候笔记,那时候从一块「AT89S52」芯片开始,加上电源模块、晶振(时钟)模块、复位模块构成的最小系统,以及ISP、LED灯、蜂鸣器、继电器、数码管等外部部件,自己一点一点焊到一块电路板上… 烧录用的上位机是Windows系统的笔记本电脑,所用的软件(编译器)是keilC51,仿真用的是Proteus. ②. Arduino ‧ Arduino的话就很轻松了,芯片还是那块差不多的芯片,我的UNO是「ATMEGA328P」,好像可以根据自己需要拔下来自己选择,但得是AtmelAVR的。重要的是一块板子上直接所有都安排好了:最小系统,USB转串口;数字输入/输出,PWM输出,模拟量直接输入等等。而且焊点还好看(手残虚焊的我)。开发环境是简单的ArduinoIDE(编辑器是过于简单...)。话说好像我用Arduino就没有用Proteus仿真过,嗯…罪过 罪过… ③. stm32 ‧ 没玩过… 不知道怎么样,有玩过的给个心得~ ④. 怎么说呢,一块主板控制器直接省去了之前的步骤,Arduino也好,Fire-Beetle也好,树莓派的话...好吧应该不能拿来做并列项。想到了网上说大部分硬件工程师和软件工程师的现状对比… 感觉有点唏嘘。不过听说真正硬件强的工程师(FPGA?)又和软工们又不是一个等级的?在网上看到过一篇文章是说国内大学教授对Arduino代替51单片机进行教学不太感冒,作者貌似是支持Arduino的,于是对老旧的教育方式进行大批特批。不过我倒是持相反的态度。如果对于其他非工科专业,比如艺术类的,Arduino确实是一个很好的快速实现灵感的手段。但毕竟我是一名工科(测控)的学生,一些基本的计算机科学知识术语都不太清楚,好像有点说不过去。Er,貌似扯远了。 ---------------------------------------------- ● 好了,之前自己一直称呼的ESP32,实际上是这块FireBeetle主控板,而ESP-32其实指的是乐鑫公司出品的ESP-WROOM-32芯片。想想之前用过的51单片机里的AT89S系列和Arduino上的ATMEGA(AVR)芯片,那么这块ESP32和我之前使用过的微控制器有什么区别呢?简单浏览了下技术手册: ①. 从乐鑫的主打卖点来说:“ESP32是一块集成了WiFi, 蓝牙的超低功耗芯片。”稍微从细点看,ESP32的CPU是32位的,运算能力和存储能力想来没法拿来和8位做比较;外设接口很亮眼,虽然我不知道为什么会有10个触摸传感器orz… ● 嗯,稍微了解了ESP32这块芯片,再来看FireBeetle这块开发板就比较“愉快”了。在Arduino IDE上就能对其进行程序的烧录,使用方式上又兼容Uno.而且支持乐鑫官方提供的esp-idf,micropython等多种开发方式。慢慢啃技术手册固然是好的,但自己目前时间能力又有限,这么多功能一下子也吃不下。不如先根据FireBeetle配套的教程来初步实现一些功能。 II. 如何烧录程序到ESP32? ● 主流的开发ESP32的方式大概就是esp32-idf,micropython和Arduino IDE了。其中属最后一种方式最便捷,也对像我这样对编译原理和软硬件知识模糊不清的人最为亲和。树莓派Raspbian上的esp32-idf, micropython的试用目前都不太顺利,找时间再刚一波正面试试。 ● Arduino IDE开发环境的搭建照着教程走就OK,以下是我遇到过的问题: ①. FireBeetle的识别问题 ‧ 下载了驱动,但是更新对应端口设备的驱动后显示无法使用,最后还是windows自动寻找驱动并安装搞定的,有点古怪。 ‧ 还有就是虽然被识别了但没有像教程中那样显示「FireBeetle-ESP32」开发板的名称而显示的是「USB-SERIAL CH340」这一 USB转串口 部件的名称。与之相比,Arduino UNO显示的是开发板的名称。原以为是我电脑的问题,但是连到树莓派上,显示仍然如此。 ‧ 虽然不影响主要功能,但是伤了大雅---不好看。比如两个铁匠铺锻造的刀身上的Logo,一个是“某某铁匠作坊锻造”,另一个是“由××牌锤子锻造”,想来还有点搞笑。但我相信我那时体会不到这份幽默感,只想能快点找到我的板子。(好吧,其实那个Arduino板子也是DFRobot的… 突然想起了以前看的一个商业小故事,“两家服装店对门竞争哄抬价格,结果发现都是同一个老板… ”万恶的Capitalism… ) ②. 编译时python27.dll总是被QQ管家查杀 ‧ 解决:编译时关闭QQ管家,或者… ---有位测评的朋友听说我安装了电脑管家,说“电脑管家?不装那些病毒。”--- 过了几天… 我也直接“狠心”卸载了。某乎搜了搜,装了ccleaner,再配合windows自带的防火墙就行了。目前电脑一切正常。 ③. Leaving… Hard reseting via RTS pin… ‧ 一直不理解这句编译完的提示,Hard Reseting? RTS pin? 嗯嗯?是单片机烧录后需要按下复位按钮?硬复位?软复位?RTS pin? 板子上有个RST按钮?知识掌握不清楚只能一堆问题往外蹦。得,捋一捋… ‐ 查了查相应资料,发现自己理解错了。之前想到的是这句话提示我程序烧录完之后要自己动手按下按钮复位。后面一想自己编完就从来都没有按过什么按钮,而且板子上只有RST标志的按钮。再一想,这不应该吧,我之前用的Arduino、单片机都是一键下载,串口芯片应该直接帮着搞定了,哪里需要自己再按什么钮。最后解决的是看到乐鑫官网上的一张图... ‐ … 感情这只是提示我:“噢,这位客官我们已经把程序烧好了,连带着复位也做好了,还请您验收一下… ”;而非官方的加上了 via RTS pin也只是告诉我:“噢,这位官人我们是通过RC232协议规定的RTS信号来让芯片复位的…”结果让英语不好加上知识储备不足的某人会错意以为需要自己按下按钮来复位了。 ---------------------------------------------- ● 如果没什么意外的话基本上都能烧进去,既然程序能烧进去那本地(Local)目前基本就没什么问题可以折腾了(要么就是家里路由器的配置问题), 剩下的就是对远方(Remote)阿里云IoT的认识了。 III. 有关阿里云IoT ● 说实话,一开始看着满界面都是我不懂的事物的控制台,我的内心是有点**的。这啥玩意儿啊,什么规则引擎监控运维对象存储负载均衡… 杀了我吧… 后面跟着教程,忽略其他所有东西,就点几个栏目按钮,拖拽下控件,复制粘贴,编译上传… 诶,我手机上能控制灯了?!? ● 完成了基本所有传感器和执行器与阿里云的连接后,小结如下: ▷ 首先是「设备管理」下的「产品」和「设备」两个栏目 ‧ 「产品」相当于是你的项目。在这一栏你可以定义你这个项目的功能,而目前使用Gravity时需要对这一栏进行操作的主要是「功能定义」。教程中添加的自定义功能类型一般是「属性」,所选择的数据格式主要是对应于你传感器或者执行器的现实物理量。比方说你的项目是能够实现远程控制LED灯, 那么「产品」的「功能」就是控制灯的亮暗,「功能」中的数据格式就应该是Boolean 0,1;而如果你的项目是监测湿度,那么「产品」的「功能」就是 记录一个取值范围是0到100数值,此处就可以是int 整型数值的数据格式。 ‧ 「设备」对应你手上拥有的实际设备,并且创建设备的时候必须归在某一个「产品」之下。该设备会继承在「产品」中定义的所有「功能」。与阿里云进行通信的是「设备」,而非「产品」。 ▷ 其次是实际设备如何与阿里云进行通信 ‧ “物联网平台中,服务端和设备端通过「Topic」来实现消息的通信。”--「URL阿里云帮助文档」 ‧ 目前暂时不对「Topic」进行深究,大致理解为在阿里云端授权建立的两条通道 ▷ 再者是设备的标识问题 ---「设备三元组」 ‧ 实际与阿里云通信的是「设备」而非「产品」。阿里云需要对很多很多的设备进行区分,那么每个设备就要有一个独一无二的标志。阿里云为此定义了一个「设备三元组」。创建产品的时候会分到一个「Product Key」,创建设备的时候会归到这个产品的「Product Key」下,还有一个可以自己命名的「Device Name」,用于区分该产品下的各个设备。设备与阿里云建立通讯时,告诉阿里云其「Product Key」和「DeviceName」,阿里云就知道了是哪个设备。 ‧ 「设备三元组」中还有一个是每个设备的「DeviceSecret」。照手册的意思上来说,应该既可用于设备接入阿里云时的所需的密码(类似ssh免密连接使用的RSA公钥?),又可用于传输数据的加密。 ‧ 对了,「产品」的「功能定义」时有个可以自己命名的「标识符」(identifier)也需要注意。我理解为「标识符」告诉阿里云,设备的数据该存储在云端的哪个“变量”之中。而之前自己定义的功能应该就相当于在编写程序时候定义了一个变量了吧(自己的猜测,并不知道阿里云背后是什么样的)。 ▷ 最后是IoT Studio的移动应用开发、Web开发、服务开发 ‧ er, 工科男士对做出漂亮的界面表示苦手,详见教程。 移动服务要下载生成好麻烦,于是着重Web应用。 IV. 引脚 ● 差点忘了,最简单的开始之前也得知道怎么定义引脚,要不然传感器执行器插在孔里你都不知道怎么调用读取他们。在Arduino IDE中,由于对ESP32的引脚做了映射,写程序时只要定义「#define DX」(X为你连接的引脚编号),就可以完成对实物的操控了。 ● 或者直接用「int pin = n」n为IO的编号也行,即GPIO编号方式。IO和DX的对应在主控板背面有印刷。由于有扩展板在,感觉是DX的方式更简单些。 ---------------------------------------------- 二. 开始 – 传感器执行器与阿里云的直接连接 ● 实际操作的话按照教程走就可以。不过因为我的目标是为了搭建一个实时环境检测系统,也就是说包含许多不同类型的传感器、执行器。那么这样一来按照教程中一个传感器或者执行器对应一个产品一个设备来搭建显然不太合理,于是我在一个产品下定义了多个功能,然后分别修改了一下主程序「loop」和回调函数「callback」中的部分代码,这样就可以实现一次发送多个传感器的数据。(有关接收数据方面,Web上操控一次开关,阿里云只会发送对应数据源的数据。目前暂未想到如何让阿里云一次发送多个数据给程序) 本地串口输出 产品的功能定义 注:服务gamma未实现设备的运行状态 ● 下面对遇到的一些问题进行小结 ①. 有关传感器执行器 ‧ 土壤湿度传感器与ESP32的A/D转换器位数:和Arduino相比,ESP32的A/D转换精度更高,一个是10位,一个是12位。这就导致了相同土壤的湿度如果在Arduino上是0-1024范围变化,而ESP32上就是0-4096范围变化。考虑到未来将可能把Arduino和ESP32放在同一个系统中,两个量程不同显然是令人不悦的。于是将经ad转换得到的值变换(map)到0-100的范围上进行统一。 ‧ DHT11的精度问题:到底有没有小数?网上也有一些争论。但是在查阅相关技术手册之后,发现自己不够细心。因为说明上明确写了,“小数部分用于以后扩展,现读出为零”。那么相应的,在阿里云进行功能定义时,干脆将其定义为「double」以便未来扩展吧。哦 我为了用上小数点后两位给加了0.07. ‧ 功放喇叭的接口问题:注意,由于「tone32.h」中默认接在IO15处(对应A4),导致只能接在固定模拟口。奇怪的是就算修改了对应头文件中的接口仍然不能用其他口。查阅资料后发现其输入是PWM输入,接在数字口。而产品资料和教程中接的口不一样,有点摸不着头脑了,意思是有两种操纵功放喇叭的方式?接在模拟量输出口和数字输出口的编写代码方式不一样?但教程中又说“ESP32的所有外设都可以配置到任意引脚”,好像说接在A4和其他任意口都是一样的。不清楚不了解不明白太懒,于是只能很low地乖乖接在A4上。有了解相关原因的还望指点迷津。 ②. 有关数据发送 ‧ 我是把所有传感器数据都采集了发送到阿里云端时,曾出现云端无法显示我的数据的问题,然而又没有报错。那时候觉得很诡异,为什么收不到。鼓捣来鼓捣去,发现在发送的「数据包」中(「client.publish」)如果去掉一个上传的数据,阿里云又能收到了。于是试着拆分为两次「client.publish」进行发送,问题得到了表面上的解决。以为是「数据包」 的长度超出了限制的问题。 ‧ 但是后面为了保险起见翻了翻头文件,发现定义的包的最大长度有1024个字节,想想我就那么几个数据也不太可能超过1024。仔细对照后发现,其实是少了一个「”」号。导致转意字符「\」将不该转意的字符给转意了。编译器没有报错加上自己不太细心。 ‧ 此处对自己来说新增了两点经验,一点是如果数据包太大可以分为两次拆分发送(算是误打误撞);还有一点就是转意字符「\」所转意的对象需要注意,编译器能管到的错误有限。 ③. 有关数据接收 –云端开关操作一次发送的数据 ‧ 执行器的控制对应我在云端的Web开发界面上的开关。想法是每个执行器一个开关,但是在实现过程中发现,出现了操作开关一次只会发送它本身对应数据源的数据。比如我有两个开关,想分别控制继电器和LED灯。单独开关LED灯、继电器,正常。但是如果我打开了LED灯,没有关闭,紧接着打开了继电器的开关。此时发送的数据在设备端解读就是继电器为1,而LED灯由于此次开关操作没有发送对应的状态数据导致被解读为0。于是表现为继电器开了,本来想要开着的LED灯却关闭了。目前暂未想好怎么个补救方法,也没有详细去看客户端服务器的代码,只能向阿里云进行反馈,建议其最好将所有开关控件对应的状态都集合到一次数据发送中。 ④. 有关阿里云 ‧ 功能定义时看到了「属性」、「事件」、「服务调用」,阅读其三者区别后,想把PIR传感器和按钮作为「事件」上报。于是在将PIR和BUTTON作为「属性」的同时也将其上报为「事件」。 ‧ 其他像Web、移动应用等开发的图形界面以及数据更新速度问题…说实话有的用就不错了。虽然自己写的东西可能方便操控,但是过程还是太闹心了些。。。 三. 下一步 – 阿里云的本地部署 I. 计划的由来 ● 翻了翻阿里云IoT的其他功能,发现有个边缘计算挺适合我接下来想要做的。因为数据不经筛选全部发送至阿里云端,单个设备还好,如果成千上万个设备的话,那发送的数据量可就太大了,从总体上来说可能会引起网络拥堵,从个体上说开销也大了。于是自然而然想到的便是: 数据需要在本地进行筛选后发送。 ● 我的毕业设计恰好是有关边缘计算(雾计算),当时由于时间问题只完成了类似ESP32到阿里云的功能(树莓派到亚马逊云)。不过那时就没现在那么轻松,从硬件的搭建(有电烙铁给人感觉才是硬件)到python编写驱动;建立在ssh连接上的套接字发送;c语言操作数据库(sqlite3);c语言数据发送前进行位操作;直到最后的html网页以及 php调用数据库。自己编写的好处就是专一,不需要考虑那么多的通用性,自己能用就行了。数据格式可以定义在一个结构里,随改随用;通过位操作最大化利用每一个字节由此节约发送的数据量;自己数据库提取数据通过其他软件绘图「gnuplot」等等。 ● 综上,接下来我将探索一下阿里云「边缘开发」的有关功能,并将其部署在本地的树莓派上,让ESP32采集的数据发送到树莓派,再让树莓派综合处理后发送到云端。再往后希望能加入两块ArduinoUNO,反正还有一些闲着的传感器没用。最近好像新出了Sparrow活动,要不把Sparrow也加入进来?(如果运气好能选上的话) II. 设备数据采集至本地 ● 下回分解 目前状态 视频演示 注: 1、最后点到【服务调用】时候我愣了一下,后面录完以后反应过来应该是按钮滑动条控件进行的服务调用。功能定义中我自己也定义了【Gamma】作为服务,但是并没有用到,还请不要误解。 2、执行器反应地“快”的原因应该是程序始终在监听云端是否有消息发送给设备(subTopic),如果有的话,马上执行【callback】函数。但是数据发送到云端并且反映到web控件的更新上时,就没有那么实时了。详细不明,也有可能是我程序的问题,希望有不同情况的朋友多多交流。 下一篇评测中将ESP32与树莓派的通信搭建进行记录。 【P.S.】 [musicjoy的编译问题] 不知道大家下载的套件代码是什么样的,我下载下来有个musicjoy的程序中音符好像少了个_,导致linux下编译错误,然而windows没有报错。细思不懂。。。 和与阿里云连接相比,还是总结来的难。。。由于主要是在考研复习无聊之余进行ESP32的试用用,没想到这一周反而是ESP32的时间花的更多。不行不行,主次不能颠倒了。 因此...之后我可能会...更新地更慢... 唔 肩周炎肩周炎... 以上。 参考资料: 套件来源:DFRobot创客商城 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed