.. note:: Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten. **Warum beitreten?** - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams. - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern. - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken. - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte. - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil. 👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei! 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: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Name - INHALT DES KITS - LINK * - Kepler-Kit - 450+ - |link_kepler_kit| Sie können die Bauteile aber auch separat über die untenstehenden Links erwerben. .. list-table:: :widths: 5 20 5 20 :header-rows: 1 * - SN - KOMPONENTE - ANZAHL - LINK * - 1 - :ref:`cpn_pico_w` - 1 - |link_picow_buy| * - 2 - Micro-USB-Kabel - 1 - * - 3 - :ref:`cpn_breadboard` - 1 - |link_breadboard_buy| * - 4 - :ref:`cpn_wire` - Mehrere - |link_wires_buy| * - 5 - :ref:`cpn_i2c_lcd` - 1 - |link_i2clcd1602_buy| * - 6 - :ref:`cpn_lipo_charger` - 1 - * - 7 - 18650-Batterie - 1 - * - 8 - Batteriehalter - 1 - **2. Schaltungsaufbau** .. warning:: 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. .. image:: img/wiring/4.owm_bb.png **3. OpenWeather-API-Schlüssel erhalten** |link_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 |link_openweather| ein oder erstellen Sie ein neues Konto. .. image:: img/OWM-1.png #. Navigieren Sie zur API-Seite über die Navigationsleiste. .. image:: img/OWM-2.png #. Wählen Sie **Aktuelle Wetterdaten** und klicken Sie auf Abonnieren. .. image:: img/OWM-3.png #. Im Bereich **Aktuelle Wetterdaten und Prognosen** wählen Sie den passenden Dienst aus. Für unser Projekt reicht die kostenlose Version aus. .. image:: img/OWM-4.png #. Kopieren Sie den Schlüssel von der Seite **API-Schlüssel**. .. image:: img/OWM-5.png #. Fügen Sie diesen in das ``secrets.py``-Skript auf Ihrem Raspberry Pi Pico W ein. .. image:: img/4_openweather1.png .. note:: Falls Sie die Skripte ``do_connect.py`` und ``secrets.py`` noch nicht auf Ihrem Pico W haben, entnehmen Sie bitte :ref:`iot_access`, wie diese erstellt werden können. .. code-block:: python :emphasize-lines: 5 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 Verzeichnis ``kepler-kit-main/iot`` und klicken Sie auf **Aktuelles Skript ausführen** oder drücken Sie F5. .. image:: img/4_openweather2.png #. Nachdem das Skript ausgeführt wurde, werden auf dem I2C LCD1602 die Uhrzeit sowie die Wetterinformationen Ihrer Region angezeigt. .. note:: 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äß :ref:`iot_access` mit dem Internet verbunden sein. Für dieses Projekt verwenden wir es einfach so. .. code-block:: python 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. .. code-block:: python 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 :ref:`py_lcd`. .. code-block:: python 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``. .. code-block:: python # 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. .. code-block:: python 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: .. code-block:: python 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. .. image:: img/4_openweather3.png .. code-block:: python :emphasize-lines: 2 # 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. .. code-block:: python 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. .. code-block:: python # 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. .. code-block:: python 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. .. Weitere Informationen finden Sie auf der Dokumentationsseite von OPW: https://openweathermap.org/api .. Den abgerufenen Schlüssel finden Sie unter: https://home.openweathermap.org/api_keys .. Informationen zum aktuellen Wetter finden Sie unter: https://openweathermap.org/current .. https://openweathermap.org/appid