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+ |
Sie können die Bauteile aber auch separat über die untenstehenden Links erwerben.
SN |
KOMPONENTE |
ANZAHL |
LINK |
---|---|---|---|
1 |
1 |
||
2 |
Micro-USB-Kabel |
1 |
|
3 |
1 |
||
4 |
Mehrere |
||
5 |
1 |
||
6 |
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.
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.
Loggen Sie sich bei OpenWeather ein oder erstellen Sie ein neues Konto.
Navigieren Sie zur API-Seite über die Navigationsleiste.
Wählen Sie Aktuelle Wetterdaten und klicken Sie auf Abonnieren.
Im Bereich Aktuelle Wetterdaten und Prognosen wählen Sie den passenden Dienst aus. Für unser Projekt reicht die kostenlose Version aus.
Kopieren Sie den Schlüssel von der Seite API-Schlüssel.
Fügen Sie diesen in das
secrets.py
-Skript auf Ihrem Raspberry Pi Pico W ein.Bemerkung
Falls Sie die Skripte
do_connect.py
undsecrets.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
Öffnen Sie die Datei
4_weather.py
im Verzeichniskepler-kit-main/iot
und klicken Sie auf Aktuelles Skript ausführen oder drücken Sie F5.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.
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.
# 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.