一.功能展示
1.天气显示
第一行:更新时间
第二行:实际温度,体感温度
第三行:风速,风向,降水量
第四行:实时天气状况描述,湿度
2.B站粉丝显示
第一行:B站up主“帅农鸟哥”粉丝数及其变化量
第二行:B站up主“刘墉干净又卫生”粉丝数及其变化量
二.代码实现
import uzlib as zlib
import network
import time
import os
import urequests
import ujson
from machine import Pin, I2C
import ssd1306
from font import Font
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
f=Font(oled)
# ssid = '0217'
# passwd ='18100000066'
ssid = ['0217','vivo X60']
passwd =['18100000066','123456']
FTEXT = 1
FHCRC = 2
FEXTRA = 4
FNAME = 8
FCOMMENT = 16
def decompress(data): #解压数据
assert data[0] == 0x1f and data[1] == 0x8b
assert data[2] == 8
flg = data[3]
assert flg & 0xe0 == 0
i = 10
if flg & FEXTRA:
i += data[11] << 8 + data[10] + 2
if flg & FNAME:
while data[i]:
i += 1
i += 1
if flg & FCOMMENT:
while data[i]:
i += 1
i += 1
if flg & FHCRC:
i += 2
return zlib.decompress(memoryview(data)[i:], -15)
wlan=0
def connectWiFi(ssid, passwd): #连接WIFI
j=0
global wlan
wlan=network.WLAN(network.STA_IF)
wlan.active(True)
wlan.disconnect()
wlan.connect(ssid, passwd)
while(wlan.ifconfig()[0]=='0.0.0.0'):
time.sleep(1)
j=j+1
if(j>4):
return False
print("connected")
f.text("READY",20,15,32)
f.show()
return True
def cycle(): #主循环
try: #防止程序卡死
i=0
f.text("ing..",20,15,32)
f.show()
while(connectWiFi(ssid[i], passwd[i]) != True):
i+=1
t1=0
t2=0
while True:
res=urequests.get('https://devapi.qweather.com/v7/weather/now?location=101230207&key=8d5df776510c4a6fbf71656f5fbf8c21&lang=en') #爬数据
data=decompress(res.content).decode() #解析数据
j1=ujson.loads(data)
oled.fill(0) #显示到OLED
f.text("update:"+j1['updateTime'][11:16]+'--'+j1['now']['obsTime'][8:10],0,0)
f.text("T:"+j1['now']['temp']+"'C fT:"+j1['now']['feelsLike']+"'C",0,15)
f.text(j1['now']['windSpeed']+"kmh-"+j1['now']['windScale']+j1['now']['windDir'],0,30)
f.text(j1['now']['precip']+"mm",78,30)
f.text("H:"+j1['now']['humidity'],95,45)
f.text(j1['now']['text'],0,45)
f.show()
time.sleep(6)
oled.fill(0)
oled.hline(0,32,128,1)
req=urequests.get('https://api.bilibili.com/x/relation/stat?vmid=1838326986&jsonp=jsonp').text
j1=ujson.loads(req)
t=j1['data']['follower']
x=t-t1
if t1 !=0:
f.text(str(x),85,0,32)
t1=t
f.text('SLNG:',0,0)
f.text(str(j1['data']['follower']),0,15)
req=urequests.get('https://api.bilibili.com/x/relation/stat?vmid=533459953&jsonp=jsonp').text
j1=ujson.loads(req)
t=j1['data']['follower']
x=t-t2
if t2 !=0:
f.text(str(x),85,33,32)
t2=t
f.text('LYGJYWS:',0,35)
f.text(str(j1['data']['follower']),0,48)
f.show()
time.sleep(1)
except:
f.text("BREAK",20,15,32)
f.show()
cycle()
cycle()
三.作品展示
基于ESP32的天气显示+B站粉丝显示