Correo: [email protected] - Teléfono: +56979962128

Este tutorial es una guía de inicio para las peticiones HTTP GET con la Raspberry Pi Pico W. Las peticiones HTTP son fundamentales para interactuar con servicios web para recuperar datos de fuentes externas, integrarse con APIs web para acceder a servicios de terceros y mucho más.

En esta guía, aprenderás los conceptos básicos de las peticiones HTTP GET y probarás algunos ejemplos sencillos para obtener datos de internet.

Raspberry Pi Pico W Getting Started with HTTP GET Requests MicroPython

Cuando se trata de proyectos de IoT (Internet de las Cosas), las peticiones HTTP son fundamentales para interactuar con servicios web con el fin de recuperar datos de fuentes externas, integrarse con APIs Web para acceder a servicios en línea, o incluso controlar remotamente tu Pico utilizando plataformas externas de terceros.

Requisitos previos

Antes de continuar, asegúrate de verificar los siguientes requisitos previos:

Firmware de MicroPython

Para seguir este tutorial, necesitas tener instalado el firmware de MicroPython en tu placa Raspberry Pi Pico. También necesitas un IDE para escribir y cargar el código en tu placa.

micorpython logo

¿Qué son las peticiones HTTP?

La forma más común de intercambiar datos con otra computadora (servidor) en internet es utilizando el protocolo HTTP.

HTTP (Hypertext Transfer Protocol o Protocolo de Transferencia de Hipertexto) funciona a través de un modelo cliente-servidor. En este modelo, el cliente se comunica con un servidor utilizando peticiones HTTP. Una petición HTTP es un mensaje enviado por el cliente a un servidor, típicamente para solicitar una acción específica o recuperar información. El servidor envía una respuesta de vuelta al cliente también a través de HTTP.

Raspberry Pi Pico HTTP GET Request

Cliente: inicia la comunicación a través de una petición. Servidor: recibe y procesa la petición y envía una respuesta a cambio.

La Raspberry Pi Pico puede ser tanto un cliente como un servidor. Cuando es un cliente, envía peticiones a los servidores. Cuando es un servidor, gestiona las peticiones de los clientes.

En este tutorial, daremos un vistazo a la Raspberry Pi Pico como un cliente HTTP.

Aquí tienes algunos ejemplos de lo que puedes hacer usando peticiones HTTP con la Pico:

  • Obtener datos de internet: por ejemplo, la hora, el clima actual, precios de acciones, actualizaciones de tráfico y mucho más…

  • Registro de datos (Datalogging): enviar datos a la nube para guardarlos en línea.

  • Control remoto de tu Raspberry Pi Pico: al interactuar con plataformas de IoT como Adafruit IO, Node-RED y otras, puedes interactuar con tu placa de forma remota intercambiando datos a través de peticiones HTTP.

  • Interactuar con servicios de terceros para enviar notificaciones: SMS, correos electrónicos, notificaciones y mucho más…


Descripción Técnica de las Peticiones HTTP

Echemos un vistazo rápido a los aspectos técnicos de las peticiones HTTP. Si esta es la primera vez que tratas con peticiones HTTP de manera técnica y te parece confuso, es perfectamente normal.

Pero no te preocupes, existen módulos de MicroPython que abstraen toda la parte técnica, haciendo que sea muy sencillo realizar y gestionar peticiones HTTP. Además, para obtener más información sobre los aspectos técnicos de las peticiones HTTP, recomendamos los siguientes recursos:

Peticiones HTTP

Una petición HTTP consta de varias partes. Los elementos principales son: la línea de petición (request line), las cabeceras (headers) y el cuerpo (body).

Línea de Petición (Request Line)

La línea de petición especifica el método HTTP, el recurso que se solicita (la URL) y la versión del protocolo HTTP que se está utilizando. Los métodos HTTP comunes incluyen GET, POST, PUT y DELETE. Por ejemplo:

GET /path/to/resource HTTP/1.1

Cabeceras (Headers)

Las cabeceras proporcionan información sobre la petición. Pueden incluir el host al que el cliente envía la petición, el tipo de contenido que se envía o acepta, el user‑agent (identifica al cliente que realiza la petición) y más. Por ejemplo:

Host: example.com
User-Agent: RaspberryPiPico
Accept: application/json
 

Cuerpo (Body)

El cuerpo es un contenido opcional y contiene los datos o la información que queremos enviar al servidor. Esto se utiliza en peticiones POST y PUT. Por ejemplo:

POST /submit-form HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username=johndoe&password=secretpassword

Métodos de Petición HTTP

La elección del método HTTP en una petición indica la acción que se pretende realizar en el servidor. Algunos métodos utilizados comúnmente incluyen:

  • GET: recuperar datos del servidor.

  • POST: enviar datos para ser procesados a un recurso especificado.

  • PUT: actualizar un recurso en el servidor.

  • DELETE: eliminar un recurso del servidor.

En este tutorial, nos centraremos en el uso de peticiones GET con la Raspberry Pi Pico.


Códigos de Estado HTTP

Tras recibir una petición HTTP, el servidor responde con un código de estado HTTP que indica el resultado de la petición. Los códigos de estado se dividen en categorías como 2xx (exitoso), 3xx (redirección), 4xx (error del cliente) y 5xx (error del servidor). Algunos de los más comunes son:

  • 200 OK: la petición fue exitosa.

  • 404 Not Found: no se pudo encontrar el recurso solicitado.


Peticiones HTTP con la Raspberry Pi Pico

La forma más sencilla de realizar peticiones HTTP con la Raspberry Pi Pico es utilizando la librería requests, la cual utiliza un enfoque de alto nivel. Esta es muy similar a la librería requests de Python, pero es más limitada.

También puedes usar el módulo socket, pero es un enfoque de más bajo nivel y no es tan amigable para principiantes.

El siguiente código es un ejemplo básico de cómo puedes realizar una petición HTTP sencilla al sitio web de Google utilizando la librería requests.

# Rui Santos & Sara Santos - Random Nerd Tutorials
# Detalles completos del proyecto: https://RandomNerdTutorials.com/raspberry-pi-pico-w-http-requests-micropython/

import network
import urequests as requests # En algunas versiones de firmware se usa 'urequests'

# Credenciales Wi-Fi
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'

# Conectar a la red
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

# Conectar a tu red
wlan.connect(ssid, password)

# Realizar petición GET
response = requests.get("http://www.google.com")

# Obtener código de respuesta
response_code = response.status_code

# Obtener contenido de la respuesta
response_content = response.content

# Imprimir resultados
print('Código de respuesta: ', response_code)
print('Contenido de la respuesta:', response_content)
 

Cómo funciona el código

Comienza incluyendo las librerías network y requests.

import network
import requests

Reemplaza 'REPLACE_WITH_YOUR_SSID' y 'REPLACE_WITH_YOUR_PASSWORD' con el nombre de tu red Wi-Fi (SSID) y la contraseña.

ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'

Luego, inicializa la interfaz Wi-Fi, actívala y conéctate a tu red utilizando el SSID y la contraseña definidos anteriormente.

# Conectar a la red
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

# Conectar a tu red
wlan.connect(ssid, password)
Finalmente, realiza la petición. Utilizando el módulo requests y el método get(), el código envía una petición GET al sitio web de Google. La respuesta del servidor se almacena en la variable response.
response = requests.get("http://www.google.com")
 

La variable response es un objeto de tipo Response. Este objeto tiene varios atributos a los que puedes acceder y que pueden ser útiles. Por ejemplo:

  • response.status_code: devuelve un valor entero que representa el estado de la respuesta (ej. 200).

  • response.content: devuelve el contenido real en bytes.

  • response.text: devuelve el contenido convertido a una cadena de texto (string), utilizando una codificación de caracteres como UTF-8.

  • response.json(): devuelve la respuesta como un objeto JSON (diccionario de Python).

  • response.headers(): permite acceder a la información sobre las cabeceras de la respuesta.

 

Después de obtener la respuesta, obtenemos el estado de la misma utilizando el atributo status_code.

response_code = response.status_code
 

Guardamos el contenido de la respuesta en la variable response_content utilizando el atributo content.

response_content = response.content
 

Finalmente, imprimimos el código de estado y el contenido de la petición en la Terminal (Shell).

print('Response code: ', response_code)

print('Response content:', response_content)
 

Probando el código

Después de introducir tus credenciales de red, puedes ejecutar el código anterior en tu Raspberry Pi Pico.

Si todo sale como se espera, el código de respuesta debería ser 200, y se imprimirá el contenido de la página web de Google.

Raspberry Pi Pico Google HTTP GET Request

Obtención de datos de la web mediante peticiones HTTP GET

Ahora que ya sabes cómo realizar una petición HTTP GET básica, te mostraremos diferentes ejemplos para obtener datos de internet. Construiremos dos ejemplos diferentes:

Ejemplo 1: Pronosticador del tiempo

En este ejemplo, utilizaremos la Weather API para crear un pronosticador del tiempo. Esta API es gratuita y proporciona información útil sobre el clima en casi cualquier lugar del mundo.

Weather forecaster example

Obtendremos los datos meteorológicos para tu ubicación y los mostraremos en la terminal (shell).

   

Obtención de tu clave API (API Key)

  1. Ve al sitio web de Weather API: https://www.weatherapi.com/
  2. Regístrate para crear una cuenta.
  3. Después de verificar tu cuenta, inicia sesión.
  4. En tu panel de control (dashboard) en https://www.weatherapi.com/my/, encontrarás tu clave API (aunque diga que la prueba terminará, puedes seguir usando tu clave API gratuitamente).
 
Weather API Key
   

Copia la clave API en un lugar seguro porque la necesitarás más tarde.

Para extraer información sobre el clima en la ubicación que elijas, ingresa la siguiente URL en tu navegador web, pero insertando tu ubicación y tu clave API en los lugares correctos:

https://api.weatherapi.com/v1/current.json?q=TU_UBICACION+&key=TU_CLAVE_API

Por ejemplo, en mi caso: https://api.weatherapi.com/v1/current.json?q=Oporto+&key=d1578a064b07453c917164350240106

Copia tu URL y pégala en tu navegador; la API devolverá información correspondiente a tu clima local. Por ejemplo:

{
"location": {
"name": "Oporto",
"region": "Porto",
"country": "Portugal",
"lat": 41.15,
"lon": -8.62,
"tz_id": "Europe/Lisbon",
"localtime_epoch": 1719843562,
"localtime": "2024-07-01 15:19"
},
"current": {
"last_updated_epoch": 1719843300,
"last_updated": "2024-07-01 15:15",
"temp_c": 22.3,
"temp_f": 72.1,
"is_day": 1,
"condition": {
"text": "Sunny",
"icon": "//cdn.weatherapi.com/weather/64x64/day/113.png",
"code": 1000
},
"wind_mph": 10.5,
"wind_kph": 16.9,
"wind_degree": 310,
"wind_dir": "NW",
"pressure_mb": 1021,
"pressure_in": 30.15,
"precip_mm": 0,
"precip_in": 0,
"humidity": 69,
"cloud": 0,
"feelslike_c": 24.7,
"feelslike_f": 76.4,
"windchill_c": 21.9,
"windchill_f": 71.5,
"heatindex_c": 24.6,
"heatindex_f": 76.2,
"dewpoint_c": 15,
"dewpoint_f": 58.9,
"vis_km": 10,
"vis_miles": 6,
"uv": 6,
"gust_mph": 15.4,
"gust_kph": 24.7
}
}
 

Código – Petición HTTP GET: Weather API

El siguiente código realiza una petición a la Weather API para obtener datos meteorológicos de tu ubicación. Después, mostramos los datos en la terminal (shell). Mostraremos información sobre el clima actual, la temperatura, la humedad y la lluvia.

# Rui Santos & Sara Santos - Random Nerd Tutorials
# Detalles completos del proyecto: https://RandomNerdTutorials.com/raspberry-pi-pico-w-http-requests-micropython/

import network
import time
import urequests as requests # Usamos urequests para MicroPython

# Credenciales Wi-Fi
ssid = 'REEMPLAZA_CON_TU_SSID'
password = 'REEMPLAZA_CON_TU_CONTRASEÑA'

api_key = 'REEMPLAZA_CON_TU_API_KEY'
location ='Oporto'

# URL de la petición
url = f'https://api.weatherapi.com/v1/current.json?q={location}+&key={api_key}'

def init_wifi(ssid, password):
    # Inicializar interfaz Wi-Fi
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    # Conectar a tu red
    wlan.connect(ssid, password)
    
    # Esperar la conexión Wi-Fi
    connection_timeout = 10
    while connection_timeout > 0:
        if wlan.status() >= 3:
            break
        connection_timeout -= 1
        print('Esperando conexión Wi-Fi...')
        time.sleep(1)
        
    # Verificar si la conexión fue exitosa
    if wlan.status() != 3:
        return False
    else:
        print('¡Conexión exitosa!')
        network_info = wlan.ifconfig()
        print('Dirección IP:', network_info[0])
        return True

if init_wifi(ssid, password):
    try:
        # Realizar la petición
        response = requests.get(url)
        # Imprimir el código de respuesta
        print('Código de respuesta: ', response.status_code)
        
        # Obtener el contenido de la respuesta en formato JSON
        weather = response.json()
        # Cerrar la petición
        response.close()
        
        # Imprimir todos los datos del clima (bruto)
        print('JSON del clima: ', weather)
        
        # Obtener datos meteorológicos específicos
        weather_description = weather['current']['condition']['text']
        print('Clima actual: ', weather_description)
        
        # Temperatura y humedad
        temperature_c = weather['current']['temp_c']
        temperature_f = weather['current']['temp_f']
        humidity = weather['current']['humidity']
        print(f'Temperatura en Celsius: {temperature_c:.2f}')
        print(f'Temperatura en Fahrenheit: {temperature_f:.2f}')
        print(f'Humedad (%): {humidity:.2f}')              
        
        # Precipitación
        precipitation = weather['current']['precip_mm']
        print(f'Precipitación en mm: {precipitation}')              
        
        # Viento
        wind_speed = weather['current']['wind_kph']
        print('Velocidad del viento en kph:', wind_speed)

    except Exception as e:
        # Manejar cualquier excepción durante la petición
        print('Error durante la petición:', e)
 

Cómo funciona el código

Echemos un vistazo rápido a cómo funciona este código.

Para que el código funcione, primero debes introducir tus credenciales de red para conectar tu Raspberry Pi Pico a internet.

# Credenciales Wi-Fi
ssid = 'REEMPLAZA_CON_TU_SSID'
password = 'REEMPLAZA_CON_TU_CONTRASEÑA
 
Luego, introduce tu clave API de Weather API y la ciudad de la cual quieres obtener los datos.
api_key = 'REEMPLAZA_CON_TU_CLAVE_API' 
location = 'REEMPLAZA_CON_TU_CIUDAD'

Guardamos la URL de la petición en la variable url. Esta es una f-string (cadena literal formateada) con marcadores de posición para que la URL se actualice con tus detalles específicos en tiempo de ejecución.

url = f'https://api.weatherapi.com/v1/current.json?q={location}+&key={api_key}'
 

Creamos una función llamada init_wifi() que se conecta a tu red local. Esta función devuelve True si la conexión al Wi-Fi fue exitosa o False si no lo fue.

 
def init_wifi(ssid, password):

    # Inicializa la interfaz Wi-Fi en modo estación (STA)
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)

    # Inicia el intento de conexión con el SSID y la contraseña
    wlan.connect(ssid, password)

    # Tiempo de espera para la conexión (10 segundos)
    connection_timeout = 10
    while connection_timeout > 0:
    # El estado 3 indica que la placa ha obtenido una dirección IP correctamente
        if wlan.status() >= 3:
           break
        connection_timeout -= 1
        print('Esperando conexión Wi-Fi...')
        time.sleep(1)

  # Verifica si la conexión falló tras el tiempo de espera
  if wlan.status() != 3:
     return False
  else:
     print('¡Conexión exitosa!')

  # Obtiene la configuración de red (IP, máscara, puerta de enlace, DNS)
     network_info = wlan.ifconfig()
     print('Dirección IP:', network_info[0])
     return True
 

Luego, nos conectamos al Wi-Fi y comprobamos si la conexión fue exitosa antes de realizar la petición.

if init_wifi(ssid, password):

Realizar la petición es tan sencillo como utilizar el método get() del módulo requests y pasar la URL como argumento.

response = requests.get(url)

Esto devolverá un objeto JSON. Por lo tanto, podemos convertir el resultado en un diccionario de Python utilizando el método json().

weather = response.json()

Luego, cerramos la conexión para liberar cualquier recurso.

# Cerrar la petición
response.close()

Ahora, tenemos todos los datos que viste en tu navegador web en los pasos anteriores guardados en la variable weather.

Accedes a información específica utilizando las claves de los datos que quieres obtener. Obtenemos la descripción del clima, la temperatura, la humedad, la precipitación y la velocidad del viento. También puedes obtener otras propiedades accediendo a las claves correspondientes en el objeto JSON.

# Obtener datos meteorológicos específicos
weather_description = weather['current']['condition']['text']
print('Clima actual: ', weather_description)

# Temperatura y humedad
temperature_c = weather['current']['temp_c']
temperature_f = weather['current']['temp_f']
humidity = weather['current']['humidity']
print(f'Temperatura en Celsius: {temperature_c:.2f}')
print(f'Temperatura en Fahrenheit: {temperature_f:.2f}')
print(f'Humedad (%): {humidity:.2f}')

# Precipitación
precipitation = weather['current']['precip_mm']
print(f'Precipitación en mm: {precipitation}')

# Viento
wind_speed = weather['current']['wind_kph']
print('Velocidad del viento en kph:', wind_speed)
 

Probando el código

Después de introducir tus credenciales de red, la clave API y la ciudad, puedes ejecutar el código en tu Raspberry Pi Pico.

Deberías obtener algo similar a lo que se muestra en la captura de pantalla de abajo, pero con la información de la ubicación que hayas elegido.

Getting Weather Data from the Weather API using Raspberry Pi Pico

Puedes llevar este proyecto un paso más allá mostrando los datos en una pantalla, como un display LCD u OLED. También puedes crear un bucle while o una interrupción por temporizador (timer interrupt) para solicitar datos de forma periódica, o incluso consultar la información de múltiples ubicaciones simplemente cambiando el valor de la variable city.

Ejemplo 2: Solicitar el precio de Bitcoin

En este ejemplo, solicitaremos y mostraremos el precio actual de Bitcoin. CoinGecko tiene un endpoint (punto de acceso) que puedes utilizar para realizar peticiones que devuelven el precio actual de Bitcoin en dólares (USD):

https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd

Si abres esa URL en tu navegador web, deberías obtener algo como lo siguiente:

{"bitcoin":{"usd":62748}}

Ahora, utilizando esa URL, podemos obtener fácilmente el precio de Bitcoin con nuestra Raspberry Pi Pico.

# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details: https://RandomNerdTutorials.com/raspberry-pi-pico-w-http-requests-micropython/
 
import network
import requests
from time import sleep

# Wi-Fi credentials
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'

# Request URL
url = 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd'

def init_wifi(ssid, password):# Init Wi-Fi Interface
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    # Connect to your network
    wlan.connect(ssid, password)
    # Wait for Wi-Fi connection
    connection_timeout = 10
    while connection_timeout > 0:
        if wlan.status() >= 3:
            break
        connection_timeout -= 1
        print('Waiting for Wi-Fi connection...')
        sleep(1)
    # Check if connection is successful
    if wlan.status() != 3:
        return False
    else:
        print('Connection successful!')
        network_info = wlan.ifconfig()
        print('IP address:', network_info[0])
        return True

if init_wifi(ssid, password):
    try:
        # Make the request
        response = requests.get(url)
        #Print the response code
        print('Response code: ', response.status_code)
        
        # Get response content
        bitcoin = response.json()
        # Close the request
        response.close()
        
        # Print bitcoin price
        bitcoin_price = bitcoin['bitcoin']['usd']
        print('Bitcoin price (USD): ', bitcoin_price)

    except Exception as e:
        # Handle any exceptions during the request
        print('Error during request:', e)
   

Este código funciona de manera similar al del ejemplo anterior.

Raspberry Pi Pico MicroPython HTTP GET Request Bitcoin Price

Llevándolo más allá

Ahora, puedes llevar este proyecto un paso más allá y mostrar el precio de Bitcoin en una pantalla OLED o LCD y actualizar los datos diariamente. También puedes solicitar datos de diferentes criptomonedas.

Incluso podrías añadir algún tipo de notificación que te envíe un mensaje cuando el precio cruce un determinado valor umbral (por ejemplo, si baja de cierto precio).


Conclusión

En este tutorial, has aprendido qué son las peticiones HTTP GET y por qué son tan útiles en proyectos de IoT. También te hemos mostrado dos ejemplos prácticos para obtener datos del mundo real directamente de internet.

 

Preguntas frecuentes

¿Qué es una petición HTTP GET?

Es el método HTTP que se usa para pedir datos a un servidor. Es fundamental para interactuar con servicios web, recuperar información de fuentes externas e integrarse con APIs de terceros.

¿Qué partes tiene una petición HTTP?

Tres: la línea de petición, que indica el método y la ruta; las cabeceras, con información adicional sobre la petición; y el cuerpo, que en una petición GET normalmente va vacío.

¿Qué son los códigos de estado HTTP?

Son los números con los que el servidor responde indicando qué pasó con la petición: si tuvo éxito, si el recurso no existe o si hubo un error. Interpretarlos es clave para depurar un proyecto que consume datos de internet.

¿Por qué son importantes las peticiones HTTP en proyectos IoT?

Porque son la vía por la que un dispositivo obtiene datos de internet o los envía a un servicio externo. Sin ellas el proyecto queda aislado de cualquier información o servicio que no esté en la propia placa.

¿Qué necesito para hacer peticiones HTTP con la Pico W?

El firmware de MicroPython instalado y la conexión WiFi funcionando, ya que es la Pico W —y no la Pico estándar— la que tiene conectividad inalámbrica para llegar a internet.

Aprende esto en un curso

Si prefieres verlo en vivo y con alguien que resuelva tus dudas, estos cursos presenciales de MCI Educación cubren el tema de este tutorial: