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)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章