http-get.ino
Recuperar datos web con la MKR WiFi 1010: conectarse al punto de acceso, abrir un socket TCP en el puerto 80, hacer un GET a una API meteorológica gratuita y volcar la respuesta al puerto serie. La plantilla de todo cliente HTTP embarcado sobrio.
Hardware
Una Arduino MKR WiFi 1010 (microcontrolador SAMD21, módulo Wi-Fi WINC1500, sin Bluetooth, alimentación USB o LiPo en J6). MKR WiFi 1010 en una red con salida a Internet; sin registro para la API usada.
Cableado
Sin cableado; comprueba que el WiFi permite el puerto de salida (80); algunos portales cautivos lo bloquean.
Funcionamiento
WiFiClient implementa Print/Stream: la cabecera HTTP se escribe a mano y se lee hasta cierre o timeout. La respuesta JSON cruda se imprime tal cual, lista para parsear.
Ejecución
Instala Arduino SAMD Boards y la librería WiFi101, selecciona la placa y carga. El Wi-Fi funciona solo en 2,4 GHz: comprueba que tu punto de acceso no sea solo de 5 GHz.
Variantes
Pásate a WiFiSSLClient en el puerto 443 para HTTPS (necesita el certificado raíz en flash) o añade un parser JSON mínimo tipo ArduinoJson.
http-get.ino
// Client HTTP sur le reseau local/WAN (MKR WiFi 1010, WiFi101).
#include <SPI.h>
#include <WiFi101.h>
const char SSID[] = "MonReseau";
const char PASS[] = "motdepassewifi";
const char HOTE[] = "api.open-meteo.com";
const char CHEMIN[] = "/v1/forecast?latitude=45.5&longitude=4.8¤t=temperature_2m";
WiFiClient client;
void connexion() {
WiFi.begin(WPA_PASS_PHRASE, SSID, PASS);
unsigned long t = millis();
while (WiFi.status() != WL_CONNECTED && millis() - t < 20000) delay(100);
}
void setup() {
Serial.begin(9600);
while (!Serial);
connexion();
if (WiFi.status() != WL_CONNECTED) {
Serial.println(F("WiFi indisponible"));
while (true);
}
Serial.println(WiFi.localIP());
if (client.connect(HOTE, 80)) {
client.print(String("GET ") + CHEMIN + " HTTP/1.1\r\n" +
"Host: " + HOTE + "\r\nConnection: close\r\n\r\n");
unsigned long t = millis();
while (client.connected() && millis() - t < 10000)
while (client.available()) Serial.write(client.read());
client.stop();
} else Serial.println(F("TCP KO"));
}
void loop() {}