1205|6

650

帖子

8

TA的资源

纯净的硅(初级)

楼主
 

【得捷电子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编程,很多外设都是通过库使用,这极大的加快了快发速度和编程的上手,很适合新手入门使用,方便快捷。

演示视频链接:


 

整体代码文件: main_app (1).py (8.46 KB, 下载次数: 2)
sht31温湿度传感器代码文件: sht31.py (945 Bytes, 下载次数: 2)
oled显示包括图片显示代码文件: ssd1306.py (6.04 KB, 下载次数: 1)

四·历史发帖:

第一帖 熟悉thonny软件与micropython的基本语法

第二帖 驱动OLED

第三帖 连接网络获取天气预报

第四帖 GPS定位

第五帖 RGB点个灯

第六帖 网络同步时间显示到LED

第七帖 获取温湿度(SHT31)

 

 

最新回复

给力,重点参考对象   详情 回复 发表于 2023-6-19 00:00
点赞(1) 关注
 
 

回复
举报

282

帖子

7

TA的资源

一粒金砂(高级)

沙发
 

大佬厉害


天气预报功能很好,还带图标呢!


点评

用micro python开发,挺方便的,图片显示确实还花点时间才调好。  详情 回复 发表于 2023-6-18 09:15
 
 
 

回复

650

帖子

8

TA的资源

纯净的硅(初级)

板凳
 
sipower 发表于 2023-6-18 00:12 大佬厉害天气预报功能很好,还带图标呢!

用micro python开发,挺方便的,图片显示确实还花点时间才调好。

 
 
 

回复

4856

帖子

3

TA的资源

版主

4
 

功能越是强大,尺寸越是小,感觉就越是好

点评

主要相比与单片机,编程很方便  详情 回复 发表于 2023-6-19 08:59
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

5
 

给力,重点参考对象

点评

高德需要自己注册一个账号,然后把KEY填进去就可以用了  详情 回复 发表于 2023-6-19 08:59
 
 
 

回复

650

帖子

8

TA的资源

纯净的硅(初级)

6
 
sss421 发表于 2023-6-19 00:00 给力,重点参考对象

高德需要自己注册一个账号,然后把KEY填进去就可以用了

 
 
 

回复

650

帖子

8

TA的资源

纯净的硅(初级)

7
 
led2015 发表于 2023-6-18 21:38 功能越是强大,尺寸越是小,感觉就越是好

主要相比与单片机,编程很方便

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表