【得捷电子Follow me第1期】《桌面天气预报小时钟》
[复制链接]
本帖最后由 29447945 于 2023-6-19 09:07 编辑
【得捷电子Follow me第1期】+桌面天气预报小时钟
一· 项目描述:
这款《桌面天气预报小时钟》作品使用了pico开发板和OLED屏幕等元件,能够提供多种天气预报,时钟,环境温湿度,恶劣天气报警等功能。首先,pico开发板是这款作品的核心,它采用了全新的RP2040芯片,具有高性能、低功耗和易于使用等特点。通过micro python编程,我们可以利用pico开发板控制各种温湿度传感器和OLED显示屏幕,实现桌面天气预报小时钟。
其次,这款作品使用了0.96寸OLED屏幕,它能够显示多种信息,包括天气预报、时间、日期、温度、湿度等。OLED屏幕具有高亮度、高对比度和低功耗等优点,非常适合用于这种小型的智能装置。我们可以通过编程,将各种信息显示在OLED屏幕上,实现多种效果和样式。
此外,这款作品还配备了温湿度传感器SHT31,它能够实时监测室内的温度和湿度,并将数据显示在屏幕上。这样,我们可以及时了解室内的环境状况,做出相应的调整。后期可以添加外设控制加湿器,这样我们还可以根据温湿度数据,实现自动调节室内温湿度的功能。最后,这款作品使用蜂鸣器报警,它能够在遇到恶劣天气时,以报警提醒用户不要出门。例如,当天气预报为雷阵雨或者温度超过35摄氏度时,蜂鸣器间隙报警5次,提醒用户。
最后,这款DIY桌面天气预报小时钟作品是一款多功能的桌面小时钟,后期还有很多可扩展性。
二·各部分功能描述及展示:
此项目主要包括网络部分、显示部分、温湿度传感器;
1.网络部分内容:
网络部分使用pico开发板自带wifi功能连接网络,在通过网络API获取公网IP,具体代码如下:
ip = urequests.get('http://ip.42.pl/raw')
ip_str = ip.content.decode('ascii')
print(ip_str)
ip.close()
获取到IP比如:171.213.5.12
通过公网IP,我们在高德API获取所处地区,具体代码如下(代码中的key我就不贴出来了):
str_data = 'https://restapi.amap.com/v3/ip?ip='+ip_str+'&output=JSON&key=xxxxxxx'
city = urequests.get(str_data)
city_str = city.content.decode('ascii')
#print(city_str)
parsed_city = ujson.loads(city_str)
adcode = parsed_city["adcode"]
city.close()
获取到的相关内容如下:
{"status":"1","info":"OK","infocode":"10000","province":"四川省","city":"成都市","adcode":"510100","rectangle":"103.9017713,30.53006918;104.2544496,30.79041003"}
然后再通过城市代码,从高德天气预报API接口获取到本地的天气,具体代码如下(代码中的key我就不贴出来了):
r = urequests.get('https://restapi.amap.com/v3/weather/weatherInfo?key=xxxxxx&city='+adcode)
w_str = r.content.decode('ascii')
#print(w_str)
parsed_w = ujson.loads(w_str)
#print (parsed_w)
#w_f = parsed_w["temperature"]
temp_str = parsed_w["lives"][0]["temperature_float"]
humi_str = parsed_w["lives"][0]["humidity_float"]
weather_str = parsed_w["lives"][0]["weather"]
获取到天气如下:
{"status":"1","count":"1","info":"OK","infocode":"10000","lives":[{"province":"四川","city":"成都市","adcode":"510100","weather":"阴","temperature":"25","winddirection":"西南","windpower":"≤3","humidity":"67","reporttime":"2023-06-17 20:07:49","temperature_float":"25.0","humidity_float":"67.0"}]}
2.显示部分
显示部分包括了时间显示,通过网络同步时钟后,获取RTC时钟,显示到OLED屏幕上,具体代码如下:
data_time = rtc.datetime() # get date and time
Data_disp = str("{:2d}:{:2d}:{:2d}".format(data_time[4],data_time[5],data_time[6]))
oled.text(Data_disp,35,51)
其次是天气预报获取后显示图片,图片我们使用取字模软件,直接把图片编码在代码中,具体实现代码如下:
buf_Thunderstorm = bytearray(b"\x00\x00\x00\xFF\x00\x00\x00\x00\x03\xFF\x80\x00\x00\x00\x07\xFF\xC0\x00\x00\x00\x0F\xFF\xE0\x00\x00\x00\xEF\x83\xF0\x00\x00\x03\xFF\x01\xF0\x00\x00\x0F\xFF\x00\xF0\x00\x00\x1F\xFE\x00\xF8\x00\x00\x1F\xFE\x00\xF8\x00\x00\x3F\x1C\x00\x7C\x00\x00\x7E\x00\x00\x7F\x00\x01\xFC\x00\x00\x7F\x80\x03\xFC\x00\x00\x3F\xC0\x03\xF8\x00\x00\x0F\xC0\x07\xE0\x00\x00\x03\xE0\x07\xC0\x00\x00\x03\xE0\x07\x80\x00\x00\x01\xE0\x07\x80\x00\x00\x01\xE0\x07\x80\x00\x08\x03\xE0\x07\xC0\x00\x10\x03\xE0\x03\xFF\xFF\x37\xFF\xC0\x03\xFF\xFE\x77\xFF\x80\x01\xFF\xFC\xF7\xFF\x00\x00\x7F\xFD\xF7\xFE\x00\x00\x00\x03\xE0\x00\x00\x00\x00\x07\xE0\x00\x00\x00\x00\x07\xE0\x00\x00\x00\x00\x0F\xFF\x80\x00\x00\x00\x1F\xFF\x00\x00\x00\x00\x3F\xFE\x00\x00\x00\x00\x7F\xFC\x00\x00\x00\x00\x01\xF8\x00\x00\x00\x00\x01\xF8\x00\x00\x00\x00\x03\xF0\x00\x00\x00\x00\x03\xE0\x00\x00\x00\x00\x03\xC0\x00\x00\x00\x00\x03\x80\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
buf_Sunny = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80\x00\x00\x00\x00\x03\xC0\x00\x00\x00\x00\x03\xE0\x00\x00\x00\x00\x03\xE0\x00\x00\x00\x00\x03\xE0\x00\x00\x00\x00\x03\xC0\x00\x00\x00\x70\x03\xC0\x02\x00\x00\xF8\x00\x00\x0F\x00\x00\xFC\x00\x00\x1F\x80\x00\xFC\x00\x00\x1F\x00\x00\x7C\x07\xF0\x3F\x00\x00\x3C\x3F\xFC\x1E\x00\x00\x00\x7F\xFF\x08\x00\x00\x00\xFF\xFF\x80\x00\x00\x01\xFF\xFF\xC0\x00\x00\x03\xFF\xFF\xC0\x00\x00\x07\xFF\xFF\xE0\x00\x00\x07\xFF\xFF\xF0\x00\x00\x0F\xFF\xFF\xF0\x00\x00\x0F\xFF\xFF\xF8\x00\x00\x0F\xFF\xFF\xF8\x00\x3F\x8F\xFF\xFF\xF8\xFC\x3F\x9F\xFF\xFF\xF9\xFC\x3F\x9F\xFF\xFF\xF9\xFC\x3F\x9F\xFF\xFF\xF8\xFC\x00\x0F\xFF\xFF\xF8\x78\x00\x0F\xFF\xFF\xF8\x00\x00\x0F\xFF\xFF\xF0\x00\x00\x0F\xFF\xFF\xF0\x00\x00\x07\xFF\xFF\xE0\x00\x00\x03\xFF\xFF\xE0\x00\x00\x01\xFF\xFF\xC0\x00\x00\x01\xFF\xFF\x80\x00\x00\x00\x7F\xFF\x00\x00\x00\x3C\x3F\xFE\x3C\x00\x00\x7C\x1F\xF8\x3E\x00\x00\xFC\x00\x00\x3F\x00\x00\xFC\x00\x00\x1F\x00\x00\xF8\x00\x00\x0F\x00\x00\xF0\x03\xC0\x07\x00\x00\x00\x03\xC0\x00\x00\x00\x00\x03\xC0\x00\x00\x00\x00\x03\xC0\x00\x00\x00\x00\x03\xC0\x00\x00\x00\x00\x03\xC0\x00\x00\x00\x00\x01\xC0\x00\x00\x00\x00\x00\x00\x00\x00")
buf_Rainy = bytearray(b"\x00\x00\x00\x3F\xF8\x00\x00\x00\x00\xFF\xFE\x00\x00\x00\x03\xFF\xFF\x80\x00\x00\x07\xFF\xFF\xC0\x00\x00\x0F\xFF\xFF\xE0\x00\x00\x1F\xFF\xFF\xF0\x00\x00\x3F\xF0\x1F\xF8\x00\x00\x3F\xC0\x07\xFC\x00\x00\x7F\x00\x01\xFC\x00\x00\x7E\x00\x00\xFE\x00\x00\xFE\x00\x00\x7E\x00\x00\xFC\x00\x00\x7E\x03\xFD\xFC\x00\x00\x7E\x0F\xFF\xF8\x00\x00\x3F\x1F\xFF\xF8\x00\x00\x3F\x3F\xFF\xF0\x00\x00\x3F\x7F\xFF\xF0\x00\x00\x3F\x7F\xFF\xF0\x00\x00\x1F\xFE\x1F\xF0\x00\x00\x3F\xFE\x07\xE0\x00\x00\x3F\xFC\x03\xE0\x00\x00\x3F\xFC\x00\x00\x00\x00\x3F\xFC\x00\x00\x00\x00\x3F\xF8\x00\x00\x00\x00\x7E\xFC\x00\x00\x00\x00\x7E\xFC\x00\x00\x00\x00\x7E\xFE\x00\x00\x00\x01\xFE\xFF\xFF\xFF\xFF\xFF\xFC\x7F\xFF\xFF\xFF\xFF\xF8\x7F\xFF\xFF\xFF\xFF\xF8\x3F\xFF\xFF\xFF\xFF\xF0\x1F\xFF\xFF\xFF\xFF\xC0\x0F\xFF\xFF\xFF\xFF\x80\x00\xFF\xFF\xFF\xFE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF0\x3C\x1E\x0F\x00\x00\xF8\x7C\x3F\x1F\x00\x01\xF8\x7E\x3F\x1F\x80\x01\xF8\x7E\x3F\x1F\x80\x01\xF8\x7E\x3F\x1F\x80\x01\xF8\x7E\x3F\x1F\x80\x01\xF8\x7E\x3F\x1F\x80\x01\xF8\x7C\x3F\x1F\x00\x00\xF0\x3C\x1E\x0F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
buf_Cloudy = bytearray(b"\x00\x00\x0F\x00\x00\x00\x00\x00\x1F\x00\x00\x00\x00\x00\x1F\x00\x00\x00\x00\x00\x1F\x80\x00\x00\x00\x00\x1F\x80\x00\x00\x00\x00\x1F\x80\x00\x00\x01\x80\x1F\x00\x30\x00\x03\xE0\x1F\x00\x7C\x00\x03\xE0\x0E\x00\xFC\x00\x07\xF0\x00\x01\xFC\x00\x03\xF0\x00\x01\xFC\x00\x03\xF0\x3F\xC1\xFC\x00\x01\xF0\xFF\xF1\xF8\x00\x01\xF3\xFF\xF9\xF0\x00\x00\x67\xFF\xFC\x60\x00\x00\x07\xFF\xFE\x00\x00\x00\x0F\xFF\xFE\x00\x00\x00\x1F\xF1\xFC\x00\x00\x00\x1F\xC0\x70\x00\x00\x00\x3F\x80\x01\xF8\x00\x00\x3F\x00\x0F\xFF\x00\x00\x3F\x00\x3F\xFF\x80\x7C\x7F\x00\xFF\xFF\xE0\xFE\x7E\x01\xFF\xFF\xF0\xFE\x7E\x03\xFF\xFF\xF8\xFF\x7E\x07\xFF\xFF\xFC\xFE\x7E\x07\xFC\x03\xFC\xFE\x7E\x0F\xF0\x00\xFE\x7C\x70\x1F\xE0\x00\x7E\x00\x00\x1F\xC0\x00\x3E\x00\x00\x1F\x80\x00\x3F\x00\x7F\x9F\x00\x00\x1F\x00\xFF\xFF\x00\x00\x1F\x01\xFF\xFF\x00\x00\x1F\x03\xFF\xFE\x00\x00\x1F\x03\xFF\xFE\x00\x00\x1F\x07\xFF\xFE\x00\x00\x1F\x07\xE0\xFE\x00\x00\x1F\x07\xC0\x7E\x00\x00\x1F\x07\xC0\x3C\x00\x00\x1F\x0F\xC0\x00\x00\x00\x3F\x0F\xE0\x00\x00\x00\x3F\x07\xFF\xFF\xFF\xFF\xFF\x07\xFF\xFF\xFF\xFF\xFE\x07\xFF\xFF\xFF\xFF\xFE\x03\xFF\xFF\xFF\xFF\xFE\x03\xFF\xFF\xFF\xFF\xFC\x01\xFF\xFF\xFF\xFF\xF0")
if WEATHER == "阴":
fb1 = framebuf.FrameBuffer(buf_Cloudy, 48, 48, framebuf.MONO_HLSB)
elif WEATHER == "晴":
fb1 = framebuf.FrameBuffer(buf_Sunny, 48, 48, framebuf.MONO_HLSB)
elif WEATHER == "小雨" or WEATHER == "中雨" or WEATHER == "大雨" or WEATHER == "暴雨":
fb1 = framebuf.FrameBuffer(buf_Rainy, 48, 48, framebuf.MONO_HLSB)
elif WEATHER == "雷阵雨":
fb1 = framebuf.FrameBuffer(buf_Thunderstorm, 48, 48, framebuf.MONO_HLSB)
oled.blit(fb1,5,1)
再次是显示温湿度传感器部分,通过sht31获取温湿度,在通过oled显示,具体代码如下:
sersor_data = sensor.read_temp_humd()# get serson date
TEMP_disp = str('{:.2f}'.format(sersor_data[0]))+' C'
oled.text(TEMP_disp,64,5)
HUMI_disp = str('{:.2f}'.format(sersor_data[1]))+' %'
oled.text(HUMI_disp,64,21)
3.温湿度传感器部分
温湿度传感器使用sht31,直接通过IIC接口获取温湿度,具体代码如下:
import utime
from machine import Pin
from machine import I2C
class SHT3x_Sensor:
def __init__(self, iic, addr=0x44):
self.i2c = iic
addrs = self.i2c.scan()
if not addrs:
raise Exception('no SHT3X found at bus on SDA pin %d SCL pin %d' % (sdapin, sclpin))
self.addr = addrs.pop()
def read_temp_humd(self):
status = self.i2c.writeto(self.addr,b'\x24\x00')
# delay (20 slow)
utime.sleep(1)
# read 6 bytes
databytes = self.i2c.readfrom(self.addr, 6)
dataset = [databytes[0],databytes[1]]
dataset = [databytes[3],databytes[4]]
temperature_raw = databytes[0] << 8 | databytes[1]
temperature = (175.0 * float(temperature_raw) / 65535.0) - 45
# fahreheit
# temperature = (315.0 * float(temperature_raw) / 65535.0) - 49
humidity_raw = databytes[3] << 8 | databytes[4]
humidity = (100.0 * float(humidity_raw) / 65535.0)
sensor_data = [temperature, humidity]
return sensor_data
最后显示效果如下:
三·活动总结
首先感谢EE和得捷电子的本次活动,通过本次活动学习了pico开发板和micro python编程,之前做stm32相关内容,很多模块化的东西都不太方便通用,经历本次micro python编程,很多外设都是通过库使用,这极大的加快了快发速度和编程的上手,很适合新手入门使用,方便快捷。
演示视频链接:
sht31温湿度传感器代码文件:
sht31.py
(945 Bytes, 下载次数: 2)
四·历史发帖:
第一帖 熟悉thonny软件与micropython的基本语法
第二帖 驱动OLED
第三帖 连接网络获取天气预报
第四帖 GPS定位
第五帖 RGB点个灯
第六帖 网络同步时间显示到LED
第七帖 获取温湿度(SHT31)
|