Note

Bonjour, bienvenue dans la communauté SunFounder des passionnés de Raspberry Pi, Arduino & ESP32 sur Facebook ! Plongez au cœur des projets avec Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi nous rejoindre ?

  • Support d’experts : Résolvez les problèmes après-vente et les défis techniques avec l’aide de notre communauté et de notre équipe.

  • Apprendre & Partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.

  • Avant-premières exclusives : Recevez en avant-première des annonces de nouveaux produits et des aperçus exclusifs.

  • Réductions spéciales : Profitez de réductions exclusives sur nos nouveaux produits.

  • Promotions festives et concours : Participez à des concours et des promotions spéciales.

👉 Prêt à explorer et créer avec nous ? Cliquez sur [ici] et rejoignez-nous dès aujourd’hui !

4. Météo en Temps Réel via @OpenWeatherMap

Ce projet consiste à créer une horloge intelligente qui affiche la météo de votre ville ainsi que l’heure sur un écran LCD.

1. Composants Requis

Dans ce projet, nous aurons besoin des composants suivants.

Il est certainement pratique d’acheter un kit complet, voici le lien :

Nom

DANS CE KIT

LIEN

Kepler Kit

450+

Kepler Ultimate Kit

Vous pouvez également les acheter séparément via les liens ci-dessous.

SN

COMPOSANT

QUANTITÉ

LIEN

1

Découvrir le Pico W

1

ACHETER

2

Câble Micro USB

1

3

Plaque d’essai (Breadboard)

1

ACHETER

4

Fils de connexion (Jumper Wires)

Plusieurs

ACHETER

5

I2C LCD1602

1

ACHETER

6

Module de chargeur Li-po

1

7

Batterie 18650

1

8

Support de Batterie

1

2. Construire le Circuit

Avertissement

Assurez-vous que votre module chargeur Li-po est connecté comme indiqué sur le schéma. Sinon, un court-circuit risque d’endommager votre batterie et votre circuit.

../../_images/4.owm_bb.png

3. Obtenez les Clés API OpenWeather

OpenWeather est un service en ligne, propriété de OpenWeather Ltd, qui fournit des données météorologiques globales via une API, incluant les données météorologiques actuelles, les prévisions, les nowcasts et les données météorologiques historiques pour toute localisation géographique.

  1. Visitez OpenWeather pour vous connecter/créer un compte.

    ../../_images/OWM-1.png
  2. Cliquez sur la page API depuis la barre de navigation.

    ../../_images/OWM-2.png
  3. Trouvez Current Weather Data et cliquez sur Subscribe.

    ../../_images/OWM-3.png
  4. Sous Current weather and forecasts collection, abonnez-vous au service approprié. Pour notre projet, l’offre gratuite est suffisante.

    ../../_images/OWM-4.png
  5. Copiez la clé depuis la page API keys.

    ../../_images/OWM-5.png
  6. Copiez-la dans le script secrets.py sur le Raspberry Pi Pico W.

    ../../_images/4_openweather1.png

    Note

    Si vous n’avez pas les scripts do_connect.py et secrets.py dans votre Pico W, veuillez vous référer à 1. Accès au Réseau pour les créer.

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

4. Exécution du Script

  1. Ouvrez le fichier 4_weather.py dans le répertoire kepler-kit-main/iot, cliquez sur le bouton Exécuter le script actuel ou appuyez sur F5 pour le lancer.

    ../../_images/4_openweather2.png
  2. Une fois le script exécuté, vous verrez l’heure et les informations météorologiques de votre emplacement sur l’écran I2C LCD1602.

    Note

    Lorsque le code est en cours d’exécution, si l’écran reste vide, vous pouvez ajuster le potentiomètre situé à l’arrière du module pour augmenter le contraste.

  3. Si vous souhaitez que ce script soit lancé au démarrage, vous pouvez l’enregistrer dans le Raspberry Pi Pico W sous le nom de main.py.

Comment ça marche ?

Le Raspberry Pi Pico W doit être connecté à Internet, comme décrit dans la section 1. Accès au Réseau. Utilisez simplement cette connexion pour ce projet.

from do_connect import *
do_connect()

Après la connexion à Internet, ces quelques lignes de code permettent de synchroniser votre Pico W à l’heure du méridien de Greenwich (GMT).

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

Initialisez votre écran LCD, référez-vous à 3.4 Afficheur à Cristaux Liquides (LCD) pour les détails d’utilisation.

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

Nous devons sélectionner l’unité de certaines données météorologiques (par exemple, la température, la vitesse du vent) avant de récupérer les informations météorologiques. Dans ce cas, l’unité est métrique.

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

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

units = "metric"

Ensuite, cette fonction récupère les données météorologiques depuis openweathermap.org. Nous envoyons un message URL avec votre ville, vos clés API et une unité de mesure définie. En retour, vous recevrez un fichier JSON avec les informations météorologiques.

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()

Si vous imprimez cet ensemble de données brutes, vous verrez des informations similaires à ce qui est montré ci-dessous.

Exemple de données météo :
{
    '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
    }
}

Nous avons utilisé la fonction print_weather(weather_data) pour convertir ces données brutes en un format plus lisible et les afficher.

Mais cette fonction n’est pas encore appelée, vous pouvez décommenter cette ligne dans la boucle while True selon vos besoins.

../../_images/4_openweather3.png
# affichage shell
print_weather(weather_data)

Dans la boucle while True, la fonction get_weather() est appelée en premier pour récupérer les informations de météo, température et humidité nécessaires à ce projet.

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"]

Obtenez l’heure locale. La fonction time.localtime() est appelée ici pour retourner un ensemble de tuples (année, mois, jour, heure, minute, seconde, jour de la semaine, jour de l’année). Nous avons extrait heure et minute.

Notez que nous avons déjà synchronisé Pico W à l’heure GMT, donc nous devons ajouter le fuseau horaire de votre emplacement.

# obtenir l'heure (+24 pour l'hémisphère ouest)
# si négatif, ajouter 24
# heures = time.localtime()[3] + int(weather_data["timezone"] / 3600) + 24  # seulement pour l'hémisphère ouest

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

Enfin, les informations météorologiques et l’heure sont simplement affichées sur le LCD1602.

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)

Votre écran LCD1602 deviendra une horloge qui se met à jour toutes les 30 secondes, lorsque la boucle principale s’exécute toutes les 30 secondes.