2728| 1
|
[项目] 教你一招分分钟让Micro:bit板通讯距离翻倍(2) |
本帖最后由 Luke 于 2019-11-26 15:49 编辑 教你一招分分钟让micro:bit板通讯距离翻倍(2) 项目目的: 上一话已经验证了Micro:bit板可以当作无线中继器来用,这一话要解决的是三块板在不同的距离下会产生的各种问题。 项目情况: 首先来分析一下问题如果数据板和上传板靠得太近,而中继板在他们之间,那上传板无疑会受到两条相同的消息,而如果需求的中继面积再进一步扩大,就会出现两块甚至更多中继板,那这样的话同一条消息会被传来传去,数据的数量和顺序就会完全混乱,那该怎么解决呢。我这里把数据当成字符串去处理,再运用Mind+对字符型数据友好的运算模块,来达成对每一条无线数据打标记的功能,从而解决数据混乱的问题。 直接来看数据板V2.0的程序,我增加了一个数字型变量“序号”,用来标记每一条温度数据的顺序,每一次的循环周期内增加1,将所有的温度数据从1开始编号,无线发送时将序号和温度数据合并中间别忘了打上一个英文逗号。这里英文逗号的作用就是在字符串里面作定位,在最后处理信息的时候能通过找英文逗号的位置来区分序号和温度。 中继板V2.0没有任何变化,是因为把字符型的数据用字符型变量存储,再字符型得发出,不牵涉任何转换。 重头戏来了,就是上传板V2.0,如何从字符串里面提取我想要的温度信息,又不会造成信息混乱和重复就是关键。 我们在Mind+里找到运算符模块,能发现除了传统的加减乘除和逻辑运算,还有很多有用的功能,其中就有我们这次用来处理字符串的一些重要指令。 先说在字符串中查找指定字符的指令,还记得我们之前在字符串中埋下的英文逗号吗,运用这条指令就可以在无线接收的数据中找到英文逗号在第几位,再运用截取字符串的命令获得从第一位到英文逗号前一位也就是序号,再获得英文逗号的后一位到字符串的最后一位即温度数据。 这里有个小贴士,关于为什么要用英文逗号,中文逗号哪里不行。其实是这样的,英文逗号占用了一个字符,但是中文逗号占用三个,所以当我们搜索到了中文逗号的所在位置,并截取他的后一位到末尾的字符串,会发现获得的字符串头部有两个未知符号。其实我们取中文逗号的后三位到末尾,就能达到英文逗号一样的效果,但是为了避免麻烦,还是推荐使用英文的。 我们将获得的序号字符串转换为整数,去和上传板的数字变量“序号”作比较,例如传来的第一条信息是“1.00000,30.00000”,那我们获取的整数是“1.00000”,大于我们的“序号”初始值0,这条消息即为我们没有接收过的消息,我们便将“序号”设置为那个整数1,表示我们已经接收到了1号数据,下一次如果再收到1号数据,就无法进入循环,只有收到序号比1大的消息,在能再次进入循环完成数据上传。 当一切顺利进入循环之后,按照上述方法,截取字符串里的温度数据并转换成整数保存在数字型变量“temp”里,上传到IoT。 让字符串输出就是最简单的测试方法了,这里我输出的是无线接收到的字符型数据和运算后获得的数字型温度值,检测程序是否按照我的想法运行。 最后串口输出的数据正是我想要的,这样的话,无论我们三块板挨得有多近,又或者三块板距离太远,需要两块、三块甚至更多中继板去传递信息,都不会出现信息的混乱了。这样我们可以在以上传板为圆心,半径5-6米的地方,均匀布置中继板,在中继板的有效范围内再布置中继板,这样我就能突破Micro:bit无线通讯的距离限制,在相当远的地方源源不断地传输数据过来。 项目拓展: 我还发现“查找”指令还可以在字符串里搜索关键字符最后一次的出现位置,这样我们就可以用两个英文字符去隔开信息,意思是除了编上序号,我们还能赋予每条字符串更多的信息,甚至用另外的一些关键字符混合使用,我们可以让每条数据携带相当多的信息。 这个由网络中继器引起的想法已经在第一帖里被验证,在第二帖里适当的优化了,其实从最后的分析来说,程序还能写得更好,携带更多的信息,举个例子我可以让每个中继板有自己的序列号,从最后的数据能检查这个数据经由哪些中继器远道而来;我还可以将一段时间的数据打包发送;我甚至可以将温度、湿度、pm2.5等数据从各个不同的位置通过不同的设备发送过来,按照标记分别上传到IoT上不同的Topic里去。 所以没错,还有第三帖。 样例程序: Microbit中继器 V2.0.zip 快速链接: 教你一招分分钟让Micro:bit板通讯距离翻倍(1) 教你一招分分钟让Micro:bit板通讯距离翻倍(2) 教你一招分分钟让Micro:bit板通讯距离翻倍(3) |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed