树梅派应用38:树莓派 SAKS 扩展板挑战应用 之 PM2.5 指示灯

本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。

本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。

20151007135014585-0

本节以 SAKS 扩展板为硬件基础,实现所在城市PM2.5指数显示,并用三色LED配合蜂鸣器警报来提示环境状态。由于要监测当前环境的PM2.5需要专用传感器,气象发布机构已经对每个城市做了空气指数的采集,我们可以利用他们发布的数据显示出来,即可满足日常对PM2.5的关注需求。

由于我们已经开始基于 SAKS SDK 开发(了解 SAKS SDK 发布的信息请阅读这里),本例程中涉及到的 SAKS 扩展板引脚编号我们根本不需要再关心。

首先,要获取互联网上的PM2.5数据,可以搜索一下专业机构的API,下面的例子使用的是和风天气的API。要使用他们的API,需要简单注册一下,会得到一个字符串Key,在下面的例子中填入这个Key就可以调用他们的数据了。另外需要找到自己所在城市对应的编码替换“CN101020100”这一段代码。注意,并不是所有的城市下辖的区域都有PM2.5数据,因此在选择城市的时候尽量选择有PM2.5数据的区域。

用 Python 实现获得PM2.5指数的程序,这个方法返回一个PM2.5数值,如果返回-1,表示数据获取失败:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
'''
cityid 和 key 需要根据实际情况替换
参考 http://www.heweather.com/documents/api
http://www.heweather.com/documents/cn-city-list
'''
weather_url = 'https://api.heweather.com/x3/weather?cityid=CN101020100&key=xxx'
 
def get_pm25():
     global weather_url
     req = urllib2.Request(weather_url)
     resp = urllib2.urlopen(req)
     content = resp.read()
     if (content):
         weatherJSON = json.JSONDecoder().decode(content)
         #print(content)
         try :
             if weatherJSON[ 'HeWeather data service 3.0' ][ 0 ][ 'status' ] = = "ok" :
                 if weatherJSON[ 'HeWeather data service 3.0' ][ 0 ].has_key( 'aqi' ):
                     print (weatherJSON[ 'HeWeather data service 3.0' ][ 0 ][ 'aqi' ][ 'city' ][ 'pm25' ])
                     return int (weatherJSON[ 'HeWeather data service 3.0' ][ 0 ][ 'aqi' ][ 'city' ][ 'pm25' ])
                 else :
                     return - 1
             else :
                 return - 1
         except :
             return - 1

下面直接调用SAKS SDK的方法来让LED和蜂鸣器工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
if __name__ == "__main__" :
     while True:
         pm25 = get_pm25()
         if pm25 == -1:
             time . sleep (30)
             continue
 
         #严重污染,红灯亮蜂鸣器Beep
         if pm25 >= 250:
             SAKS.ledrow.off()
             SAKS.ledrow.items[7].on()
             SAKS.buzzer.beepAction(0.05,0.05,3)
         #重度污染,红灯亮
         if pm25 < 250:
             SAKS.ledrow.off()
             SAKS.ledrow.items[7].on()
         #中度污染,红灯亮
         if pm25 < 150:
             SAKS.ledrow.off()
             SAKS.ledrow.items[7].on()
         #轻度污染,黄灯亮
         if pm25 < 115:
             SAKS.ledrow.off()
             SAKS.ledrow.items[6].on()
         #良,一个绿灯亮
         if pm25 < 75:
             SAKS.ledrow.off()
             SAKS.ledrow.items[4].on()
         #优,两个绿灯亮
         if pm25 < 35:
             SAKS.ledrow.off()
             SAKS.ledrow.items[4].on()
             SAKS.ledrow.items[5].on()
 
         #print (("%4d" % pm25).replace(' ','#'))
         #数码管显示PM2.5数值
         SAKS.digital_display.show(( "%4d" % pm25).replace( ' ' , '#' ))
         time . sleep (1800)
     input( "Enter any keys to exit..." )

上面加入了每30分钟读取一次PM2.5指数并刷新数码管的逻辑。由于数码管的 show 方法已经封装了数码管的逻辑,因此任何时候调用数码管显示数值,只需要调用这个方法,把数值作为参数提供即可。
SAKS.ledrow.items[7].on() 表示第8个LED亮,SAKS.ledrow.off() 表示所有LED熄灭。SAKS SDK 已经将瑞士军刀的操作作了封装,只用知道如何应用即可,当然有兴趣也可以下载 SDK 的源码研究。
将上面的程序源码保存为 main.py 接下来如果要运行,请注意程序开头的 from sakshat import SAKSHAT,需要导入 SAKS SDK 模块。为此我们需要将 SAKS SDK 模块的相关文件和 main.py 放在一起才能正确执行 main.py 程序。我们准备了一个包含 main.py 和 SAKS SDK 的包并在 Github 上提供下载:https://github.com/spoonysonny/SAKS-tutorials/tree/master/pm25-display

在终端运行:

1
2
3
4
git clone https: //github .com /spoonysonny/SAKS-tutorials .git
cd SAKS-tutorials
cd pm25-display
sudo python main.py

PM2.5指数显示在了 SAKS 扩展板上,数码管下方的LED同时显示了空气质量状态。

20151007135014567-0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值