User Tools

Site Tools


tecnologia:iot:ota_esp32_desde_cero

Instalación

Para la instalación y configuración, tenemos que estar conectados a internet.

Descargamos arduino ide:

https://www.arduino.cc/en/software

En mi caso Linux 64 bits. Descargo el fichero arduino-1.8.19-linux64.tar.xz
Lo descomprimimos:

tar -xf arduino-1.8.19-linux64.tar.xz

Lo ejecutamos:

cd arduino-1.8.19/
./arduino

Configuración ESP32

Tenemos que descargas los plugins de ESP32.

Web oficial: https://docs.espressif.com/projects/arduino-esp32

Vamos a Getting started

y luego First Steps > How to install > Installing using Arduino IDE y copiamos la URL de Stable release link

La url es:

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

Ahora vamos a Arduino IDE, y en File > Preferences:

Copiamos la URL de antes en Additional Boards Manager URLs y pulsamos OK:

Tenemos que añadir el tipo de placa ESP32. Vamos a Tools > Board > Boards Manager

Buscamos esp32 y pulsamos install:

En mi caso es una de AZ-Delivery

Seleccionamos la placa en **Tools > Board > ESP32 Arduino > ESP32 DEV Module ** (puede que dependiendo veriones etc… los nombres puedan cambiar)

Conectamos la placa con el cable USB y seleccionamos el puerto:

Copiamos este código que lo único que hace es escribir “Hola EKO” internamente en el “Serial Monitor”:

void setup() {
   Serial.begin(115200);
}
  
void loop() {
   Serial.println("Hola EKO");
   delay(2000);
}

Y pulsamos el botón upload para subir el código, puede que nos pida grabar el fichero, porque siempre que hacemos upload, lo graba.

Esto compila el código y lo sube a la placa por el cable USB. En la parte de abajo apareceran unas letras naranjas con un % e indica que lo ha compilado y subido todo:

Para ver la salida, pulsamos el botón “Serial Monitor”

Nos abre una pantalla de comunicación entre nuestro ordenador y la placa ESP32. Puede que salgan escriba ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮ tenemos que seleccionar la velocidad de conexión a 115200 baud

Ahora nos irá escribiendo el texto que hemos puesto “Hola EKO” (podemos marcar la casilla Show timestamp si queremos ver la fecha)

Arduino ejecuta constantemente lo que pongamos en “void loop”. En este caso escribe “Hola EKO” y luego hace una pausa de 2000 milisegundos (2 segundos) y vuelve a empezar.

Conexión WIFI

Conexión con contraseña. Si es una red abierta ponemos NULL (lo indico mas abajo):

#include <WiFi.h>

const char* ssid     = "mi_red_wifi";
const char* password = "mi_contraseña_wifi";

void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println('\n');
  
  WiFi.begin(ssid, password);
  Serial.print("Conectando a ");
  Serial.print(ssid);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print('.');
  }

  Serial.println('\n');
  Serial.println("Conectado correctamente");  
  Serial.print("IP:\t");
  Serial.println(WiFi.localIP());
}

void loop() { 
  
}

Si la red es abierta ponemos estas líneas. NULL va sin comillas:

const char* ssid     = "mi_red_wifi_abierta";
const char* password = NULL;

Esto nos escribe que se conecta y que IP tiene:

10:12:01.294 -> Conectando a mi_red_wifi_abierta.....
10:12:03.816 -> 
10:12:03.816 -> Conectado correctamente
10:12:03.816 -> IP:	192.168.1.97

Una vez conectado ejecuta la void loop, que en este caso no hay nada.

Conexión con IP fija

Para poder administrar mejor los dispositivos, les pondremos ip fija.
En mi caso la red es la clásica 192.168.1.1/24 pero puede cambiar (OJO QUE LAS IP VAN CON COMAS Y NO CON PUNTOS)

#include <WiFi.h>

const char* ssid     = "mi_red_wifi";
const char* password = "mi_contraseña_wifi";

IPAddress ip(192,168,1,69);     
IPAddress gateway(192,168,1,1);   
IPAddress subnet(255,255,255,0); 
IPAddress dns(8,8,8,8);
  
void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println('\n');
  
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet, dns);

  Serial.print("Conectando a ");
  Serial.print(ssid);



  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print('.');
  }

  Serial.println('\n');
  Serial.println("Conectado correctamente");  
  Serial.print("IP:\t");
  Serial.println(WiFi.localIP());
}

void loop() { 
  
}

Vemos que ahora tiene la ip que le hemos puesto:

10:23:30.083 -> Conectando a mi_red_wifi.
10:23:30.581 -> 
10:23:30.581 -> Conectado correctamente
10:23:30.614 -> IP:	192.168.1.69

OTA

Para poder administrarlo remotamente sin necesidad de cable, instalamos OTA.

Para instalar las bibliotecas (que no librerías) se puede hacer con el manager como las placas (board) pero es mas fácil bajando el código en el directorio que toca.

Nombre: ESPAsyncWebServer
Repositorio: https://github.com/me-no-dev/ESPAsyncWebServer

https://github.com/ayushsharma82/AsyncElegantOTA

Vamos al directorio donde tenemos Arduino IDE y lo descargamos.

cd arduino-1.8.19/libraries
arduino-1.8.19/libraries$ git clone https://github.com/me-no-dev/ESPAsyncWebServer
Cloning into 'ESPAsyncWebServer'...
remote: Enumerating objects: 1515, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 1515 (delta 2), reused 7 (delta 1), pack-reused 1502
Receiving objects: 100% (1515/1515), 867.67 KiB | 604.00 KiB/s, done.
Resolving deltas: 100% (981/981), done.

git clone https://github.com/me-no-dev/AsyncTCP/
git clone https://github.com/ayushsharma82/AsyncElegantOTA

Copiamos el siguiente código:

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <AsyncElegantOTA.h>

const char* ssid     = "mi_red_wifi";
const char* password = "mi_contraseña_wifi";

IPAddress ip(192,168,1,69);     
IPAddress gateway(192,168,1,1);   
IPAddress subnet(255,255,255,0); 
IPAddress dns(8,8,8,8);

AsyncWebServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println('\n');
  
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet, dns);

  Serial.print("Conectando a ");
  Serial.print(ssid);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print('.');
  }

  Serial.println('\n');
  Serial.println("Conectado correctamente");  
  Serial.print("IP:\t");
  Serial.println(WiFi.localIP());

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send(200, "text/plain", "V1.0 Primer OTA");
  });

  AsyncElegantOTA.begin(&server);    // Start AsyncElegantOTA
  server.begin();
  Serial.println("HTTP server started");
  delay(1000);
  
}

void loop() { 
}

Si accedemos desde un navegador a la ip que hemos puesto (192.168.1.69) veremos el texto que hemos definido en el código:

Ahora ya podemos desconectar la placa ESP32 del ordenador y conectar a una powerbank o un cargador, porque podemos acceder por la IP.

Si queremos subir código remotamente accedemos a la IP seguido de /update, en este caso: http://192.168.1.69/update

Primero tenemos que compilar el código, por ejemplo cambiamos el texto de la línea 37 y ponemos V2.0:

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send(200, "text/plain", "V2.0 Prueba de subir codigo remotamente");
  });

Compilamos el código en un fichero, vamos a sketch > Export compiled binary

Esto nos crea un fichero .ino en el mismo directorio que estemos grabando nuestro código.

Ahora vamos a la web del update del dispositivo y subimos el fichero pulsando en browse:

Seleccionamos el fichero .ino y empieza a subirlo:

Cuando acaba indica **OTA Success **

Ahora si vamos a la URL del dispositivo veremos que el texto ha cambiado:

http://192.168.1.69/

V2.0 Prueba de subir codigo remotamente
tecnologia/iot/ota_esp32_desde_cero.txt · Last modified: by admin