LattePanda 地面站项目P2.2 起飞条件检测系统(CLI & GUI)1

2017-05-161.4万
精华项目
AI 快速预览详细 收起
本文介绍了使用LattePanda开发的地面站项目P2.2,通过在线天气预报API和传感器数据检测飞行器起飞条件。项目包括CLI和GUI界面,用于显示当前和次日的天气状况,并通过传感器数据判断飞行条件。代码示例展示了如何使用Python和pyFirmata库实现这一功能。
前言
原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。
本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文:
http://**ceres.comblogs.com/sjqlwy/p/lattepanda_pyui.html
UPDATE:

Part 2:【童叟咸欺】LattePanda 地面站项目P2.2 起飞条件检测系统2
https://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=25204

最近比较忙累,更新缓慢,烦请见谅。有问题欢迎PM。
本文测试环境:LattePanda:Windows 10 x64;Arduino 1.8.2;Python 3.6 + pyFirmata;TeamViewer 12|TightVNC C&S;host:Windows 7 x64
影响飞机飞行的六大气象因素
气压
能见度
颠簸结冰
目前,我们可以获取气压、风力、云层、能见度等方面的数据,而四轴飞行器属于低空飞行,并不会受颠簸、结冰影响。为此,我们设计如下:
  • 通过在线天气预报API获取当前天气、风力、气压、能见度等信息;以及次日天气状况并进行判断
  • 获取传感器数据显示当前环境状况(由于缺少专业传感器,未来会连接气象站套件、购置新传感器、连接其他MCU获取气压等数据)
  • 显示结果
  • 物理面板:使用LCD液晶屏、物理按钮、LED灯等指示起飞条件状态
  • 图形界面(GUI):图形程序或网页界面(Web Interface)
  • 终端程序(CLI):Python Shell|Windows Command Prompt

LattePanda 地面站项目P2.2 起飞条件检测系统(CLI & GUI)1图2
获取天气条件(输入)天气预报API
最简便且准确的途径就是获取天气预报啦,这里我们可以使用国内外诸多网站提供的服务API,可以在百度API Store查找使用各种免费收费服务。之前用过Yahoo、Weather等的API,这次无意中发现github上网友,非常棒,感谢LTonnyL整理的Awesome_APIs 列表(超链接已失效),有可能的话大家可以去star或者捐赠。
我们选择中央天气预报(非官方) 这个API,首先数据准确,其次使用异常简单。
使用方法讲得很清楚,数据格式为json,如果不进行格式化,输出结果如下:
LattePanda 地面站项目P2.2 起飞条件检测系统(CLI & GUI)1图3
其中\uXXXX为JS string,虽然有很多小工具如curl、httpie配合json格式化工具可以完成解码,但是为了后续拓展方便,我们使用Python + requests库来实现数据获取与处理。
获取天气状况
测试环境:Python 3.6.1 for Windows;pyFirmata 1.0.3 (pyserial needed);requests 2.14.2
代码如下:
[mw_shl_code=applescript,true][mw_shl_code=python,true]#!/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!')[/mw_shl_code]
执行效果如下:
LattePanda 地面站项目P2.2 起飞条件检测系统(CLI & GUI)1图4
注意:
  • 注意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(数字写入)。未来加入物理大黄按钮进行控制(数字读取)。代码如下:

[mw_shl_code=python,true]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)[/mw_shl_code]
注意:
  • 请填写正确的串口编号
  • 使用第三方StandardFirmataPlus固件是出现问题,led点亮后无法熄灭,重新烧录官方StandardFirmata固件后回复正常,等待重新验证问题。
  • 操作模拟端口时,建议启动一个迭代器线程进行处理,否则开发板会持续向串口发送数据,直到串口溢出。更多例子及使用方法请参考官方tests.py
  • 开启reporting后请延时后读取模拟量,否则可能获取不到传感器数值;另外单次读取完毕请disable,不然也会一直发送数据(Tx白色指示灯常亮)
  • 后续使用pyMata-aio取代pyFirmata库,它支持最新的firmata协议,使用异步,并且可以自动检测Arduino串口。
  • A9、A10分别接绿色、红色LED。

LattePanda 地面站项目P2.2 起飞条件检测系统(CLI & GUI)1图1

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

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

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(5)
微笑的rockets
微笑的rockets
关注并标记!感觉非常需要。
Forgotten
Forgotten
厉害了 期待成果
吹口琴的钢铁侠
吹口琴的钢铁侠
博客地址好像挂了。。
pATAq
pATAq
作者
回复吹口琴的钢铁侠
hyperlink has been added!
pATAq
pATAq
作者
回复吹口琴的钢铁侠
嘿嘿,因为还没完成,所以博客还没发布~这两天发上去
pATAq
pATAq
作者
等我把GUI那段写好一起发上来~
hnyzcj
hnyzcj回复pATAq
好的,期待
hnyzcj
hnyzcj
楼主拍段视频我们看看
- 没有更多了 -