在前面所做的 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 而已, 結果如下 :
可見結果是一樣的.
沒有留言:
張貼留言