Nota

Ciao, benvenuto nella Community di appassionati di SunFounder Raspberry Pi, Arduino e ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.

Perché unirti?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e giveaway: Partecipa a promozioni festive e concorsi a premi.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

4. Meteo in tempo reale da @OpenWeatherMap

Questo progetto prevede la creazione di un orologio intelligente che mostra il meteo della tua città insieme all’ora sul display LCD.

1. Componenti necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Kepler

450+

Kepler Ultimate Kit

Puoi anche acquistarli separatamente dai link qui sotto.

SN

COMPONENTE

QUANTITÀ

LINK

1

Introduzione al Pico W

1

ACQUISTA

2

Cavo Micro USB

1

3

Breadboard

1

ACQUISTA

4

Cavi Jumper

Diverse

ACQUISTA

5

LCD1602 I2C

1

ACQUISTA

6

Modulo Caricatore Li-po

1

7

Batteria 18650

1

8

Supporto batteria

1

2. Costruisci il circuito

Avvertimento

Assicurati che il modulo caricabatterie Li-po sia collegato come mostrato nello schema. Altrimenti, un cortocircuito potrebbe danneggiare la batteria e il circuito.

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

3. Ottieni le chiavi API di OpenWeather

OpenWeather è un servizio online, di proprietà di OpenWeather Ltd, che fornisce dati meteorologici globali tramite API, inclusi dati meteorologici attuali, previsioni, nowcast e dati meteorologici storici per qualsiasi località geografica.

  1. Visita OpenWeather per accedere/creare un account.

    ../../_images/OWM-1.png
  2. Accedi alla pagina delle API dalla barra di navigazione.

    ../../_images/OWM-2.png
  3. Trova Dati Meteo Attuali e clicca su Iscriviti.

    ../../_images/OWM-3.png
  4. Sotto Collezione di dati meteo attuali e previsioni, iscriviti al servizio appropriato. Nel nostro progetto, la versione gratuita è sufficiente.

    ../../_images/OWM-4.png
  5. Copia la chiave dalla pagina delle Chiavi API.

    ../../_images/OWM-5.png
  6. Copiala nello script secrets.py in Raspberry Pi Pico W.

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

    Nota

    Se non hai gli script do_connect.py e secrets.py nel tuo Pico W, fai riferimento a 1. Accesso alla Rete per crearli.

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

4. Esegui lo script

  1. Apri il file 4_weather.py nel percorso kepler-kit-main/iot, clicca sul pulsante Esegui script corrente o premi F5 per eseguirlo.

    ../../_images/4_openweather2.png
  2. Dopo l’esecuzione dello script, vedrai l’ora e le informazioni meteo della tua località sul display I2C LCD1602.

    Nota

    Quando il codice è in esecuzione, se lo schermo è vuoto, puoi ruotare il potenziometro sul retro del modulo per aumentare il contrasto.

  3. Se desideri che questo script si avvii automaticamente, puoi salvarlo nel Raspberry Pi Pico W come main.py.

Come funziona?

Il Raspberry Pi Pico W deve essere connesso a Internet, come descritto in 1. Accesso alla Rete. Per questo progetto, utilizza questa funzione.

from do_connect import *
do_connect()

Dopo la connessione a Internet, queste poche righe di codice aiuteranno a sincronizzare il tuo Pico W con l’orario medio di Greenwich.

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

Inizializza il tuo LCD, fai riferimento a 3.4 Display a Cristalli Liquidi per i dettagli sull’uso.

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

Dobbiamo selezionare l’unità per alcuni dati meteorologici (ad esempio temperatura, velocità del vento) prima di ottenere i dati meteorologici. In questo caso, l’unità è metric.

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

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

units = "metric"

Successivamente, questa funzione ottiene i dati meteorologici da openweathermap.org. Invieremo un messaggio URL con la tua città, chiavi API e un’unità impostata. Come risultato, riceverai un file JSON con i dati meteorologici.

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

Se stampi questo set di dati grezzi, potrai vedere informazioni simili a quelle mostrate di seguito.

esempio di dati meteo:
{
    '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
    }
}

Abbiamo usato la funzione print_weather(weather_data) per convertire questi dati grezzi in un formato di dati di facile lettura e stamparli.

Ma questa funzione non è chiamata, e puoi decommentare questa riga in while True secondo necessità.

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

Nel ciclo while True, la funzione get_weather() viene chiamata per recuperare le informazioni su meteo, temperatura e umidità necessarie per questo progetto.

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

Ottieni l’ora locale. Qui viene chiamata la funzione time.localtime() per restituire un set di tuple (anno, mese, giorno, ora, minuto, secondo, giorno della settimana, giorno dell’anno). Abbiamo estratto ora e minuti.

Nota che abbiamo già sincronizzato il Pico W con l’orario medio di Greenwich, quindi dobbiamo aggiungere il fuso orario della tua località.

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

Infine, le informazioni meteo e l’ora vengono visualizzate nel 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)

Il tuo LCD1602 diventerà un orologio che si aggiorna ogni 30 secondi quando il ciclo principale viene eseguito ogni 30 secondi.