查看: 1185|回复: 8

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

[复制链接]
本帖最后由 pATAq 于 2017-5-26 00:25 编辑

前言
原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。
本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文:

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

最近比较忙累,更新缓慢,烦请见谅。有问题欢迎PM。
本文测试环境:LattePanda:Windows 10 x64;Arduino 1.8.2;Python 3.6 + pyFirmata;TeamViewer 12|TightVNC C&S;host:Windows 7 x64
影响飞机飞行的六大气象因素[td]
气压
能见度
颠簸结冰
目前,我们可以获取气压、风力、云层、能见度等方面的数据,而四轴飞行器属于低空飞行,并不会受颠簸、结冰影响。为此,我们设计如下:
  • 通过在线天气预报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
代码如下:
[Python] 纯文本查看 复制代码
#!/usr/bin/env python3
#-*utf-8*-

import requests

def get_weather():
    # use api from [url=https://github.com/jokermonn/-Api/blob/master/CenterWeather.md]https://github.com/jokermonn/-Api/blob/master/CenterWeather.md[/url]
    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(数字写入)。未来加入物理大黄按钮进行控制(数字读取)。代码如下:
[Python] 纯文本查看 复制代码
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气象站套件(带风速计、风向仪、雨量器)

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

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


嘿嘿,因为还没完成,所以博客还没发布~这两天发上去
回复 支持 反对

使用道具 举报

pATAq  版主
 楼主|

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


hyperlink has been added!
回复 支持 反对

使用道具 举报

Forgotten  版主

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

厉害了 期待成果
回复 支持 反对

使用道具 举报

Rockets  NPC

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

关注并标记!感觉非常需要。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail