Nota

¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

¿Por qué unirse?

  • Soporte Experto: Resuelve problemas posventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprende y Comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Previsualizaciones Exclusivas: Obtén acceso anticipado a anuncios de nuevos productos y adelantos exclusivos.

  • Descuentos Especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones Festivas y Sorteos: Participa en sorteos y promociones de temporada.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy.

4. Clima en tiempo real desde @OpenWeatherMap

Este proyecto consiste en hacer un reloj inteligente que muestra el clima en tu ciudad junto con la hora en la pantalla LCD.

1. Componentes Requeridos

Para este proyecto, necesitamos los siguientes componentes.

Es conveniente adquirir el kit completo; aquí tienes el enlace:

Nombre

ELEMENTOS EN ESTE KIT

ENLACE

Kit Kepler

450+

Kepler Ultimate Kit

También puedes comprarlos por separado a través de los enlaces a continuación.

N.º

COMPONENTE

CANTIDAD

ENLACE

1

Conociendo el Pico W

1

COMPRAR

2

Cable Micro USB

1

3

Protoboard

1

COMPRAR

4

Cables de Puente (Jumpers)

Varios

COMPRAR

5

I2C LCD1602

1

COMPRAR

6

Módulo Cargador Li-po

1

7

Batería 18650

1

8

Portapilas

1

2. Construye el Circuito

Advertencia

Asegúrate de que el Módulo de Carga Li-po esté conectado como se muestra en el diagrama. De lo contrario, un cortocircuito podría dañar la batería y el circuito.

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

3. Obtén la clave de la API de OpenWeather

OpenWeather es un servicio en línea de OpenWeather Ltd que proporciona datos meteorológicos globales a través de una API, incluyendo el clima actual, pronósticos, nowcasts y datos históricos para cualquier ubicación geográfica.

  1. Visita OpenWeather para iniciar sesión o crear una cuenta.

    ../../_images/OWM-1.png
  2. Accede a la página de API desde la barra de navegación.

    ../../_images/OWM-2.png
  3. Busca Current Weather Data y haz clic en Subscribe.

    ../../_images/OWM-3.png
  4. En Current weather and forecasts collection, suscríbete al servicio adecuado. Para este proyecto, la opción gratuita es suficiente.

    ../../_images/OWM-4.png
  5. Copia la clave de la página API keys.

    ../../_images/OWM-5.png
  6. Copia la clave en el archivo secrets.py en la Raspberry Pi Pico W.

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

    Nota

    Si no tienes los archivos do_connect.py y secrets.py en tu Pico W, consulta 1. Acceso a la Red para crearlos.

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

4. Ejecuta el Script

  1. Abre el archivo 4_weather.py en la ruta kepler-kit-main/iot, haz clic en el botón Run current script o presiona F5 para ejecutarlo.

    ../../_images/4_openweather2.png
  2. Después de ejecutar el script, verás la hora y la información meteorológica de tu ubicación en el I2C LCD1602.

    Nota

    Cuando el código esté en ejecución, si la pantalla está en blanco, ajusta el potenciómetro en la parte posterior del módulo para aumentar el contraste.

  3. Si deseas que este script se ejecute al inicio, guárdalo en la Raspberry Pi Pico W como main.py.

¿Cómo funciona?

La Raspberry Pi Pico W debe estar conectada a Internet, como se describe en 1. Acceso a la Red. Para este proyecto, solo tienes que utilizarlo.

from do_connect import *
do_connect()

Una vez conectado a Internet, estas líneas de código ayudan a sincronizar tu Pico W con la hora de Greenwich.

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

Inicializa tu pantalla LCD; consulta 3.4 Pantalla de Cristal Líquido para más detalles sobre su uso.

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

Debemos seleccionar la unidad para algunos datos meteorológicos (por ejemplo, temperatura, velocidad del viento) antes de obtener los datos. En este caso, la unidad es métrica.

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

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

units = "metric"

A continuación, esta función obtiene los datos meteorológicos de openweathermap.org. Enviamos un mensaje URL con tu ciudad, la clave API y la unidad seleccionada. Como resultado, recibirás un archivo JSON con los datos del clima.

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 imprimes estos datos en bruto, verás información similar a la mostrada a continuación.

ejemplo de datos meteorológicos:
{
    '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
    }
}

Usamos la función print_weather(weather_data) para convertir estos datos en un formato de fácil lectura y mostrarlos.

Esta función no se llama; puedes descomentar esta línea en while True según sea necesario.

../../_images/4_openweather3.png
# imprimir en consola
print_weather(weather_data)

En el bucle while True, se llama primero a la función get_weather() para obtener la clima, temperatura y humedad necesarias para este proyecto.

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

Obtén la hora local. La función time.localtime() devuelve una serie de tuplas (año, mes, día, hora, minuto, segundo, día de la semana, día del año). Extraemos hora y minuto.

Nota que ya sincronizamos el Pico W con la Hora de Greenwich, por lo que debemos añadir la zona horaria de tu ubicación.

# obtiene la hora (+24 para el hemisferio oeste)
# si es negativo, suma 24
# horas = time.localtime()[3] + int(weather_data["timezone"] / 3600) + 24  #solo para hemisferio oeste

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

Finalmente, la información del clima y la hora se muestran en el 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)

Tu LCD1602 se convertirá en un reloj que se actualiza cada 30 segundos cuando el bucle principal se ejecuta cada 30 segundos.