查看: 12417
回复: 5
参赛作品《四色WiFi空气质量显示器》

主题

回复
发表于2017-06-02 11:48:18 | 显示全部楼层
1# 电梯直达

姓名:林恒任
单位:厦门普瑞特科技有限公司
职务:软件工程师
作品名称:《四色WiFi空气质量显示器》

作品简介:
一个能够通过WiFii获取空气质量数据的桌面设备。
根据空气质量数据的不同,使用不同的颜色来标识数据。
能够通过手机对设备配置参数进行设置,例如连接WiFi的SSID和密码,目标城市等等。

拟用到的立创商城在售物料:
STM32F103C8T6
ESP8266模块
74HC373N
TLV70033
MicroUSB座子
SS8050
AO3407
FPC连接线及座子
2.54mm单排针/排座
0805,0603,1206封装电阻电容

拟用到的非立创商城物料或其它补充:
多色LED数码管


四色空气质量显示器

 



写在前面

事情的开始,要从很久以前我买的一个时钟说起。

那是iPhone发售不久的时候,乔布斯还站在苹果发布会上,HTC做出了第一台Android手机。为了给iPhone充电方便,我购买了一个飞利浦的充电时钟,它长这样:

 

它的正面是一个十分简洁的时钟,你可以把iPhone放在上面充电,顺便听听音乐和收音机。

一眨眼,iPhone已经出到第七代,这个Philips的充电座,早已经不能兼容新的iPhone充电接口,成了家里众多过气电器的一员。但我却从来没有将它收到抽屉里的念头。

因为它的时钟功能,真的是太好用了。

首先,它没有显示年份,月份,农历,星期几这些不常用到的功能。它的正面是很大的绿色LED,只显示当前的时间。即使距离很远,你也能一眼看清钟面上的数字。

其次,它可以从iPhone自动同步时间,完全不需要人工设置。

凭着这两个优点,这个本来应该收藏到柜子里面的“过气”电器,一直摆在我的客厅里使用到现在。

我从这件事情上受到启发:这是一个”Less is more“的好例子。因此,我想把这种简单,易用的设计理念,贯穿到设计四色空气质量显示器的过程当中。

它要足够简单,足够傻瓜,即使看不清面板上的数字,还是能知道当前的空气质量。




0x00 设计目标

设计目标可以用一句话来概括:

“能通过WiFi获取空气质量数据,并用四种颜色显示出来的桌面设备。”



0x01 要做的和不要做的

作为一个工程师,总是有许多功能想要实现,想要添加到产品中,有时反而忽视了这些功能对产品是不是真的合适。

举一个例子来说:我见过一个手机万能充电器,它有一整排的蓝色3mm高亮LED,在充电时,这些LED会开始跑马灯。然后在充电结束以后,它会用内置的蜂鸣器开始演奏《茉莉花开》。

想象一下,当你睡觉前开始用它给手机电池充电,你需要先找一个东西把它的高亮LED盖住,因为它的跑马灯闪的让人根本无法入睡。然后,几个小时过后,当你睡的正香的时候,它突然响亮的演奏了一曲《茉莉花开》,告诉你充电完成了。相信被吵醒的人,都会有把这个充电器丢到垃圾桶的冲动。

虽然跑马灯和蜂鸣器是工程师必备的练手好项目,但显然它们不适合出现在一个手机充电器上。

当设计四色空气质量显示器时,也有许多容易添加的功能。例如,增加一个DS18B20,就能显示温度啦,再增加一个DHT11,连湿度也能测量了,或者再来一个继电器,还能远程控制家电?

然而这些功能,就像充电器上的跑马灯一样,是完全多余的。它们反而会降低空气质量显示器本身的易用程度。

另外一个方面,因为这是一个WiFi联网设备,不可避免的,需要对设备进行配置,输入当前所使用WiFi的SSID和密码,才能连接互联网。

有许多种现成的方案能够实现这一个功能,例如:
  • 设备本身构造一个没有密码,或者密码已知的WiFi Station信号,通过手机连接,然后在手机上使用浏览器,对设备进行配置。
  • TI的SmartConfig,微信的AirKiss,MTK的SmartConnection等等

虽然有这么多不同的方法来配置WiFi,不过归根结底,这些方法都是利用WiFi信号做为载体,向联网设备发送ASCII字符。

在这次设计当中,我想尝试一下另外一种配置WiFi的方法:通过手机屏幕的闪烁,向空气质量显示器发送WiFi的SSID和密码。

这种方法和现有的SmartConfig,AirKiss等相比,优点是方便易用:只要拿起手机,直接输入要连接WiFi的SSID和密码,然后用手机屏幕对准设备,就能完成配置,不需要切换手机的WiFi环境。

这种方法的缺点是:传输速度受到手机屏幕刷新率的限制,不同的手机会存在一定差异。

到这里为止,小结一下要做的功能:
  1. 空气质量数据显示
  2. 通过手机屏幕来配置设备


0x02 它是这样工作的


图1 系统工作原理
 

整个系统的大致工作原理画在了图1中。

首先,空气质量数据的来源是专业的气象服务站,例如 aqicn.org,它们能够提供实时可靠的空气质量数据,以及获取这些数据的API。比起较为便宜的家用空气质量测试设备,这些专业气象网站的数据往往更加准确。

利用一台自有服务器,定时从专业气象站获取空气质量数据,并且保存到自有服务器本地。这样做的原因是:
  1. 能够保证系统的自由度
  2. 降低空气质量显示器固件的复杂性。

最后,空气质量显示器通过无线路由器的WiFi网络,连接自有服务器,获取空气质量数据,并根据空气质量的好坏,使用四种不同的颜色将数据显示出来:

图2 绿色,黄色,橙色和红色显示

    


0x03 硬件的设计

硬件分为两部分电路组成:数码管驱动电路以及MCU电路,两块电路板使用FPC排线相连接。

图3 PCB实物

 图3 PCB实物

显示部分选用了多色0.8英寸数码管。多色数码管的原理是在数码管的每个分段中,同时放入几种颜色不同的LED。通过控制不同颜色LED的亮度,就能混合出不同的颜色。

由于数码管的每一个分段都要放置数个LED,因此,这种多色数码馆的功耗也比单色数码管高出许多。空气质量显示器使用了3个多色数码管,同时点亮时,最大驱动电流会达到150mA左右。这已经接近了STM32能够允许的IO吸收电流限制,因此,直接使用STM32的IO口驱动这些数码管是不安全的,需要搭配额外的驱动电路。

图4 是数码管驱动电路的原理图。每一个数码管使用一片74HC373N锁存器来驱动。这个电路没有使用常见的数码管分时扫描显示法,而是利用了锁存器的数据保持功能,静态驱动数码管。

图4 数码管驱动电路

 


采用静态方式驱动数码管的原因有两个:
  1. 因为多色数码管的颜色调节需要使用PWM进行功率控制,如果同时使用分时扫描驱动,某些颜色时会出现闪烁现象。
  2. 既然数码管驱动电路是必须的添加的,为什么不让事情变的更简单一些呢?

图5 MCU和WiFi模块接口部分电路原理图

 



MCU选用STM32F103C8T6,通过串口连接WiFi模块,WiFi模块选用ESP8266。

P4是光敏电阻的接口。光敏电阻接收手机屏幕闪烁之后发出的信号。这个信号经过两级三极管简单放大以后,送到STM32进行解码。通过这种方式,实现低成本和有效的系统配置方法。

MicroUSB接口除了提供系统的电源以外,D-和D+还分别连接了STM32的串口RX和TX,这不是USB的标准连接方法,而是预留给调试设备使用的。

图6 设备内部图片


 


0x04 固件和软件

STM32固件
因为需要获取的数据在自己的服务器上进行了二次封包,所以STM32的固件在WiFi上的的处理就变得相对比较简单,图7是STM32程序的主要部分流程图:

图7 MCU固件流程图
  


光数据传输
系统使用手机屏幕闪烁的方式,来传递WiFi的SSID和密码。本质上这是一种异步单线传输,必须设定数据的传输速率,这和串口传输有点类似,只是我们的数据来源是屏幕手机的闪烁,并且预先约定好了数据的配置选项。

Javascript和屏幕刷新率
使用网页方式来实现手机端的应用程序。网址为:http://roots4pi.com/caqi-tool/

系统有三个配置选项:
  1. WiFi SSID
  2. WiFi密码
  3. 需要获取空气质量数据的城市位置

为了节约数据的传输时间,可以单独更新其中的任何一项,只要将其它选项留空白即可。

在页面上填写好需要更新的配置以后,将空气质量显示器放置在手机屏幕上,让它底部的光敏二极管能够和手机屏幕尽量靠近,然后点击页面上的 “start” 按钮。

几秒钟以后,如果数据传输和校验都正确,空气质量显示器会显示 “CCC”的字样,然后用新的配置自动重启运行。

通过手机屏幕闪烁的方式来传递数据,最大的问题在于:这个方法受限制与手机的屏幕刷新率。当屏幕的图像数据闪烁频率超过手机屏幕的硬件刷新率时,就会出现数据掉帧的现象。另一种情况是,手机处理器运行太慢,在一帧图像需要显示的时候,仍然没有完成图像的绘制。

这两种情况都会出现数据丢失损坏的现象。解决办法只有降低数据传输的频率,不过这样做也会延长数据传输的时间。


0x05 获取空气质量数据

获取空气质量原始数据的工作,是在自有Linux服务器上,使用python脚本完成的。

空气质量数据的来自于网站 www.aqicn.org,这是一个源自“ World Air Quality Index”项目的网站。网站的宗旨是:“提高空气污染意识,为全球提供统一的空气质量信息”。

aqicn网站还提供一个JSON的API接口,用来提供外部程序的集成:http://aqicn.org/json-api/doc/

我们的自有服务器上,通过设定Linux的定时任务,每隔15分钟,就调用一次python脚本,通过JSON的API接口,获取aqicn上的指定城市数据,然后保存在自有服务器本地,以提供给空气质量显示器使用。

以下是获取空气质量数据的python脚本:
import re
import requests
import sys
import json
import os

token = "06119a2e7f455402ef6c4ec02a62bc9a87ab××××"
addr  = "https://api.waqi.info/feed/"
path  = "/var/www/aqicn/"

if (len(sys.argv) > 1):
    city = sys.argv[1]
else:
    city = "xiamen"

req = addr + city + "/?token=" + token
str = requests.get(req).text
#print str
p = json.loads(str)

if (p['status'] == "ok"):
    print ("PM2.5 value = %d" % p['data']['iaqi']['pm25']['v'])
    fpath = path + city
    if (os.path.isfile(fpath)):
        os.remove(fpath)
    fh = open(fpath, "w")
    fh.write("%d" % p['data']['iaqi']['pm25']['v'])
    fh.close()
    print ("write to file " + fpath)
else:
    print ("response error")


0x06 外壳的一些考虑

空气质量显示器的外壳使用3D打印的方式制作。因为系统内部分成的两块电路板,因此需要考虑到两块电路板相互之间的固定和连接方式。

图8 外壳使用SketchUp设计
 


图9 3D打印外壳实物

 

空气质量显示器的正面使用了定制的黑色亚克力挡光板,让LED的显示更加清晰,美观。

图10 空气质量显示器正面

 


光敏二极管被设计安放在空气质量显示器的底部,这样,就可以把它直接放置在手机屏幕上,设置WiFi和城市位置信息。

图11 位于设备底部的光敏二极管

 


MicroUSB供电座位于设备后面,使用了90度的MicroUSB母座:

图12 设备背部接口

 


0x07 总结和延伸


四色空气质量显示器能够随时提供当前城市的空气质量信息,并使用四种不同的颜色来标识。比起单纯使用数字,这样的方法更加直观有效:只要抬起眼皮扫一眼,就能够知道今天的空气质量如何。因为是专用设备,在实际使用中,这比手机端的天气app,还要方便一些。

换一个角度想,这个设备实际上是一个能够用四种颜色显示远程服务器上数据的装置,至于数据的种类是什么,则完全由我们自己来定义。所以,可以简单的更改自有服务器上的脚本和数据,而不用重写设备固件,来改变设备的用途。

例如,我们可以通过gamil的API,获取授权邮箱的未读邮件数,然后显示在设备上。这样,四色空气质量显示器就变成了一个“未读邮件显示器”。

再如,我们也可以通过服务器,获取某一只股票的价格,显示在设备上,这样,四色空气质量显示器就变成了一个“迷你股票价格显示器”。

IoT设备的玩法多种多样,并且在个人或者工业领域,都有着十分广阔的应用前景。



0xFF 附录


原理图源文件:

SCH-MainBoard.zip 

SCH-DisplayBoard.zip 


PCB源文件:

PCB-MainBoard.zip 

PCB-DisplayBoard.zip 


BOM表:

BOM-MainBoard.zip 

BOM-DisplayBoard.zip 


腾讯视频:

https://v.qq.com/x/page/t0541yfz9nj.html


主题

回复
发表于2017-08-22 23:54:12   |  显示全部楼层
4#

> 楼主已完成【主动传播,恭喜再获5分;

> 所有参赛选手分值统计表及活动详细介绍见:http://www.szlcsc.com/go/17523dej

报名成功后至第二阶段结束(8月22日截止)前的任意时间在朋友圈发布特定图文内容即视为主动传播;

> 每位参赛选手都有一次主动传播加5分的机会,这就是传说中的“送分题”,详询立创君微信号:LCSCSZ扫码添加)。


主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部