2024年10月27日 星期日

MicroPython 學習筆記 : 使用 SoftI2C 與 SSD1306 通訊

在前面所做的 SSD1306 實驗中都使用 ESP32 預設的硬體 I2C 腳 : GPIO21 (SDA) 與 GPIO22 (SCL), 其實也可以用 machine.SoftI2C 類別將任何其他的 GPIO 腳模擬為軟體 I2C 腳. 


本實驗使用 LOLIN D32 開發板, 使用 GPIO4 模擬 SDA 腳, GPIO5 模擬 SCL 腳. 下列程式改自 "MicroPython 學習筆記 : 用 SSD1306 顯示氣象資訊 (一)" 最後面的 weather_ssd1306.py :

# weather_ssd1306_softi2c.py
import config   
import xtools
import urequests   
import ujson
from machine import SoftI2C, Pin   
import ssd1306
import time

def get_weather(country, city, api_key):
    url=f'https://api.openweathermap.org/data/2.5/weather?q={city},{country}&units=metric&lang=zh_tw&appid={api_key}'
    try:
        res=urequests.get(url)
        data=ujson.loads(res.text)
        if data['cod']==200:    # 注意是數值
            ret={'geocode': data['id'],
                 'icon': data['weather'][0]['icon'],
                 'temperature': data['main']['temp'],
                 'pressure': data['main']['pressure'],
                 'humidity': data['main']['humidity']}
            return ret
        else:
            return None
    except Exception as e:
        return None

def show_weather(oled, data):
    oled.fill(0)  # (填滿 0 熄滅畫素)
    oled.text(data['city'], 0, 0, 1)  
    oled.text(data['time'], 0, 8, 1)  
    oled.text(f"Temperature:{data['temperature']}", 0, 16, 1)    
    oled.text(f"Humidity:{data['humidity']}", 0, 24, 1)    
    oled.text(f"Pressure:{data['pressure']}", 0, 32, 1)    
    oled.show()

def main():
    ip=xtools.connect_wifi(config.SSID, config.PASSWORD)
    if ip:
        # 設定氣象爬蟲參數
        weather_api_key=config.WEATHER_API_KEY
        city='Kaohsiung'   
        country='TW'
        # 建立 I2C 與 SSD1306_I2C 物件
        i2c=SoftI2C(scl=Pin(5), sda=Pin(4)) # ESP32 I2C
        oled=ssd1306.SSD1306_I2C(128, 64, i2c)
        while True:  # 每分鐘抓一次更新 OLED 顯示器
            data=get_weather(country, city, weather_api_key)
            data['time']=xtools.tw_now()  # 新增或更新欄位
            data['city']=city # 新增或更新欄位
            show_weather(oled, data)
            time.sleep(60)
    else:
        print('無法連線 WiFi')

if __name__ == '__main__':
  main()

僅修改了黃底部分, 主要是把 I2C 換成 SoftI2C 類別, 且 GPIO 腳更換為 GPIO4 與 GPIO5 而已,  結果如下 : 




可見結果是一樣的. 

沒有留言:

張貼留言