LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)
前言
原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。
本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文:
http://www.cnblogs.com/sjqlwy/p/lattepanda_pyui.html
本文测试环境:LattePanda:Windows 10 x64;Arduino 1.8.2;Python 3.6 + pyFirmata;TeamViewer 12|TightVNC C&S;host:Windows 7 x64
影响飞机飞行的六大气象因素
来自中国天气网:http://www.weather.com.cn/science/qxbk/jt/09/392758.shtml
| 气压 | 风 |
|---|---|
| 云 | 能见度 |
| 颠簸 | 结冰 |
目前,我们可以获取气压、风力、云层、能见度等方面的数据,而四轴飞行器属于低空飞行,并不会受颠簸、结冰影响。为此,我们设计如下:
- 通过在线天气预报API获取当前天气、风力、气压、能见度等信息;以及次日天气状况并进行判断
- 获取传感器数据显示当前环境状况(由于缺少专业传感器,未来会连接气象站套件、购置新传感器、连接其他MCU获取气压等数据)
- 显示结果:
- 终端程序(CLI):Python Shell|Windows Command Prompt
- 图形界面(GUI):图形程序或网页界面(Web Interface)
- 物理面板:使用LCD液晶屏、物理按钮、LED灯等指示起飞条件状态

获取天气条件(输入)
天气预报API
最简便且准确的途径就是获取天气预报啦,这里我们可以使用国内外诸多网站提供的服务API,可以在百度API Store查找使用各种免费收费服务。之前用过Yahoo、Weather等的API,这次无意中发现github上网友TonnyL整理的Awesome_APIs 列表,非常棒,感谢TonnyL,有可能的话大家可以去star或者捐赠。
我们选择中央天气预报(非官方) 这个API,首先数据准确,其次使用异常简单。
使用方法讲得很清楚,数据格式为json,如果不进行格式化,输出结果如下:

其中\uXXXX为JS string,虽然有很多小工具如curl、httpie配合json格式化工具可以完成解码,但是为了后续拓展方便,我们使用Python + requests库来实现数据获取与处理。
获取天气状况
测试环境:Python 3.6.1 for Windows;pyFirmata 1.0.3 (pyserial needed);requests 2.14.2
代码如下:
#!/usr/bin/env python3
#-*utf-8*-
import requests
def get_weather():
# use api from https://github.com/jokermonn/-Api/blob/master/CenterWeather.md
weather = requests.get('http://tj.nineton.cn/Heart/index/all',params = 'city=CHJS070000')
return weather.json()
status = get_weather()['status']
cond = get_weather()['weather'][0]['now']
tomorrow = get_weather()['weather'][0]['future'][1]
if status == 'OK':
print("********当前天气********")
print("当前城市:{0}\n当前天气状况: {1}\n温度: {2} ℃\n风向: {3}\n风速: {4} m/s\n风力大小: {5}\n空气湿度: {6}\n能见度: {7} km\n气压: {8} hPa".format(get_weather()['weather'][0]['city_name'], cond['text'], cond['temperature'], cond['wind_direction'], cond['wind_speed'], cond['wind_scale'], cond['humidity'], cond['visibility'], cond['pressure']))
print("********明日天气********")
print("明日天气情况:{0}\n风力大小:{1}".format(tomorrow["text"], tomorrow['wind']))
if '雨' not in tomorrow['text']:
affordable_wind = ('风力0级', '风力1级', '风力2级', '风力3级', '风力4级')
if tomorrow['wind'] in affordable_wind:
# 后续加入字体颜色
print("明日适宜飞行!")
# 绿灯亮
else:
# 后续加入字体颜色
print('明日不宜飞行!')
# 红灯亮
else:
print('failed to fetch weather condition of XuZhou!')
执行效果如下:

注意:
- 注意Python2和Python3的语法上稍有区别,建议阅读廖雪峰的Python教程和免费的《A Byte of Python3(中文版)》这本书。
- requests库简单易用,内置json格式化功能。虽然还有许多其他更轻巧的库或者工具可以使用,但是使用优美的requests库可以降低学习成本,并为后续网络爬虫等的学习打下基础。
- 请参考该api的json返回示例,注意字典
{}和序列[],《A Byte of Python3(中文版)》有专门的讲解。- 这里推荐使用字符串的format()方法进行格式化输出。
- params = 'city=CHJS070000'以我家徐州为例,具体城市代码参考作者提供的数据库文件
- 因为计算机都是业余爱好,所以代码质量相当低,欢迎指正提建议。
- 当服务端 (Server)和客户端 (Viewer)都使用TightVNC时,可以直接进行文字复制黏贴,但是我这里中文会出现乱码,可能是两个文件编码不同也可能是TightVNC内置编码问题,不过使用文件传输功能没乱码。
- 后续准备增加适宜和不适宜起飞的字体颜色,由于Windows和Linux的实现有所不同,考虑可移植性,暂时不进行功能整合。可以参考Python实现Windows CMD命令行彩色输出和Python 命令行输出的颜色设置 。
获取传感器数据与物理按钮控制
前文LattePanda 之深入学习 Firmata通讯有所介绍,我们这里先用简单的pyFirmata库进行演示模拟、数字传感器读写。最终效果为:读取光敏传感器、温湿度传感器数据进行显示(模拟、数字传感器读取),并且根据天气预报情况判断明日天气条件是否可以起飞,如果可以,则绿色led亮5s,否则红色led亮5s(数字写入)。未来加入物理大黄按钮进行控制(数字读取)。代码如下:
from pyfirmata import Arduino, util
from time import sleep
# 初始化串口
board = Arduino('COM5')
print("********传感器数据********")
it = util.Iterator(board)
it.start()
board.analog[0].enable_reporting()
sleep(1) # 缓冲时间
# 待补充DHT11以及校准光敏传感器
print("环境亮度:{0}\n环境温度:{1}\n环境湿度:{2}\n".format(board.analog[0].read(), "N/A", "N/A"))
board.analog[0].disable_reporting()
# 绿灯亮
board.digital[9].write(1)
sleep(5)
board.digital[9].write(0)
# 红灯亮
board.digital[10].write(1)
sleep(5)
board.digital[10].write(0)
注意:
- 请填写正确的串口编号
- 使用第三方
StandardFirmataPlus固件是出现问题,led点亮后无法熄灭,重新烧录官方StandardFirmata固件后回复正常,等待重新验证问题。- 操作模拟端口时,建议启动一个迭代器线程进行处理,否则开发板会持续向串口发送数据,直到串口溢出。更多例子及使用方法请参考官方
tests.py- 开启reporting后请延时后读取模拟量,否则可能获取不到传感器数值;另外单次读取完毕请disable,不然也会一直发送数据(Tx白色指示灯常亮)
- 后续使用pyMata-aio取代pyFirmata库,它支持最新的firmata协议,使用异步,并且可以自动检测Arduino串口。
- A9、A10分别接绿色、红色LED。

【APRS气象站套件(带风速计、风向仪、雨量器)】
整合两个功能,即可以得到命令行界面版控制界面完整源码:
Graphics User Interface
前面搞定了CLI界面,基本功能实现了,但是此时的我想起来v2ex上一个段子:
原先 PM 将一个用的人少的运维管理页面( web application ) JAVA web 给我用 Python 做,期待做成小工具。后来我想给客户的东西总不能没有界面吧,就用 bat 撸了一个。
客户:握草,这界面?!还墨绿色?
我:恩,目前是这样
客户:这滚动的怎么像黑客一样?!!
我:。。。
所以我们准备为地面站系统做一个图形界面。用惯了CLI界面,对图形界面设计编程这个新领域学习了一番,收获颇丰,记录如下。
计划中的地面控制站包括网页版用户交互界面(屏幕软件交互)+物理控制面板(按钮LED交互)。
Windows下的桌面软件开发
- 快手 aardio| 国人出品,专注于桌面软件快速开发,功能强大,永久免费,不过存在一些争议,名词也从AAuto改成了aardio。相关文章:快手软件存在哪些优点和不足? 、桌面程序开发语言选择易语言还是快手aauto 、 AAuto为何更名为aardio? 。后续有时间准备学学看。
- C#|Windows桌面程序开发非常给力,然而我没学
- electron | Build cross platform desktop apps with JavaScript, HTML, and CSS。我不会网页那些东西
- Qt | 跨平台,文档众多。Linux下的KDE桌面环境就是基于Qt做出来的,还针对嵌入式系统推出了一个Qt Lite。即使有Qt Design,然而学习成本依然高,需要花时间去学习。
- Visual Basic | 也支持Firmata协议。
因为比较熟悉Python,所以后续以它为例。在v2ex.com上搜索了一下:如果 Python 硬要写桌面应用,该如何是好?
已有的Python GUI库方案
- tkinter|难看,接口也难用。适合小玩意
- wxPython | 还阔以
- PyQt | 资料多,依赖复杂
- REMI | Python REMote Interface library. Platform independent. In about 100 Kbytes, perfect for your diet.
- Kivy | Open source Python library for rapid development of applicationsthat make use of innovative user interfaces, such as multi-touch apps.
- Ironpython | IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework.
- Gooey | Turn (almost) any Python command line program into a full GUI application with one line
最终我们选择REMI库来开发图形界面版程序。主要看中依赖少、身材小巧、上手容易、跨平台能力强等。
Python2 与 Python3 :
因为Python2即将结束支持。使用Python的原因是因为简单方便,库多不用重复造轮子,跨平台,功能强大。运行效率其实已经不是最优先的考虑要求啦,毕竟不是嵌入式设备。之前也学过Visual Basic、C、Linux Shell,但是用上Python之后立即爱上了,此外也有现成优秀的库支持Firmata协议。
REMI
既然有了那么多优秀的GUI库,为什么还要创建一个呢,作者是这样回答的:
Why another GUI lib?
Kivy, PyQT and PyGObject all require native code for the host operating system, which means installing or compiling large dependencies. Remi needs only a web browser to show your GUI.Kivy,PyQT,PyGobject都需要安装编译大量依赖才能在宿主机上原生运行,而Remi仅需要网页浏览器就可以显示GUI界面了。
Do I need to know HTML?
NO, It is not required, you have to code only in Python.仅需要会使用Python编程,而不用学习了解HTML(超文本标记语言,网页开发语言)就可以进行开发。
私以为其他优点包括扩拓展性强,方便外网访问等。我们可以看到REMI目前可实现的控件演示:

包括按钮、文本框、标签、输入对话框、列表、图片、表格、滑动条、颜色选择器、日期、文件选择对话框、菜单栏、菜单选项、视频播放等控件。具体用法可以参考doc 和examples文件夹里的内容。
最后推荐一个好用的Python IDE——PyCharm:

安装与hello_DFROBOT!
REMI项目主页:https://github.com/dddomodossola/remi
安装方法很简单,如上文所述:Win+R——cmd——python -m pip install remi,也可以pip install remi,注意需要管理员身份运行。另外新建的文件名不要和待加载的模块名相同(比如remi.py),否则会提示ModuleNotFoundError: No module named remi之类的错误(别问我怎么知道的。。。)。我们新建一个文件如remi_demo.py,代码如下:
import remi.gui as gui
from remi import start, App
class Hello_DFRobot(App):
def __init__(self, *args):
super(Hello_DFRobot, self).__init__(*args)
def main(self):
container = gui.VBox(width = 120, height = 100)
self.lbl = gui.Label('DFROBOT')
self.bt = gui.Button('Press me!')
# setting the listener for the onclick event of the button
self.bt.set_on_click_listener(self.on_button_pressed)
# appending a widget to another, the first argument is a string key
container.append(self.lbl)
container.append(self.bt)
# returning the root widget
return container
# listener function
def on_button_pressed(self, widget):
self.lbl.set_text('Drive the Future!')
self.bt.set_text('Button pressed!')
# starts the webserver
start(Hello_DFRobot)
效果如图所示:

运行后会自动打开一个网页,点击按钮,按钮和标签文字都会改变。这里简单讲解一下,详细的可以看官方doc文档和examples示例。
我们下面将会结合
requests库获取天气
pyFirmata库与Arduino交互
remi库作为图形显示
REMI editor
相信很多人都用过Visual Basic、Qt Designer这种可视化的用户界面设计工具,而REMI也有类似的,而且是使用remi本身实现的,就在editor文件夹里,具体使用说明参考其下的README.md文件,说明比较简略,这里详述如下:
安装好相关依赖库之后,运行editor.py (我这里是用的PyCharm IDE打开运行的)。

注意:
- 某个控件的响应可以在左下角signal connections里面设置。
- 虽然Web界面具有极大的跨平台优势,但是由于存在诸多浏览器、平台、屏幕大小分辨率,仍有可能设计出的界面在其他上面显示不全,所以仍要了解一些基本HTML常识
- ☆网页制作的层绝对定位和相对定位:一般选中主widget,右下角最后设置
position为absolute绝对定位(相对于浏览器左上角),其他widget中的控件设置为relative相对定位,然后在Geometry里设置坐标。- 菜单栏
Project Config可以设置项目的一些基本属性(支持中文项目名称),设计完毕后,点击File->Save YourApp->Save As即可保存界面代码,并在随后的程序中使用。
GUI 来了!

然后GUI又走了!表示这太丑了,自己也看不下去。。。遂弃用。决定回头仔细看看文档再重新来过。
LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)的更多相关文章
- Vue2/3 项目中的 ESLint + Prettier 代码检测格式化风格指南
Vue2/3 项目中的 ESLint + Prettier 代码检测格式化风格指南 因为平时都是使用 VSCode ESLint + Prettier 检测格式化不规范代码,但是随着接手的项目越来越多 ...
- 构建基于Suricata+Splunk的IDS入侵检测系统
一.什么是IDS和IPS? IDS(Intrusion Detection Systems):入侵检测系统,是一种网络安全设备或应用软件,可以依照一定的安全策略,对网络.系统的运行状况进行监视,尽可能 ...
- WPF 3D 平移模型+动画(桥梁检测系统)
原文:WPF 3D 平移模型+动画(桥梁检测系统) 关于WPF 3D,网上有很多旋转的例子,但是关于平移的例子并不是太多.本文并非WPF 3D扫盲篇,因此需要对WPF 3D有一定了解,至少知道View ...
- 开源入侵检测系统OSSEC搭建之二:客户端安装
上一篇文章中已经将OSSEC服务端的安装以及客户端的Key导出操作做了解说,接下来在另一台虚拟机中安装客户端,与安装服务端类似同样需要安装ossec,步骤如下. 一.下载ossec-hids-2.8. ...
- 开源入侵检测系统OSSEC搭建之一:服务端安装
OSSEC是一款开源的多平台的入侵检测系统,可以运行于Windows, Linux, OpenBSD/FreeBSD, 以及 MacOS等操作系统中.主要功能有日志分析.完整性检查.rootkit检测 ...
- WCF 项目应用连载[2] - 创建Lig日志系统
WCF 项目应用连载[1] - 索引 - 轻量级的Log系统 - Lig Sample -序 现在我们创建一个Lig工程 - Litelog 2.1 创建Lig服务 _________________ ...
- DoNet开源项目-基于Amaze UI的点餐系统
帮朋友做的点餐系统,主要是为了让顾客在餐桌上,使用微信扫描二维码,就可以直接点菜,吃完使用微信付款. 系统演示地址,账户名和密码均为:admin.(请不要删除admin用户) GitHub Clone ...
- 基于DSP的疲劳驾驶检测系统的研究
原地址:http://www.chinaaet.com/article/index.aspx?id=114534 关键词:疲劳检测DSP亮瞳效应PERCLOS 摘 要: 针对汽车驾驶员疲劳驾驶检测的 ...
- 谷歌发布基于机器学习的Android APP安全检测系统:Google Play Protect
Google Play作为众所周知的在线应用市场,因为审查制度的松散,经常会有一些恶意软件伪装成其他应用混入其中.此前阿里聚安全小编就报道了2例关于恶意软件伪装在Google Play上的事件:< ...
随机推荐
- mongodb系统出错。 发生系统错误 1067。 进程意外终止。
MongoDB安装目录\data\将此文件夹下的mongod.lock删除 mongod.exe --config E:\ruanjian\MongoDB\mongod.cfg --remove mo ...
- 02 Java 的基本类型
Java 的基本类型 Java 包括了八种基本类型,明细如下: Java 的基本类型都有对应的值域和默认值.byte,short,int,long,float以及double的值域依次扩大,前面的值域 ...
- csa Round #70
Digit Holes Time limit: 1000 msMemory limit: 256 MB When writing digits, some of them are consider ...
- 九度oj 题目1456:胜利大逃亡
题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius ...
- 【Luogu】P2596书架(Splay)
题目链接 通过这题我加深了对Splay的理解,原来Splay的子树也是可以接来接去接到别的点上的,而不是只能旋转qwq 具体接的办法就是swap大法. 对于Top操作我们把当前节点Splay到根,然后 ...
- 【Luogu】P3355骑士共存问题(最小割)
题目链接 像题面那样把棋盘染成红黄点.发现骑士迈一步能到达的点的颜色一定是跟他所在的格子的颜色不同的.于是(woc哪来的于是?这个性质有这么明显吗?)从源点向所有红点连边,从所有黄点向汇点连边,红点向 ...
- HDU——1596find the safest road(邻接矩阵+优先队列SPFA)
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- BZOJ3098 Hash Killer II 【概率】
挺有意思的一题 就是卡一个\(hash\) 我们先取L大概几十保证结果会超出\(10^9 + 7\) 然后就随机输出\(10^5\)个字符 由题目的提示我们可以想到,如果我们有\(n\)个数,选\(k ...
- 【HDOJ6229】Wandering Robots(马尔科夫链,set)
题意:给定一个n*n的地图,上面有k个障碍点不能走,有一个机器人从(0,0)出发,每次等概率的不动或者往上下左右没有障碍的地方走动,问走无限步后停在图的右下部的概率 n<=1e4,k<=1 ...
- net5:自定义验证控件服务器端验证与客户端验证的使用
原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...