from machine import I2C, Pin, Timer
import urequests as requests
import json
import time
import ssd1306
API_URL = "http://apis.juhe.cn/simpleWeather/query"
API_KEY = "7943428cac2848c0367ba9b844652e45"
CITY = "韶关"
simple_I18N = {
'多云转阴': 'cloud',
'阴转多云': 'cloud',
'晴': 'sunny',
'雨': 'rain',
'多云': 'cloud',
'韶关': 'Shaoguan',
'北京': 'Beijing'
}
class WeatherDisplay:
def __init__(self):
self.i2c = I2C(0, scl=Pin(22), sda=Pin(21))
self.oled = ssd1306.SSD1306_I2C(128, 64, self.i2c)
self.weather_data = None
self.last_update = 0
def connect_wifi(self):
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('Wokwi-GUEST', '')
while not wlan.isconnected():
print(".", end="")
time.sleep(0.1)
print("Connected!")
return True
def fetch_weather(self):
try:
params = '?key={}&city={}'.format(API_KEY, CITY)
r = requests.get(API_URL + params)
if r.content:
try:
content = json.loads(r.content)
result = content['result']
errno = content['error_code']
if errno == 0:
self.weather_data = {
'city': CITY,
'temp': result['realtime']['temperature'],
'weather': result['realtime']['info'],
'humidity': result['realtime']['humidity']
}
return True
else:
print('query error')
except Exception as e:
print('parse error')
else:
print('query error')
except Exception as e:
print('Weather fetch error:', e)
return False
def draw_dashboard(self):
if not self.weather_data:
return
self.oled.fill(0)
location = [
0b00011000,
0b00111100,
0b01100110,
0b01100110,
0b00111100,
0b00011000,
0b00011000,
0b00000000
]
for row in range(8):
byte = location[row]
for col in range(8):
pixel = (byte >> (7-col)) & 1
self.oled.pixel(0 + col, 0 + row, pixel)
self.oled.text(simple_I18N[CITY], 10, 0)
temp_str = 'temp: {}C'.format(self.weather_data['temp'])
self.oled.text(temp_str, 0, 20)
weather = 'weather: {}'.format(simple_I18N[self.weather_data['weather']])
self.oled.text(weather, 0, 30)
humidity_str = 'humidity: {}'.format(self.weather_data['humidity'])
self.oled.text(humidity_str, 0, 40)
update_min = int((time.time() - self.last_update) / 60)
self.oled.text('Upd {}mins ago'.format(update_min), 0, 50)
self.oled.show()
def run(self):
if not self.connect_wifi():
self.oled.text('WiFi connect error', 0, 0)
self.oled.show()
return
self.fetch_weather()
timer = Timer(-1)
timer.init(period=300000, mode=Timer.PERIODIC,
callback=lambda t: self.fetch_weather())
while True:
self.draw_dashboard()
time.sleep(10)
display = WeatherDisplay()
display.run()