ESP32运行MicroPython从网络获取天气OLED显示

获取天气

网络上有好多获取天气的API,但是用的比较多的是心知天气提供的API。

注册心知天气账号(https://www.seniverse.com/),购买服务,可以看到秘钥:

有免费版的、有试用版的,免费版的可以一直使用,但是能获取的数据比较少,试用版的获取的数据更多,但是只能使用一个月。

API

将API中的your_private_key替换为自己的秘钥:https://api.seniverse.com/v3/weather/now.json?key=your_private_key&location=beijing&language=zh-Hans&unit=c,其中your_private_key位置为个人账户控制面板里面的私钥。

可以看到提供了比较多的天气参数类型,有空气类、天气类等:

在PC直接输入上面的api查看数据:

OLED显示

目前用的比较多的0.96吋的OLED是用SSD1306驱动的,github上有ssd1306的驱动模块(https://github.com/adafruit/micropython-adafruit-ssd1306),这个库支持i2c和spi两种接口,在初始化的时候选择不同的驱动方式。

7线制的oled同时支持i2c和spi,i2c接口的接线如下:

GND <---------------------> GND

VCC  <---------------------> VCC

D0    <---------------------> G22(SCL)

D1    <---------------------> G21(SDA)

RES   <---------------------> G19(这个引脚需要输出高电平)

注意事项:7线制的OLED,在这里使用的时候,用单片机驱动一直没问题,但是用micropython一直报错,后来问及网友说是有个电阻需要接上,D2和D1之间的电阻(我这里使用的是50Ω)需要接上,默认是没贴的,即就是下图中的R8。

 

调试技巧:I2C库里面提供能了scan函数可以扫描i2c设备,扫描到之后会打印设备的地址,如果扫描不到,那就需要检查了。

脚本编写

需要导入ssd1306.py(可以自行下载:https://github.com/adafruit/micropython-adafruit-ssd1306)这个脚本。

应用程序设计:

定义了两个函数:ConnectNet(ssid ,password)和OLEDInit(),一个用于连接wifi,一个用于初始化OLED。

间隔20s请求一次天气,将返回的值转换为json格式,打印在终端并在OLED显示。脚本中前面两个API是免费的,后一个API只能体验一个月。

import network
import time
import os
import urequests
import ujson

from machine import Pin, I2C
import ssd1306

ssid = '********'
password ='********'

def ConnectNet(ssid ,password):
    mynetwork=network.WLAN(network.STA_IF)
    mynetwork.active(True)
    mynetwork.connect(ssid,password)

    while True:
        if(mynetwork.isconnected()):
            break
        else :
            time.sleep(1)
    print(mynetwork.ifconfig())

def OLEDInit():
    res=Pin(19, mode=Pin.OUT, pull=None, value=1) 

    i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000)
    addr=i2c.scan()
    for x in addr:
         if x==60 :
            print('OLED exist!')
            break
         else:
            print('OLED not exist!')
    global oled
    oled = ssd1306.SSD1306_I2C(128, 64, i2c)

if __name__=='__main__':
    ConnectNet(ssid,password)
    OLEDInit()
    
    oled.text('Micropython', 20, 5)
    oled.show()
    oled.invert(False) 
    while True:
        result1=urequests.get('https://api.seniverse.com/v3/weather/now.json?key=SZQ692OfAQcUERtD4&location=SHENZHEN&language=zh-Hans&unit=c')
        j1=ujson.loads(result1.text)
        print(j1['results'][0]['location']['name'],end=' ')
        print(j1['results'][0]['now']['text'],end=' ')
        print(j1['results'][0]['now']['temperature'],end='℃ ')
        print(j1['results'][0]['last_update'])
        
#         oled.text(' shenzhen:'+j1['results'][0]['now']['temperature'],5,30)
#         oled.show()
        
        result2=urequests.get('https://api.seniverse.com/v3/weather/now.json?key=SZQ692OfAQcUERtD4&location=beijing&language=zh-Hans&unit=c')
        j2=ujson.loads(result2.text)
        print(j2['results'][0]['location']['name'],end=' ')
        print(j2['results'][0]['now']['text'],end=' ')
        print(j2['results'][0]['now']['temperature'],end='℃ ')
        print(j2['results'][0]['last_update'])
    
#         oled.text(' beijing:'+j2['results'][0]['now']['temperature'],5,40)
#         oled.show()
        
        result3=urequests.get('https://api.seniverse.com/v3/weather/now.json?key=Sd0epKp6o3tqxTqQ-&location=%E6%B7%B1%E5%9C%B3&language=zh-Hans&unit=c')
        j3=ujson.loads(result3.text)
        print(j3['results'][0]['location']['name'],end=' ')
        print(j3['results'][0]['now']['text'],end=' ')
        print(j3['results'][0]['now']['temperature'],end='℃ ')
        print(j3['results'][0]['now']['pressure'],end='Pa ')
        print(j3['results'][0]['now']['humidity'],end='% ')
        print(j3['results'][0]['now']['wind_speed'],end=' ')
        
        print(j3['results'][0]['last_update'])
        
        oled.fill(0);
        oled.show();
        oled.text('Shenzhen',25,5)
        oled.text('T:'+j3['results'][0]['now']['temperature']+'`',30,20)
        oled.text('H:'+j3['results'][0]['now']['humidity']+'%',30,30)
        oled.text('P:'+j3['results'][0]['now']['pressure']+'Pa',30,40)
        oled.text('W:'+j3['results'][0]['now']['wind_speed']+'km/h',30,50)

        oled.show()
        
        time.sleep(20)

 

 

要在ESP32运行MicroPython并在OLED屏幕上显示gif,您需要执行以下步骤: 1. 首先,您需要将MicroPython安装到ESP32上。您可以使用esptool.py工具将MicroPython固件烧录到ESP32上。具体的步骤可以参考官方文档:https://docs.micropython.org/en/latest/esp32/tutorial/intro.html 2. 确保您的ESP32OLED屏幕连接正确。您可以使用Adafruit SSD1306或SH1106 OLED屏幕。在MicroPython中,您可以使用u8g2库来控制OLED屏幕。在安装u8g2库之前,您需要安装ujson库。您可以使用以下命令安装ujson和u8g2库: ``` import upip upip.install('micropython-ujson') upip.install('micropython-u8g2') ``` 3. 接下来,您需要将gif文件转换为逐帧图像。您可以使用Python的imageio库执行此操作。您可以使用以下命令安装imageio库: ``` import upip upip.install('imageio') ``` 然后,您可以使用以下代码将gif文件转换为逐帧图像: ``` import imageio with imageio.get_reader('my_gif.gif') as reader: for i, frame in enumerate(reader): with open('frame{}.bmp'.format(i), 'wb') as f: f.write(frame.tobytes()) ``` 4. 现在,您可以使用u8g2库在OLED屏幕上显示图像。以下是一个简单的示例代码,它可以在OLED屏幕上显示逐帧图像: ``` import machine import u8g2 # Initialize OLED screen i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21)) oled = u8g2.ssd1306_i2c_128x64_noname(i2c) # Display frames for i in range(10): with open('frame{}.bmp'.format(i), 'rb') as f: oled.draw_xbm(0, 0, 128, 64, f.read()) oled.refresh() ``` 在此示例中,我们假设您已将逐帧图像保存为名为“frameX.bmp”的文件,其中X是帧编号。您可以根据实际情况更改代码。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freemote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值