# SPDX-FileCopyrightText: 2020 John Park for Adafruit Industries # # SPDX-License-Identifier: MIT # Matrix Weather display # For Metro M4 Airlift with RGB Matrix shield, 64 x 32 RGB LED Matrix display """ This example queries the Open Weather Maps site API to find out the current weather for your location... and display it on a screen! if you can find something that spits out JSON data, we can display it """ from os import getenv import time import board import microcontroller from digitalio import DigitalInOut, Direction, Pull from adafruit_matrixportal.network import Network from adafruit_matrixportal.matrix import Matrix import openweather_graphics # pylint: disable=wrong-import-position # Get WiFi details, ensure these are setup in settings.toml ssid = getenv("CIRCUITPY_WIFI_SSID") password = getenv("CIRCUITPY_WIFI_PASSWORD") if None in [ssid, password]: raise RuntimeError( "WiFi settings are kept in settings.toml, " "please add them there. The settings file must contain " "'CIRCUITPY_WIFI_SSID', 'CIRCUITPY_WIFI_PASSWORD', " "at a minimum." ) if hasattr(board, "D12"): jumper = DigitalInOut(board.D12) jumper.direction = Direction.INPUT jumper.pull = Pull.UP is_metric = jumper.value elif hasattr(board, "BUTTON_DOWN") and hasattr(board, "BUTTON_UP"): button_down = DigitalInOut(board.BUTTON_DOWN) button_down.switch_to_input(pull=Pull.UP) button_up = DigitalInOut(board.BUTTON_UP) button_up.switch_to_input(pull=Pull.UP) if not button_down.value: print("Down Button Pressed") microcontroller.nvm[0] = 1 elif not button_up.value: print("Up Button Pressed") microcontroller.nvm[0] = 0 print(microcontroller.nvm[0]) is_metric = microcontroller.nvm[0] else: is_metric = False if is_metric: UNITS = "metric" # can pick 'imperial' or 'metric' as part of URL query print("Jumper set to metric") else: UNITS = "imperial" print("Jumper set to imperial") # Use cityname, country code where countrycode is ISO3166 format. # E.g. "New York, US" or "London, GB" LOCATION = "Los Angeles, US" print("Getting weather for {}".format(LOCATION)) # Set up from where we'll be fetching data DATA_SOURCE = ( "http://api.openweathermap.org/data/2.5/weather?q=" + LOCATION + "&units=" + UNITS ) DATA_SOURCE += "&appid=" + getenv("openweather_token") # You'll need to get a token from openweather.org, looks like 'b6907d289e10d714a6e88b30761fae22' # it goes in your settings.toml file on a line such as: # 'openweather_token="your_big_humongous_gigantor_token"', DATA_LOCATION = [] SCROLL_HOLD_TIME = 0 # set this to hold each line before finishing scroll # --- Display setup --- matrix = Matrix() network = Network(status_neopixel=board.NEOPIXEL, debug=True) if UNITS in ("imperial", "metric"): gfx = openweather_graphics.OpenWeather_Graphics( matrix.display, am_pm=True, units=UNITS ) print("gfx loaded") localtime_refresh = None weather_refresh = None while True: # only query the online time once per hour (and on first run) if (not localtime_refresh) or (time.monotonic() - localtime_refresh) > 3600: try: print("Getting time from internet!") network.get_local_time() localtime_refresh = time.monotonic() except RuntimeError as e: print("Some error occured, retrying! -", e) continue # only query the weather every 10 minutes (and on first run) if (not weather_refresh) or (time.monotonic() - weather_refresh) > 600: try: value = network.fetch_data(DATA_SOURCE, json_path=(DATA_LOCATION,)) print("Response is", value) gfx.display_weather(value) weather_refresh = time.monotonic() except RuntimeError as e: print("Some error occured, retrying! -", e) continue gfx.scroll_next_label() # Pause between labels time.sleep(SCROLL_HOLD_TIME)