.. note:: 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 [|link_sf_facebook|] 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: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - ELEMENTI IN QUESTO KIT - LINK * - Kit Kepler - 450+ - |link_kepler_kit| Puoi anche acquistarli separatamente dai link qui sotto. .. list-table:: :widths: 5 20 5 20 :header-rows: 1 * - SN - COMPONENTE - QUANTITÀ - LINK * - 1 - :ref:`cpn_pico_w` - 1 - |link_picow_buy| * - 2 - Cavo Micro USB - 1 - * - 3 - :ref:`cpn_breadboard` - 1 - |link_breadboard_buy| * - 4 - :ref:`cpn_wire` - Diverse - |link_wires_buy| * - 5 - :ref:`cpn_i2c_lcd` - 1 - |link_i2clcd1602_buy| * - 6 - :ref:`cpn_lipo_charger` - 1 - * - 7 - Batteria 18650 - 1 - * - 8 - Supporto batteria - 1 - **2. Costruisci il circuito** .. warning:: Assicurati che il modulo caricabatterie Li-po sia collegato come mostrato nello schema. Altrimenti, un cortocircuito potrebbe danneggiare la batteria e il circuito. .. image:: img/wiring/4.owm_bb.png **3. Ottieni le chiavi API di OpenWeather** |link_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. #. Visita |link_openweather| per accedere/creare un account. .. image:: img/OWM-1.png #. Accedi alla pagina delle API dalla barra di navigazione. .. image:: img/OWM-2.png #. Trova **Dati Meteo Attuali** e clicca su Iscriviti. .. image:: img/OWM-3.png #. Sotto **Collezione di dati meteo attuali e previsioni**, iscriviti al servizio appropriato. Nel nostro progetto, la versione gratuita è sufficiente. .. image:: img/OWM-4.png #. Copia la chiave dalla pagina delle **Chiavi API**. .. image:: img/OWM-5.png #. Copiala nello script ``secrets.py`` in Raspberry Pi Pico W. .. image:: img/4_openweather1.png .. note:: Se non hai gli script ``do_connect.py`` e ``secrets.py`` nel tuo Pico W, fai riferimento a :ref:`iot_access` per crearli. .. code-block:: python :emphasize-lines: 5 secrets = { 'ssid': 'SSID', 'password': 'PASSWORD', 'webhooks_key':'WEBHOOKS_API_KEY', 'openweather_api_key':'OPENWEATHERMAP_API_KEY' } **4. Esegui lo script** #. Apri il file ``4_weather.py`` nel percorso ``kepler-kit-main/iot``, clicca sul pulsante **Esegui script corrente** o premi F5 per eseguirlo. .. image:: img/4_openweather2.png #. Dopo l'esecuzione dello script, vedrai l'ora e le informazioni meteo della tua località sul display I2C LCD1602. .. note:: Quando il codice è in esecuzione, se lo schermo è vuoto, puoi ruotare il potenziometro sul retro del modulo per aumentare il contrasto. #. 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 :ref:`iot_access`. Per questo progetto, utilizza questa funzione. .. code-block:: python 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. .. code-block:: python 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 :ref:`py_lcd` per i dettagli sull'uso. .. code-block:: python 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``. .. 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" 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. .. 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() Se stampi questo set di dati grezzi, potrai vedere informazioni simili a quelle mostrate di seguito. .. code-block:: python 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à. .. image:: img/4_openweather3.png .. code-block:: python :emphasize-lines: 2 # 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. .. 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"] 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à. .. 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] Infine, le informazioni meteo e l'ora vengono visualizzate nel LCD1602. .. 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) Il tuo LCD1602 diventerà un orologio che si aggiorna ogni 30 secondi quando il ciclo principale viene eseguito ogni 30 secondi. .. OPW的文档页面, 可以查找每种产品的所有技术信息。https://openweathermap.org/api .. 查看获取到的key https://home.openweathermap.org/api_keys .. 当前天气的资料页 https://openweathermap.org/current .. https://openweathermap.org/appid