Alan Wang
Published © CC BY-NC-SA

Web Weather Forecast Display on ESP8266 and MicroPython

Using a D1 mini to download and show one-week weather forecast data on an LCD 20x4 display.

BeginnerFull instructions provided1,544
Web Weather Forecast Display on ESP8266 and MicroPython

Things used in this project

Hardware components

Wemos D1 Mini
Espressif Wemos D1 Mini
×1
Alphanumeric LCD, 20 x 4
Alphanumeric LCD, 20 x 4
×1
Pushbutton switch 12mm
SparkFun Pushbutton switch 12mm
×1
Breadboard (generic)
Breadboard (generic)
×1
Jumper wires (generic)
Jumper wires (generic)
×6

Software apps and online services

MicroPython
MicroPython

Story

Read more

Schematics

Web Weather Forecast Display on ESP8266/D1 mini Circuit Diagram

RIP my Fritzing.

Code

Web Weather Forecast Display on ESP8266/D1 mini MicroPython Code

MicroPython
Change ssid and pw to your WiFi AP name and password. Do not share code containing these information online.
# Web Weather Forecast Display on ESP8266/D1 mini by Alan Wang
import network
import urequests
import ujson
import utime
import gc
import machine
from machine import I2C, Pin
from esp8266_i2c_lcd import I2cLcd # https://github.com/dhylands/python_lcd
gc.enable()


# user data
ssid = "your_ssid_name"
pw = "your_ssid_password"
url = "https://www.metaweather.com/api/location/2306179/" # see https://www.metaweather.com/api/


# push button -> D3 and G
button = Pin(0, Pin.IN)


# LCD 2004 I2C: Vcc -> 5V, Gnd -> G, SCL -> D1,  SDA -> D2
lcd = I2cLcd(I2C(scl=Pin(5), sda=Pin(4)), 0x27, 4, 20)

# clear lcd
def lcd_clear():
    lcd.move_to(0, 0)
    lcd.putstr(" " * 80)

# show text on lcd
def lcd_show(text, line):
    lcd.move_to(0, line)
    lcd.putstr(text)


# connecting to WiFi
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(ssid, pw)
lcd_clear()
lcd_show("Connecting to WiFi..", 0)
print("Connecting to WiFi...")
while not wifi.isconnected():
    pass
lcd_show("  connected.", 1)
print("  connected.")
print("")
utime.sleep(0.5)


# querying data
lcd_clear()
lcd_show("Querying data...", 0)
print("Querying data...")
date = []
w_state = []
min_temp = []
max_temp = []
humid = []
predic = []
loc = ""
time = ""
response = urequests.get(url)


if response.status_code == 200: # query successful
    lcd_show("  successful.", 1)
    print("  successful.")
    print("")
    utime.sleep(0.2)
    
    # parse JSON
    parsed = response.json()
    
    # excract data
    loc = (parsed["title"])[:18]
    time = parsed["time"]
    print("Weather forecast for [" + loc + "]")
    print("Data time: [" + time + "]")
    print("")
    for i in range(6):
        w_data = parsed["consolidated_weather"][i]
        date.append(w_data["applicable_date"][5:10])
        w_state.append(w_data["weather_state_name"])
        min_temp.append(round(float(w_data["min_temp"])))
        max_temp.append(round(float(w_data["max_temp"])))
        humid.append(int(w_data["humidity"]))
        predic.append(int(w_data["predictability"]))
        output_str = "Date: {0} [{1}%], Temp: {2}/{3} *C, Humid: {4}, State: {5}"
        print(output_str.format(date[i], predic[i], max_temp[i], min_temp[i], humid[i], w_state[i]))

else: # query failed, roboot
    lcd_show("  failed.\n  Rebooting...", 1)
    print("  failed. Rebooting...")
    utime.sleep(0.5)
    machine.reset()


print("")
print("Press button or unplug/replug device to update weather data.")
lcd_clear()
index = 0


# display data on LCD
while True:
    
    if button.value() is 0:
        break

    if len(date) > 0:
        lcd_show("{:^20}".format("[" + loc + "]"), 0)
        if index is 0:
            date_str = "Today"
        else:
            date_str = "Day {0}".format(index + 1)
        lcd_show("{0}: {1} ({2}%)".format(date_str, date[index], predic[index]), 1)
        lcd_show("{:^20}".format("T: {0}/{1} *C, H: {2}% ".format(max_temp[index], min_temp[index], humid[index])), 2)
        lcd_show("{:^20}".format(w_state[index]), 3)
        
        if index is 5:
            index = 0
        else:
            index += 1

    utime.sleep(1.5)


# user reboot
lcd_clear()
while button.value() is 0:
    pass
lcd_show("Rebooting...", 0)
print("Rebooting...")
print("")
utime.sleep(0.5)
machine.reset()

Credits

Alan Wang

Alan Wang

14 projects • 21 followers
I make microbit, Arduino, ESP8266 and maybe Raspberry Pi stuff.

Comments