【得捷电子Follow me第1期】项目总结 :紫外线强度提示
[复制链接]
本帖最后由 TonyOne 于 2023-7-2 21:08 编辑
内容一:视频
播放器加载失败: 未检测到Flash Player,请到 安装
1_2_1
内容二: 项目总结报告
1. 项目描述
感谢电子工程世界和得捷电子举办的 Follow me 活动,让我有机会能够在专业大牛的带领下做出了这个小制作。
按照主办方要求,我购买了PicoW及转接板、ssd1315 oled屏以及GPS模块。本来还想用个joystick做翻页功能后来发现自己的心知天气账户功能很有限,所以一屏就足够了。
我涉及的项目是“紫外线强度提示”。这几天气温高、太阳晒,别说紫外线了,红外线都强。但是其实阴天、气温低的时候,紫外线一样很强的。虽说手机有些天气预报软件附带紫外线预报功能,但是对于我们经常出行的人来说,不一定会想到把地点调成自己所在的地方。所以我想到,可以用GPS的定位功能,获取所在地点的坐标,然后再通过网络服务,获取紫外线(UV)辐射强度,这样在屋里就可知道外边的情况了。
我想到用GPS坐标来查紫外线辐射,还有一个重要原因,就是我用过“心知天气”这个平台。这个平台的“生活指数”功能下,可以获取指定城市的基本、交通、生活、运动、健康 5 大类共 27 项生活指数。但是有限制——付费用户可获取全部数据; 免费用户只返回 6 项基本类生活指数,而且只有概述brief,没有details(详情请阅读文档 https://docs.seniverse.com/api/life/suggestion.html)。但这也足够我做这个小项目了。
收到板子并跟着学习了视频课程后,我先做了实验,学会了点亮板载led、PWM驱动蜂鸣器、用ssd1306的库驱动ssd1315、连接WiFi并在网络上发请求。然后就开始实验,发现GPS信号不怎么稳定,于是想到可以把上一次的坐标缓存到pos.txt里。坐标缓存到pos.txt里,为了安全起见,我把wifi的用户口令、心知天气的key,分别存到wifi.txt和key.txt里,在初始化阶段取出。
于是,系统运行的流程基本就确定了:
首先import库、初始化引脚、初始化UART和I2C、读取各项设置,然后获取GPS坐标,如果没得到就取保存的GPS坐标,否则更新保存GPS坐标,在后面就连接WIFI,从“心知天气”用GPS坐标获取本地紫外线强度和气温,最后通过oled屏显示出来。
最终效果就是上边的视频了。再次感谢电子工程世界和得捷电子。
2. 各功能对应的主要代码片段及说明
(1)驱动ssd1315 oled屏,使用的是ssd1306库:
上传到PICO上后,就可以导入了
- from machine import Pin,I2C
- from ssd1306 import SSD1306_I2C
- i2c=I2C(0,sda=Pin(8),scl=Pin(9),freq=400000)
- oled = SSD1306_I2C(128,64,i2c)
需要显示内容的时候,用这样的方式
- oled.contrast(50)
- oled.fill(0)
- oled.text("loc:", 2, 5)
- oled.text(" uv:", 2, 23)
- oled.text(" C:", 2, 41)
- oled.text( path , 40, 5)
- oled.text( uv , 40, 23)
- oled.text( t , 40, 41)
- oled.show()
-
(2)GPS使用uart读入
- from machine import Pin,UART
- gps_module = UART(0, baudrate=9600,tx=Pin(0), rx=Pin(1))
-
解析GPS返回的串用micropyGPS库
也是找的现成的代码处理
- my_gps = MicropyGPS(8)
-
- lat=''
- lng=''
- s_time=''
- rtc=''
-
- def get_GPS_values(com):
- global lat,lng,s_time,rtc
- time.sleep_ms(200)
- cc = com.readline()
- if cc:
- cc1=cc.decode()
- print(cc1)
- for x in cc:
- my_gps.update(chr(x))
-
- lat=str(my_gps.latitude[0] + (my_gps.latitude[1] / 60))
- lng=str(my_gps.longitude[0] + (my_gps.longitude[1] / 60))
- date = "20"+str(my_gps.date[2])+"-"+str(my_gps.date[1])+"-"+str(my_gps.date[0])+"T"
- timestamp = my_gps.timestamp
- rtc = str(int(timestamp[0]))+":"+str(int(timestamp[1]))+":"+str(int(timestamp[2]))
- s_time= date+rtc+"Z"
- print(lat,lng,s_time,rtc)
- return lat,lng,s_time,rtc
(3)连WIFI用micro python自带的network库
- import network
- ……
- wlan = network.WLAN(network.STA_IF)
- wlan.active(True )
- wlan.connect(ssid, password)
-
- max_wait = 10
- while max_wait >0:
- if wlan.status() < 0 or wlan.status() >= 3:
- break
- max_wait -= 1
- time.sleep(1)
-
-
- if wlan.status() != 3:
- return None
-
-
(4)从“心知天气”查UV和温度,用urequests,然后用json解析
- import urequests,json
- ……
- def url_rtn(url):
- r = urequests.get( url )
- s=r.content
- r.close()
- if s:
- s = s.decode()
- d=json.loads(s)
- return d
- else:
- return None
调用心知天气的http get
- uv,t,path=(None,None,None)
- d=url_rtn( "https://api.seniverse.com/v3/life/suggestion.json?key=%s&location=%f:%f&language=en&days=1"%(str(p_key) ,float(p_lat),float(p_lng) ))
- if d:
- uv = d['results'][0]['suggestion'][0]['uv']['brief']
- path = d['results'][0]['location']['name']
- o=url_rtn( "https://api.seniverse.com/v3/weather/now.json?key=%s&location=%f:%f&language=en&unit=c"%( str(p_key) ,float(p_lat),float(p_lng) ))
- if o:
- t = o['results'][0]['now']['temperature']
- print(t)
- if not path :
- path = d['results'][0]['location']['name']
- return uv,t,path
-
3. 功能展示及说明(图文并茂)
功能很简单,就是获取GPS坐标,然后连接WIFI,从“心知天气”用GPS坐标获取本地紫外线强度和气温,最后通过oled屏显示出来。
4. 对本活动的心得体会(包括意见或建议)
经过本次活动,熟悉了microPython,上手了树莓Pico,感觉收获很大。再次感谢电子工程世界和得捷电子。
内容三:可编译下载的代码
注意key要到www.seniverse.com去申请,WiFi配置用你自己手机的。
https://download.eeworld.com.cn/detail/TonyOne/628473
|