前言

原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。

本文使用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

能见度
颠簸结冰

目前,我们可以获取气压、风力、云层、能见度等方面的数据,而四轴飞行器属于低空飞行,并不会受颠簸、结冰影响。为此,我们设计如下:

  1. 通过在线天气预报API获取当前天气、风力、气压、能见度等信息;以及次日天气状况并进行判断
  2. 获取传感器数据显示当前环境状况(由于缺少专业传感器,未来会连接气象站套件、购置新传感器、连接其他MCU获取气压等数据)
  3. 显示结果:
  • 终端程序(CLI):Python Shell|Windows Command Prompt
  • 图形界面(GUI):图形程序或网页界面(Web Interface)
  • 物理面板:使用LCD液晶屏、物理按钮、LED灯等指示起飞条件状态

LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)-LMLPHP

获取天气条件(输入)

天气预报API

最简便且准确的途径就是获取天气预报啦,这里我们可以使用国内外诸多网站提供的服务API,可以在百度API Store查找使用各种免费收费服务。之前用过Yahoo、Weather等的API,这次无意中发现github上网友TonnyL整理的Awesome_APIs 列表,非常棒,感谢TonnyL,有可能的话大家可以去star或者捐赠。

我们选择中央天气预报(非官方) 这个API,首先数据准确,其次使用异常简单。

使用方法讲得很清楚,数据格式为json,如果不进行格式化,输出结果如下:

LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)-LMLPHP

其中\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!')

执行效果如下:

LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)-LMLPHP

注意:

获取传感器数据与物理按钮控制

前文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)

注意:

LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)-LMLPHP

【APRS气象站套件(带风速计、风向仪、雨量器)】

整合两个功能,即可以得到命令行界面版控制界面完整源码:

Graphics User Interface

前面搞定了CLI界面,基本功能实现了,但是此时的我想起来v2ex上一个段子:

所以我们准备为地面站系统做一个图形界面。用惯了CLI界面,对图形界面设计编程这个新领域学习了一番,收获颇丰,记录如下。

计划中的地面控制站包括网页版用户交互界面(屏幕软件交互)+物理控制面板(按钮LED交互)。

Windows下的桌面软件开发

  • 快手 aardio| 国人出品,专注于桌面软件快速开发,功能强大,永久免费,不过存在一些争议,名词也从AAuto改成了aardio。相关文章:快手软件存在哪些优点和不足?桌面程序开发语言选择易语言还是快手aautoAAuto为何更名为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库来开发图形界面版程序。主要看中依赖少、身材小巧、上手容易、跨平台能力强等。

REMI

既然有了那么多优秀的GUI库,为什么还要创建一个呢,作者是这样回答的:

私以为其他优点包括扩拓展性强,方便外网访问等。我们可以看到REMI目前可实现的控件演示

LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)-LMLPHP

包括按钮、文本框、标签、输入对话框、列表、图片、表格、滑动条、颜色选择器、日期、文件选择对话框、菜单栏、菜单选项、视频播放等控件。具体用法可以参考docexamples文件夹里的内容。

最后推荐一个好用的Python IDE——PyCharm:

LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)-LMLPHP

安装与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)

效果如图所示:

LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)-LMLPHP

运行后会自动打开一个网页,点击按钮,按钮和标签文字都会改变。这里简单讲解一下,详细的可以看官方doc文档和examples示例。

我们下面将会结合

  • requests库获取天气

  • pyFirmata库与Arduino交互

  • remi库作为图形显示

REMI editor

相信很多人都用过Visual Basic、Qt Designer这种可视化的用户界面设计工具,而REMI也有类似的,而且是使用remi本身实现的,就在editor文件夹里,具体使用说明参考其下的README.md文件,说明比较简略,这里详述如下:

安装好相关依赖库之后,运行editor.py (我这里是用的PyCharm IDE打开运行的)。

LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)-LMLPHP

GUI 来了!

LattePanda 项目之 P2.2 起飞条件检测系统(CLI & GUI)-LMLPHP

然后GUI又走了!表示这太丑了,自己也看不下去。。。遂弃用。决定回头仔细看看文档再重新来过。

05-20 17:28