pATAq 发表于 2017-5-17 00:21:40

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

前言原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文:http://**ceres.comblogs.com/sjqlwy/p/lattepanda_pyui.htmlUPDATE:
Part 2:【童叟咸欺】LattePanda 地面站项目P2.2 起飞条件检测系统2https://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影响飞机飞行的六大气象因素来自中国天气网:http://www.weather.com.cn/science/qxbk/jt/09/392758.shtml

气压风
云能见度
颠簸结冰
目前,我们可以获取气压、风力、云层、能见度等方面的数据,而四轴飞行器属于低空飞行,并不会受颠簸、结冰影响。为此,我们设计如下:
[*]通过在线天气预报API获取当前天气、风力、气压、能见度等信息;以及次日天气状况并进行判断
[*]获取传感器数据显示当前环境状况(由于缺少专业传感器,未来会连接气象站套件、购置新传感器、连接其他MCU获取气压等数据)
[*]显示结果
[*]物理面板:使用LCD液晶屏、物理按钮、LED灯等指示起飞条件状态
[*]图形界面(GUI):图形程序或网页界面(Web Interface)
[*]终端程序(CLI):Python Shell|Windows Command Prompt
获取天气条件(输入)天气预报API最简便且准确的途径就是获取天气预报啦,这里我们可以使用国内外诸多网站提供的服务API,可以在百度API Store查找使用各种免费收费服务。之前用过Yahoo、Weather等的API,这次无意中发现github上网友,非常棒,感谢LTonnyL整理的Awesome_APIs 列表(超链接已失效),有可能的话大家可以去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']['now']
tomorrow = get_weather()['weather']['future']

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']['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.enable_reporting()
sleep(1) # 缓冲时间
# 待补充DHT11以及校准光敏传感器
print("环境亮度:{0}\n环境温度:{1}\n环境湿度:{2}\n".format(board.analog.read(), "N/A", "N/A"))      
board.analog.disable_reporting()

# 绿灯亮
board.digital.write(1)
sleep(5)
board.digital.write(0)

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


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

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

hnyzcj 发表于 2017-5-17 08:42:11

楼主拍段视频我们看看

pATAq 发表于 2017-5-17 08:50:08

hnyzcj 发表于 2017-5-17 08:42
楼主拍段视频我们看看

等我把GUI那段写好一起发上来~

hnyzcj 发表于 2017-5-17 09:01:39

pATAq 发表于 2017-5-17 08:50
等我把GUI那段写好一起发上来~

好的,期待

吹口琴的钢铁侠 发表于 2017-5-19 09:27:04

博客地址好像挂了。。

pATAq 发表于 2017-5-20 22:19:19

吹口琴的钢铁侠 发表于 2017-5-19 09:27
博客地址好像挂了。。

嘿嘿,因为还没完成,所以博客还没发布~这两天发上去

pATAq 发表于 2017-5-26 00:24:42

吹口琴的钢铁侠 发表于 2017-5-19 09:27
博客地址好像挂了。。

hyperlink has been added!

Forgotten 发表于 2017-5-26 10:44:12

厉害了 期待成果{:5_171:}

Rockets 发表于 2017-5-26 11:39:59

关注并标记!感觉非常需要。
页: [1]
查看完整版本: LattePanda 地面站项目P2.2 起飞条件检测系统(CLI & GUI)1