4. Echtzeit-Wetterdaten von @OpenWeatherMap

Dieses Projekt zielt darauf ab, eine intelligente Uhr zu bauen, die neben der aktuellen Uhrzeit auch das Wetter in Ihrer Stadt auf dem LCD-Display anzeigt.

1. Erforderliche Bauteile

Für dieses Projekt benötigen wir die folgenden Komponenten.

Es ist sicherlich praktisch, ein komplettes Set zu kaufen, hier ist der Link:

Name

INHALT DES KITS

LINK

Kepler-Kit

450+

Kepler Kit

Sie können die Bauteile aber auch separat über die untenstehenden Links erwerben.

SN

KOMPONENTE

ANZAHL

LINK

1

Raspberry Pi Pico W

1

BUY

2

Micro-USB-Kabel

1

3

Steckbrett

1

BUY

4

Jumperkabel

Mehrere

BUY

5

I2C LCD1602

1

BUY

6

Li-Po-Lademodul

1

7

18650-Batterie

1

8

Batteriehalter

1

2. Schaltungsaufbau

Warnung

Achten Sie darauf, das Li-Po-Ladegerät gemäß dem Schaltplan anzuschließen. Andernfalls könnten sowohl der Akku als auch die Schaltung Schaden nehmen.

../_images/4.owm_bb.png

3. OpenWeather-API-Schlüssel erhalten

OpenWeather ist ein Online-Dienst von OpenWeather Ltd, der globale Wetterdaten via API liefert. Dies umfasst aktuelle Wetterdaten, Prognosen, Kurzzeitvorhersagen und historische Wetterdaten für beliebige geografische Standorte.

  1. Loggen Sie sich bei OpenWeather ein oder erstellen Sie ein neues Konto.

    ../_images/OWM-1.png
  2. Navigieren Sie zur API-Seite über die Navigationsleiste.

    ../_images/OWM-2.png
  3. Wählen Sie Aktuelle Wetterdaten und klicken Sie auf Abonnieren.

    ../_images/OWM-3.png
  4. Im Bereich Aktuelle Wetterdaten und Prognosen wählen Sie den passenden Dienst aus. Für unser Projekt reicht die kostenlose Version aus.

    ../_images/OWM-4.png
  5. Kopieren Sie den Schlüssel von der Seite API-Schlüssel.

    ../_images/OWM-5.png
  6. Fügen Sie diesen in das secrets.py-Skript auf Ihrem Raspberry Pi Pico W ein.

    ../_images/4_openweather1.png

    Bemerkung

    Falls Sie die Skripte do_connect.py und secrets.py noch nicht auf Ihrem Pico W haben, entnehmen Sie bitte 1. Zugang zum Netzwerk, wie diese erstellt werden können.

    secrets = {
    'ssid': 'SSID',
    'password': 'PASSWORT',
    'webhooks_key': 'WEBHOOKS_API_KEY',
    'openweather_api_key': 'OPENWEATHERMAP_API_KEY'
    }
    

4. Skript ausführen

  1. Öffnen Sie die Datei 4_weather.py im Verzeichnis kepler-kit-main/iot und klicken Sie auf Aktuelles Skript ausführen oder drücken Sie F5.

    ../_images/4_openweather2.png
  2. Nachdem das Skript ausgeführt wurde, werden auf dem I2C LCD1602 die Uhrzeit sowie die Wetterinformationen Ihrer Region angezeigt.

    Bemerkung

    Falls das Display leer bleibt, können Sie den Kontrast durch Drehen des Potentiometers auf der Rückseite des Moduls erhöhen.

  3. Um das Skript automatisch beim Start auszuführen, können Sie es als main.py auf dem Raspberry Pi Pico W speichern.

Wie funktioniert es?

Der Raspberry Pi Pico W muss gemäß 1. Zugang zum Netzwerk mit dem Internet verbunden sein. Für dieses Projekt verwenden wir es einfach so.

from do_connect import *
do_connect()

Nachdem die Verbindung zum Internet hergestellt wurde, sorgt dieser Code-Abschnitt für die Synchronisation der Pico W-Uhrzeit mit der Greenwich Mean Time.

import ntptime
while True:
   try:
      ntptime.settime()
      print('Time Set Successfully')
      break
   except OSError:
      print('Time Setting...')
      continue

Für die Initialisierung Ihres LCD verweisen wir auf 3.4 Flüssigkristallanzeige.

from lcd1602 import LCD
lcd = LCD()
lcd.clear()
string = 'Lade...'
lcd.message(string)

Bevor wir die Wetterdaten abrufen, müssen wir die Einheit für bestimmte Wetterdaten (z. B. Temperatur, Windgeschwindigkeit) auswählen. In diesem Fall ist die Einheit metric.

# Open Weather
TEMPERATURE_UNITS = {
   "standard": "K",
   "metric": "°C",
   "imperial": "°F",
}

SPEED_UNITS = {
   "standard": "m/s",
   "metric": "m/s",
   "imperial": "mph",
}

units = "metric"

Die folgende Funktion ruft die Wetterdaten von openweathermap.org ab. Es wird eine URL-Nachricht mit Ihrer Stadt, API-Schlüsseln und einer festgelegten Einheit an die Website gesendet. Als Antwort erhalten Sie eine JSON-Datei mit den Wetterdaten.

def get_weather(city, api_key, units='metric', lang='en'):
   '''
   Get weather data from openweathermap.org
      city: City name, state code and country code divided by comma, Please, refer to ISO 3166 for the state codes or country codes. https://www.iso.org/obp/ui/#search
      api_key: Your unique API key (you can always find it on your openweather account page under the "API key" tab https://home.openweathermap.org/api_keys)
      unit: Units of measurement. standard, metric and imperial units are available. If you do not use the units parameter, standard units will be applied by default. More: https://openweathermap.org/current#data
      lang: You can use this parameter to get the output in your language. More: https://openweathermap.org/current#multi
   '''
   url = f"https://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units={units}&lang={lang}"
   print(url)
   res = urequests.post(url)
   return res.json()

Die Rohdaten könnten beispielsweise folgendermaßen aussehen:

weather data example:
{
    'timezone': 28800,
    'sys': {
        'type': 2,
        'sunrise': 1659650200,
        'country': 'CN',
        'id': 2031340,
        'sunset': 1659697371
    },
    'base': 'stations',
    'main': {
        'pressure': 1008,
        'feels_like': 304.73,
        'temp_max': 301.01,
        'temp': 300.4,
        'temp_min': 299.38,
        'humidity': 91,
        'sea_level': 1008,
        'grnd_level': 1006
    },
    'visibility': 10000,
    'id': 1795565,
    'clouds': {
        'all': 96
    },
    'coord': {
        'lon': 114.0683,
        'lat': 22.5455
    },
    'name': 'Shenzhen',
    'cod': 200,
    'weather':[{
        'id': 804,
        'icon': '04d',
        'main': 'Clouds',
        'description': 'overcast clouds'
    }],
    'dt': 1659663579,
    'wind': {
        'gust': 7.06,
        'speed': 3.69,
        'deg': 146
    }
}

Mit der Funktion print_weather(weather_data) werden diese Rohdaten in ein leicht verständliches Format umgewandelt und ausgegeben. Die Funktion ist jedoch nicht aufgerufen, und Sie können diese Zeile in der while True-Schleife bei Bedarf einkommentieren.

../_images/4_openweather3.png
# Ausgabe in der Shell
print_weather(weather_data)

In der while True-Schleife wird die Funktion get_weather() zuerst aufgerufen, um die für dieses Projekt benötigten Wetter-, Temperatur- und Feuchtigkeitsinformationen abzurufen.

weather_data = get_weather('shenzhen', secrets['openweather_api_key'], units=units)
weather = weather_data["weather"][0]["main"]
t = weather_data["main"]["temp"]
rh = weather_data["main"]["humidity"]

Die Ortszeit wird ermittelt. Hierzu wird die Funktion time.localtime() aufgerufen, die ein Tupel zurückgibt. Daraus extrahieren wir die Stunden und Minuten.

Beachten Sie, dass wir Pico W bereits auf die Greenwich Mean Time synchronisiert haben. Daher müssen wir die Zeitzone Ihres Standorts hinzufügen.

# get time (+24 allows for western hemisphere)
# if negative, add 24
# hours = time.localtime()[3] + int(weather_data["timezone"] / 3600) + 24  #only for west hemisphere

hours=time.localtime()[3]+int(weather_data["timezone"] / 3600)
mins=time.localtime()[4]

Schließlich werden die Wetterinformationen und die Zeit auf dem LCD1602 angezeigt.

lcd.clear()
time.sleep_ms(200)
string = f'{hours:02d}:{mins:02d} {weather}\n'
lcd.message(string)
string = f'{t}{TEMPERATURE_UNITS[units]} {rh}%rh'
lcd.message(string)

Ihr LCD1602 wird zu einer Uhr, die alle 30 Sekunden aktualisiert wird, wenn die Hauptschleife alle 30 Sekunden ausgeführt wird.