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+ |
También puedes comprarlos por separado a través de los enlaces a continuación.
N.º |
COMPONENTE |
CANTIDAD |
ENLACE |
|---|---|---|---|
1 |
1 |
||
2 |
Cable Micro USB |
1 |
|
3 |
1 |
||
4 |
Varios |
||
5 |
1 |
||
6 |
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.
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.
Visita OpenWeather para iniciar sesión o crear una cuenta.
Accede a la página de API desde la barra de navegación.
Busca Current Weather Data y haz clic en Subscribe.
En Current weather and forecasts collection, suscríbete al servicio adecuado. Para este proyecto, la opción gratuita es suficiente.
Copia la clave de la página API keys.
Copia la clave en el archivo
secrets.pyen la Raspberry Pi Pico W.
Nota
Si no tienes los archivos
do_connect.pyysecrets.pyen 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
Abre el archivo
4_weather.pyen la rutakepler-kit-main/iot, haz clic en el botón Run current script o presiona F5 para ejecutarlo.
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.
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.
# 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.