Tutorial del Internet de las Cosas y Bluetooth con el ESP32
Juan Antonio Villalpando
Volver al índice del tutorial
____________________________
230B.- OTA (Over The Air). Carga de programa por WiFi.
- Esto trata de cargar un programa en el ESP32 por WiFi, es decir sin estar conectado por cable USB al ordenador.
- Se suele utilizar cuando queremos modificar un programa ya cargado y no tenemos acceso a la tarjeta por cable USB.
- Necesitamos que el ordenador y la tarjeta del ESP8266 estén en la misma red.
- También necesitamos tener Python en nuestro ordenador.
______________________________________________________
1.- Instalamos Python en nuestro ordenador con Windows.
[En las distribuciones de LINUX no es necesario instalarlo porque ya lo está]
- Vamos a: https://www.python.org/downloads/release/python-368/
- y bajamos el archivo: python-3.6.8-embed-amd64.zip

- Lo descomprimimos en C:\Archivos de Programa (x86)\Python

- Vamos a Propiedades del sistema / Variables de entorno...
- Editamos PATH
- Agregamos al principio C:\Program Files (x86)\Python\;
- Fíjate que termina en punto y coma;

________________________________
2.- Creación del Puerto de Red esp32- at 192.168.1.4
- https://github.com/espressif/arduino-esp32/tree/master/libraries/ArduinoOTA
- Veamos este ejemplo, se trata simplemente de cargar y modificar la aplicación de parpadeo Blink.
- En principio lo cargamos con el cable USB conectado a nuestro ordenador y a la tarjeta.

|
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
// Nombre y contraseña de tu red WiFi.
const char* ssid = "Nombre_de_tu_Red_WiFi";
const char* password = "Clave_WiFi";
void setup()
{pinMode(D4, OUTPUT); // Terminal D4 es salida.
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED)
{
Serial.println("Fallo en la conexión. Reconectando...");
delay(5000);
ESP.restart();
}
// ArduinoOTA.setPassword((const char *)"123"); // Poner clave, opcional.
ArduinoOTA.begin();
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
}
void loop()
{
ArduinoOTA.handle();
// Serial.println("OTA....");
digitalWrite(D4, LOW);
delay(1000);
digitalWrite(D4, HIGH);
delay(1000);
}
|
- Le echamos un vistazo al Monitor serie y a Herramientas.
- Observamos que en Herramientas se ha creado Puerto de Red: esp32-b4e62f62b1 at 192.168.1.4
- Si no te sale ese puerto, reinicia el IDE de Arduino.
- Es decir, que ahora podemos cargar los programas por WiFi (o por el COM22)

________________________________
3.- Modificación de la aplicación por WiFi.
- Ahora quitamos el cable USB de la tarjeta.
- Pero evidentemente la debemos alimentar con una pila, batería,...

- Aunque este tipo de pilas de 9V, si está un poco gastada no dará la suficiente potencia para que funcione bien el WiFi.
- Es mejor alimentarlo con una fuente de alimentación de más potencia para que el WiFi funcione con más fuerza.

- Ahora modificamos el programa, por ejemplo ponemos otra cantidad en los delay.
digitalWrite(2, HIGH);
delay(500);
digitalWrite(2, LOW);
delay(200);
- Y subimos el código estando marcado Puerto: esp32- at 192.168.1.4
- Observamos que el código ha subido al ESP32 por WiFi y ha modificado el delay del código anterior.
________________________________
- Comentarios.
- La primera vez que subas el código debes hacerlo mediante el cable USB.
- Las siguientes veces, puedes quitar el cable USB y subirlo por WiFi.
- El código siempre debe llevar todas las instrucciones correspondiente a ArduinoOTA
- Cuando la conexión es por Puerto de Red, no funciona el Monitor Serie.
- Si reinicias la tarjeta pulsando el botón de Reset, espera como 1 minutos para que pueda conectar con el Wifi antes de subir el código.
- Aunque existen protecciones, intenta no alimentar a la vez al módulo con el cable USB y con el conector de la batería.
- Si te sale este error, es que no está bien establecido el PATH de "python.exe"

_________________________________
- Código similar al anterior.
|
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
// Nombre y contraseña de tu red WiFi.
const char* ssid = "Nombre_de_tu_Red_WiFi";
const char* password = "Clave_WiFi";
void setup() {
pinMode(D4, OUTPUT);
Serial.begin(115200);
Serial.println("Booting");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(5000);
ESP.restart();
}
// Port defaults to 8266
// ArduinoOTA.setPort(8266);
// Hostname defaults to esp8266-[ChipID]
// ArduinoOTA.setHostname("myesp8266");
// No authentication by default
// ArduinoOTA.setPassword((const char *)"123");
ArduinoOTA.onStart([]() {
Serial.println("Start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
ArduinoOTA.handle();
digitalWrite(D4, HIGH);
delay(500);
digitalWrite(D4, LOW);
delay(500);
}
|
_______________________________
|