Close
0%
0%

Weather Pal

A simple display for weather forecasts.

Similar projects worth following

This is a very simple example of using ESP8266 with MicroPython and a #D1 Mini Matrix Shield to make a weather forecast display. It will stand in my hall, connected to a phone charger, so that I won't forget an umbrella when leaving.

  • 1 × D1 Mini Lite
  • 1 × Mini Matrix Shield

  • Code

    deshipu04/01/2017 at 19:00 0 comments

    The code is far from pretty, but it works (at least as long as something goes wrong and it crashes). It gets the current weather information from the OpenWeatherMap API, and displays the icon and temperature, alternating them every 4 seconds. The particular prototype shield I used for testing also has 2 buttons, but they are not used by the code.

    import utime
    from machine import I2C, Pin
    from ht16k33_matrix import Matrix8x8
    import json
    import urequests
    
    
    API_KEY = "generate your own"
    CITY = "Zuirich"
    ICONS = {
        '00': (
            0b00000000,
            0b01000010,
            0b00100100,
            0b00011000,
            0b00011000,
            0b00100100,
            0b01000010,
            0b00000000,
        ),
        '01': (
            0b00010000,
            0b01010010,
            0b00111100,
            0b00111111,
            0b11111100,
            0b00111100,
            0b01001010,
            0b00001000,
        ),
        '02': (
            0b00010000,
            0b01010100,
            0b00111000,
            0b11111110,
            0b01000100,
            0b10000010,
            0b10000001,
            0b01111110,
        ),
        '03': (
            0b00000000,
            0b00000000,
            0b00000000,
            0b00111000,
            0b01000100,
            0b10000010,
            0b10000001,
            0b01111110,
        ),
        '04': (
            0b01100000,
            0b10011000,
            0b10000100,
            0b01111000,
            0b01000100,
            0b10000010,
            0b10000001,
            0b01111110,
        ),
        '09': (
            0b00111100,
            0b01111110,
            0b11111111,
            0b11111111,
            0b10001001,
            0b00001000,
            0b00101000,
            0b00111000,
        ),
        '10': (
            0b00101010,
            0b00011100,
            0b01111111,
            0b00011100,
            0b01111010,
            0b11111100,
            0b00010000,
            0b00110000,
        ),
        '11': (
            0b00001111,
            0b00011110,
            0b00111100,
            0b01111111,
            0b11111110,
            0b00000100,
            0b00001000,
            0b00010000,
        ),
        '13': (
            0b01010010,
            0b11010011,
            0b00111100,
            0b00100111,
            0b11100100,
            0b00111100,
            0b11001011,
            0b01001010,
        ),
        '50': (
            0b11111111,
            0b00000000,
            0b11111111,
            0b00000000,
            0b11111111,
            0b00000000,
            0b11111111,
            0b00000000,
        ),
    }
    DIGITS = {
        ' ': (
            0b0000,
            0b0000,
            0b0000,
            0b0000,
            0b0000,
        ),
        '0': (
            0b0111,
            0b0101,
            0b0101,
            0b0101,
            0b0111,
        ),
        '1': (
            0b0010,
            0b0010,
            0b0010,
            0b0010,
            0b0010,
        ),
        '2': (
            0b0111,
            0b0001,
            0b0111,
            0b0100,
            0b0111,
        ),
        '3': (
            0b0111,
            0b0001,
            0b0111,
            0b0001,
            0b0111,
        ),
        '4': (
            0b0101,
            0b0101,
            0b0111,
            0b0001,
            0b0001,
        ),
        '5': (
            0b0111,
            0b0100,
            0b0111,
            0b0001,
            0b0111,
        ),
        '6': (
            0b0111,
            0b0100,
            0b0111,
            0b0101,
            0b0111,
        ),
        '7': (
            0b0111,
            0b0001,
            0b0001,
            0b0001,
            0b0001,
        ),
        '8': (
            0b0111,
            0b0101,
            0b0111,
            0b0101,
            0b0111,
        ),
        '9': (
            0b0111,
            0b0101,
            0b0111,
            0b0001,
            0b0001,
        ),
        ':': (
            0b0000,
            0b0001,
            0b0000,
            0b0001,
            0b0000,
        ),
        '.': (
            0b0000,
            0b0000,
            0b0000,
            0b0000,
            0b0001,
        ),
        '-': (
            0b0000,
            0b0000,
            0b0001,
            0b0000,
            0b0000,
        ),
    }
    
    matrix = Matrix8x8(I2C(-1, Pin(5), Pin(4)))
    wait = 0
    
    
    def show(image, dx=0, dy=0):
        for y, row in enumerate(image):
            bit = 1
            for x in range(8):
                matrix.pixel(dx + x, dy + y, row & bit)
                bit <<= 1
        matrix.show()
    
    
    def show_text(text):
        x = 0
        for c in reversed(text):
            if c in '.:-':
                show(DIGITS.get(c, DIGITS[' ']), x - 1, 1)
            else:
                show(DIGITS.get(c, DIGITS[' ']), x, 1)
                x += 4
    
    
    def get_weather():
        r = urequests.get("http://api.openweathermap.org/data/2.5/weather"
                          "?q=%s&appid=%s" % (CITY, API_KEY)).json()
        return r["weather"][0]["icon"], int(r["main"]["temp"] - 273.15)
    
    
    while True:
        if wait <= 0:
            icon, temp = get_weather()
            wait = 60
        if icon[-1] == 'd':
            matrix.brightness(9)
        else:
            matrix.brightness(2)
        matrix.fill(0)
        show_text('%2d' % temp)
        utime.sleep(4)
        show(ICONS[icon[:2]])
        utime.sleep(4)
        wait -= 1
    

View project log

Enjoy this project?

Share

Discussions

danjovic wrote 04/02/2017 at 19:47 point

What an mazing project, pal!!! 

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates