Automatización del timbre de su vivienda


Los timbres inteligentes son un gadget increíble pero aún costosos (~ $200),pero gracias Naran Inc disfrutamos de un sencillo  tutorial, para  ayudarnos a crear nuestro propio timbre hogar inteligente para menos de $40.

Anuncio publicitario

!Socorro !No me funciona el mando del Fire TV Stick


Los Fire TV Stick son de las pocas alternativas que tenemos de disfrutar del ecosistema que Amazon pone en nuestra mano para convertir en inteligente un viejo TV ( o no tanto) . Como puede deducirse, el Fire Stick TV es uno de los productos más vendidos en Amazon ,ya que por sus prestaciones y precio ( entre 30€ en la versión lite, 40€ la versión standard y hasta llegar a los 60€ en su versión 4k) puede ser de gran utilidad en casa.

En efecto, como sabemos, el Fire TV Stick convierte su televisor en una Smart TV, por lo que básicamente es un reproductor de contenido multimedia en streaming con capacidad de resolución 4K (según versión), el cual además sólo se puede conectar mediante HDMI a su TV. Para ello debemos conectar el Amazon Fire TV Stick a su televisor HD por algun puerto hdmi libre sin olvidar de alimentarlo con 5v DC con el cargador incorporado (aunque podemos usar también un puerto USB del TV si este permite también un consumo de unos 100mA) y empiece a ver contenido en streaming en cuestión de minutos ( tras la configuración inicial donde básicamente ajustamos el idioma, la wifi a la que nos conectaremos, las credenciales de Amazon y se actualizará el firmware).

Horizontal

Este dispositivo es muy interesante poque con el asistente por voz Alexa solo tenemos que pulsar un botón y pedirle que busque películas y episodios de series favoritas, así como deportes y noticias en directo usando las principales plataformas del mercado, como Netflix, DAZN, Movistar+, Disney+, Apple TV y Amazon Prime Video, todo en un solo dispositivo. Asimismo podemos reproducir en streaming millones de canciones y usar el nuevo mando por voz Alexa para pedir una canción, artista o lista de reproducción, o para controlar la reproducción en servicios como Amazon Music, Spotify o TuneIn.

Amazon Fire TV Stick funciona con cualquier televisor HD, así que puede usarlo en casa de sus amigos o llevarlo de viaje pero para conectarlo y usarlo en cualquier lugar, necesitaremos una conexión Wi-Fi ( puede ser suficiente la zona wifi que activemos en nuestro dispositivo móvil).

Aunque no es un aparato que falle demasiado, de vez en cuando se pueden producir errores graves mientras usamos el Fire TV Stick. Por ejemplo, que el mando no nos responda y que sea imposible revivirlo. Una primera medida que podemos hacer es la de apagar la llave HDMI a ver si vuelve en sí, pero si persiste, entonces tenemos que hacer algo mucho más agresivo. Esos dos grandes incidentes pueden ser, o bien que el mando a distancia se ha desemparejado, es decir, ha perdido su vínculo con el Fire TV Stick que compramos, o bien el cuelgue solo afecta al mando, de tal forma que sea necesario reiniciarlo para devolverlo a un estado de completa actividad.

Los botones del mando

De todos los botones que podemos ver en el mando de control remoto de vuestro Fire TV Stick, vamos a quedarnos con solo cuatro, que son los que tenemos señalados justo aquí debajo con números que van del 1 al 4:

Mando del Fire TV Stick.
  1. Home (o Inicio): es el que podéis ver en la parte central y que tiene un iconito de una casa.
  2. Cursor izquierdo: de la rueda que contiene los botones de las cuatro direcciones posibles, solo nos interesa la que apunta a la izquierda.
  3. Volver: a los que tenéis un móvil con Android os sonará, porque es la flechita que parece volver por dónde venía. Atentos a ella.
  4. Opciones: con varias líneas blancas horizontales, ese botón será esencial para realizar cieras acciones.

Cómo resetear el mando del Fire TV Stick

Antes de que nos decidamos por tomar medidas especiales más expeditivas como es el realizar un nuevo emparejamiento del mando a distancia con el Fire TV Stick, lo mejor es intentar antes algo más rápido y que afecta solo al propio mando así que lo interesante es empezar con un reset para intentar arreglar ese cuelgue transitorio en el que está sumido. Para llevarlo a cabo, solo tenéis que hacer lo siguiente en el mando del Fire TV Stick con Alexa integrado:

  • Desconecte el Fire TV Stick de tu televisor y espere un minuto. Esto lo haremos para no encenderlo al tocar el mando.
  • A continuación, mantenga pulsado el cursor izquierdo, el de Menú y Atrás todos a la vez. Es importante que no los pulsé escalonadamente, o que alguno se suelte durante el proceso de reset. Así que antes de hacerlo, pruebe a ver de qué forma segura puede colocar los dedos para que no haya errores.

En el caso del modelo 4K de ese mismo Fire TV Stick, el procedimiento es sensiblemente distinto:

  • Repetimos el mismo proceso que antes solo que los tres botones los mantenemos pulsados a la vez durante 12 segundos.
  • Los soltamos y esperamos otros cinco segundos.
  • Ahora quitamos las pilas del mando a distancia.
  • Encendemos el Fire TV Stick 4K y esperamos un minuto más.
  • Colocamos de nuevo las pilas al mando y pulsamos sobre el botón Home. El indicador LED que trae debería parpadear en color azul para confirmarnos que todo el proceso ha funcionado y el control se está comunicando con la llave HDMI.

Es importante decir que el modelo con Alexa Voice Remote Lite no tiene esa luz LED, por lo que identificar que todo funciona será cuestión de ver que ya podemos navegar correctamente por los menús.

Vuelva a emparejar el mando con su Fire TV Stick

Ahora bien, el otro problema que puede asaltarnos es que, por razones desconocidas, el mando parece funcionar al pulsar los botones (se ilumina el LED) pero los menús del Fire TV Stick no responden. En ese caso, es posible que el remote haya perdido la vinculación con la llave HDMI, así que toca volver a realizar el proceso de emparejado de los dos dispositivos. Para conseguirlo debe seguir los siguintes pasos:

  • Enciende la televisión con la entrada HDMI del Fire TV Stick seleccionada.
  • Colócate a menos de tres metros del dongle para poder conectar de nuevo el mando.
  • Pulsa el botón de Inicio del mando durante 10 segundos ininterrumpidamente.
  • A partir de ese momento la luz LED del remote tendría que parpadear, lo que provocará un mensaje en la pantalla del televisor de que todo el proceso ha funcionado sin problemas.
  • El mando a distancia vuelve a estar emparejado con su Fire TV Stick original.

Un truco: si la versión del mando no tiene testigo led podemos ver si está emitiendo ráfagas infrarojos al fire-stick, con una cámara digital enfocando a la parte delantera deberíamos ver un puntito de luz blanca al pulsar cualquier tecla.

Averias del mando mas comunes

Llegados a este punto, tu mando debería estar conectado a tu Fire TV Stick y funcionando de nuevo de forma correcta. ¿No es el caso? Entonces, toca comprobar estos puntos:

  • Pilas: el mando del Fire TV Stick funciona con 2 pilas AAA. Y puede darse el caso de que se estén agotando y no tengan energía para mantener las funciones mínimas del control remoto. También puede ocurrir que alguna de las pilas ( o las dos ) se haya sulfatado y esté impidiendo que la corriente pase al mando, independientemente de que hayamos conectado una pila nueva en buenas condiciones. Simplemente, retire la tapa del compartimento de pilas y compruebe que no hay óxido ni corrosión. Aproveche también para probar con otras pilas nuevas, por si las moscas.
  • Mando estropeado: los mandos a distancia suelen caerse al suelo con frecuencia, y esto puede acabar pasando factura. Si después de hacer todo este proceso, no ha conseguido volver a conectar tu mando al Fire TV Stick,  puede que se haya estropeado. En este casos en el siguiente epígrafe veremos cómo podemos repararlo o en el peor de los casos conseguir un sustituto al mando a distancia del Fire TV Stick.

Las pilas del mando

Tan improbable como parece, pero a veces las baterías del mando se desalinean y por supuesto se agotan ( lo cual deberíamos probar con un comprobador de pilas o un multímetro). Saque las pilas y manténgalas fuera durante 10-20 segundos. A continuación, vuelva a colocar las pilas correctamente y conéctelas en el orden correcto en el mando como está indicado en la carcasa (compruebe que de verdad estan en su posición correcta ambas pilas).

Una de las razones más comunes por las que el mando a distancia Fire TV Stick no se acopla antes o después del restablecimiento de fábrica es que la batería está agotada o agotada, así que recomendamos que introduzca un par de pilas nuevas en el control remoto en caso de duda.

Muchas veces, la corrosión o la suciedad en el interior del compartimento de la batería impide que se active el mando a distancia correctamente. En el caso de qeu se hayan quedado pilas agotadas y se hayan sulfatado, debe retirar estas a la mayor brevedad posible y limpiar los dos conectores metálicos con un pañuelo de papel o un paño limpio. A continuación, inserte las pilas y reinicie el Fire TV Stick desenchufándolo. Entonces intente emparejarlo con el mando nuevamente.

Reparación en caso de sulfatación de las pilas

A todos nos ha pasado que hemos encontrado alguna vez un aparato que teníamos olvidado por casa y al comprobar si tenía pilas, estas se encontraban en el interior oxidadas o sulfatadas . Aunque pueda ser desagradable a primera vista, hay ocasiones en que los dispositivos sucios por las pilas todavía funcionan. En nuestro caso, si tras la limpieza en profundidad del porta pilas accesible desde el exterior, sigue sin responder, deberemos intentar abrir el mando para limpiar el interior.

Se abre el mando por el lateral con un utensilio de plástico.

Vemos dos tornillos philips que fijan la placa madre a la carcasa.

Desatornillamos los tornillos para poder limpiar la parte más expuesta.

Guardamos o apartamos las carcasas con cuidado.

En nuestro caso, vemos como la sulfatación ha afectado a gran parte de la placa por lo que debemos limpiar con profundidad esta parte con un bastoncillo o un cepillo y alcohol ( hay personas que también da buenos resultados el zumo de un limón disuelto en agua).

Tras frotar, comprobará cómo se irá desprendiendo lo sucio y las partes metálicas y muelles del aparato volverán a estar como nuevos. En el caso de que tras limpiarlo y secarlo siga igual, lamentamos decirle que tendrá que valorar el estado interno del aparato o ir a un servicio técnico, aunque lo habitual es que vuelvan a funcionar tras esta limpieza.

También en el peor de los casos si tras la limpieza no ha funcionado el mando podemos intentar con una pistola de calor incidir en las zonas donde estaba la suciedad para intentar reactivar las soldaduras que podrían haberse dañado con la sulfatación de las pilas.

¿Y si pierdo el mando o está roto?

Si pierde el mando de su Fire TV Stick, o si simplemente, deja de funcionar ( y no ha funcionado nada de lo que hemos visto hasta aquí), puede controlar el dispositivo directamente desde la aplicación Fire TV, disponible tanto para Android como para el iPhone. Por supuesto, también va poder utilizar comandos de Alexa para controlar el televisor, aunque, si ya lo ha hecho con anterioridad, sabrá que esto no es lo óptimo.

Y bien, aunque existen las alternativas de software, seguro que no tiene ganas de comprar otro Fire TV únicamente por recuperar el mando. Puede que una mala caída haya dejado tu mando totalmente fuera de combate, que simplemente haya dejado de funcionar de un día para otro o que sencillamente, el dispositivo haya desaparecido de casa —o que se lo haya tragado el sofá, cosa que descubrirás dentro de unos meses.

Para estos casos, existen mandos genéricos que pueden hacerte el apaño. No obstante, en Amazon también va a poder encontrar el mando original del Fire TV Stick en caso de que lo necesites. Antes de hacerse con un sustituto, confirme que el modelo que va a comprar sea compatible con su dispositivo, luego, simplemente tendrá que emparejar el nuevo mando con tu Fire TV tal y como te hemos explicado en las líneas anteriores.

Recambio original de mando para Fire TV

Este mando solo le merecerá la pena en el caso de que tenga un Fire TV 4K, debido a que su precio es bastante alto pues por prácticamente su precio, puede comprarse otro Fire TV Lite o estándar. No obstante, es el modelo que le va a garantizar el máximo de compatibilidad con tu dispositivo de Amazon. A pesar del precio, si no quiere complicarte la vida, esta es la mejor opción que va a encontrar.

Mandos genéricos

Existen también mandos genéricos compatibles con los Fire TV. En estos casos, puede ocurrir que se asocien con el dongle de una forma distinta al modelo original. Por lo general, es interesante un mano con micrófono para no perder así la posibilidad de dictar texto y hacer comandos de Alexa. Un modelo muy interesante es el L5B83H, que tiene un buen precio y va a permitir recuperar el control de su Fire TV. Por lo general, este modelo merece más la pena si tiene un Fire TV Stick de los básicos. No obstante, en algunos casos le merecerá más la pena comprar un dongle completo simplemente por precio.

Eso sí, con los mandos genéricos hay que tener algo más de cuidado. Le recomendamos que mire bien las especificaciones para garantizar que el mando genérico es compatible con su Fire TV. Si no recuerda bien qué modelo tienes conectado a tu televisor, puedes mirarlo desde ajustes utilizando la aplicación de Fire TV para el móvil. No obstante, también puede consultar en el historial de compras de Amazon para ver exactamente qué unidad tiene.

Programación OTA en ESP32


Una de las mejores cosas de ESP32 es que su firmware se puede actualizar de forma inalámbrica. Este tipo de programación se llama «Over-The-Air» (OTA) permitiendo actualizar/cargar un nuevo programa al ESP32 a través de Wi-Fi sin tener que conectar el ESP32 a un ordenador a través de USB.

La funcionalidad OTA es útil cuando no hay acceso físico al módulo ESP pero además, reduce el tiempo necesario para actualizar cada módulo ESP durante el mantenimiento.

Una ventaja clave de OTA es que una única ubicación central puede enviar una actualización a varios ESP en la misma red.

La única desventaja es que debe incluir un código OTA con cada boceto que cargue para poder usar OTA en la próxima actualización.

Hay dos formas de implementar la funcionalidad OTA en el ESP32:

  • OTA básico : las actualizaciones se envían mediante el IDE de Arduino.
  • Web Updater OTA : las actualizaciones se entregan a través de un navegador web.

Cada uno tiene sus propios beneficios, por lo que puede usar el que funcione mejor para su proyecto.

OTA Básico

En este primer apartado veremos el proceso de implementación de OTA básico.  En resumen son 3 pasos simples para usar OTA básico con el ESP32

  1. Instalación de la serie Python 2.7.x: el primer paso es instalar la serie Python 2.7.x en su computadora.
  2. Carga de firmware OTA básico en serie: cargue el boceto que contiene el firmware OTA en serie. Este es un paso necesario para realizar las actualizaciones posteriores de forma inalámbrica.
  3. Carga de nuevos bocetos por aire: ahora puede cargar nuevos bocetos al ESP32 desde Arduino IDE por aire.

1: Instalación de Python 2.7.x

Para usar la funcionalidad OTA, primero debe instalar Python 2.7.x, si aún no está instalado en su máquina. Descargue Python 2.7.x para Windows (instalador MSI) desde el sitio web oficial de Python .

Inicie el instalador y continúe con el asistente de instalación

Asegúrese de que la opción «Agregar python.exe a la ruta» esté habilitada en la sección Personalizar Python 2.7.X.

2: Carga del firmware OTA básico en serie

Debido a que la imagen de fábrica del ESP32 carece de la capacidad de actualización OTA, primero debe cargar el firmware OTA en el ESP32 a través de la interfaz serial.

Es necesario actualizar primero el firmware para poder realizar actualizaciones inalámbricas posteriores.

El complemento ESP32 para Arduino IDE incluye una biblioteca OTA, así como un ejemplo de BasicOTA. Simplemente navegue a Archivo > Ejemplos > ArduinoOTA > BasicOTA .

Antes de comenzar a cargar el boceto, debe modificar las siguientes dos variables con sus credenciales de red para que el ESP32 pueda conectarse a una red existente.

const char* ssid = "..........";
const char* password = "..........";

Cuando haya terminado, siga adelante y cargue el boceto.

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "..........";
const char* password = "..........";

void setup() {
  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 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
  // ArduinoOTA.setHostname("myesp32");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH)
        type = "sketch";
      else // U_SPIFFS
        type = "filesystem";

      // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .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();
}

Ahora, abra el Serial Monitor a 115200 baudios y presione el botón EN en el ESP32. Si todo está bien, debería ver la dirección IP dinámica asignada por su enrutador. Tome nota de ello.

Paso 3: Carga del nuevo boceto por aire

Ahora, subamos un nuevo boceto por aire. Recuerde que debes incluir el código OTA en cada sketch que subas. De lo contrario, perderá la capacidad OTA y no podrá realizar la próxima carga inalámbrica. Por lo tanto, se recomienda que modifique el código anterior para incluir su nuevo código.

Como ejemplo, incluiremos un boceto Blink simple en el código OTA básico. Recuerda modificar las variables SSID y contraseña con sus credenciales de red.

Los cambios en el programa Basic OTA están resaltados con comentarios //******.

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "..........";
const char* password = "..........";


//******codigo programa*******
//variabls for blinking an LED with Millis
const int led = 2; // ESP32 Pin to which onboard LED is connected
unsigned long previousMillis = 0;  // will store last time LED was updated
const long interval = 1000;  // interval at which to blink (milliseconds)
int ledState = LOW;  // ledState used to set the LED

//******fin codigo programa*******

void setup() {

//******codigo programa*******
pinMode(led, OUTPUT);
//******fin codigo programa*******
  
  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 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
  // ArduinoOTA.setHostname("myesp32");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH)
        type = "sketch";
      else // U_SPIFFS
        type = "filesystem";

      // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .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();  

//******codigo programa*******
//loop to blink without delay
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
  // save the last time you blinked the LED
  previousMillis = currentMillis;
  // if the LED is off turn it on and vice-versa:
  ledState = not(ledState);
  // set the LED with the ledState of the variable:
  digitalWrite(led,  ledState);
 //******fin codigo programa*******
  }

}

Tenga en cuenta que no hemos utilizado la delay()función para hacer que el LED parpadee. Esto se debe a que la delay()función pausa el programa. Si se genera la siguiente solicitud OTA mientras el ESP32 está en pausa esperando a delay()que se complete, su programa perderá esa solicitud.

Después de copiar el boceto anterior en su IDE de Arduino, navegue hasta la opción Herramientas > Puerto . Busque algo como: esp32-xxxxxx en your_esp_ip_address . Si no puede localizarlo, es posible que deba reiniciar su IDE.

Elija el puerto y presione el botón Cargar. El nuevo boceto se cargará en cuestión de segundos. El LED integrado debería comenzar a parpadear.

Actualizador OTA via web

La programación OTA es útil cuando necesita actualizar el código de las placas ESP32 a las que no se puede acceder fácilmente. El ejemplo que mostraremos aquí funciona cuando el ESP32 y su navegador están en su red local.

La única desventaja de OTA Web Updater es que debe agregar el código para OTA en cada boceto que cargue, para que pueda usar OTA en el futuro.

¿Cómo funciona el Actualizador web OTA?

  • El primer boceto debe cargarse a través del puerto serie. Este boceto debe contener el código para crear el actualizador web OTA, de modo que pueda cargar el código más tarde con su navegador.
  • El boceto de OTA Web Updater crea un servidor web al que puede acceder para cargar un nuevo boceto a través del navegador web.
  • Luego, debe implementar rutinas OTA en cada boceto que cargue, de modo que pueda realizar las próximas actualizaciones/cargas por aire.
  • Si carga un código sin una rutina OTA, ya no podrá acceder al servidor web y cargar un nuevo boceto por aire.

Antes de continuar , debe tener instalado el complemento ESP32 en su IDE de Arduino. Veamos los pasos a seguir

1-Carga de OTAWebUpdater

Cuando instala el complemento ESP32 para Arduino IDE, instalará automáticamente la biblioteca ArduinoOTA. Vaya a Archivo > Ejemplos > ArduinoOTA > OTAWebUpdater .

otawebupdater-arduino-ide

Debería cargarse el siguiente código.

/*
 * OTAWebUpdater.ino Example from ArduinoOTA Library
 * Rui Santos 
 * Complete Project Details https://randomnerdtutorials.com
 */

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>

const char* host = "esp32";
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

WebServer server(80);

/*
 * Login page
 */
const char* loginIndex = 
 "<form name='loginForm'>"
    "<table width='20%' bgcolor='A09F9F' align='center'>"
        "<tr>"
            "<td colspan=2>"
                "<center><font size=4><b>ESP32 Login Page</b></font></center>"
                "<br>"
            "</td>"
            "<br>"
            "<br>"
        "</tr>"
        "<td>Username:</td>"
        "<td><input type='text' size=25 name='userid'><br></td>"
        "</tr>"
        "<br>"
        "<br>"
        "<tr>"
            "<td>Password:</td>"
            "<td><input type='Password' size=25 name='pwd'><br></td>"
            "<br>"
            "<br>"
        "</tr>"
        "<tr>"
            "<td><input type='submit' onclick='check(this.form)' value='Login'></td>"
        "</tr>"
    "</table>"
"</form>"
"<script>"
    "function check(form)"
    "{"
    "if(form.userid.value=='admin' && form.pwd.value=='admin')"
    "{"
    "window.open('/serverIndex')"
    "}"
    "else"
    "{"
    " alert('Error Password or Username')/*displays error message*/"
    "}"
    "}"
"</script>";
 
/*
 * Server Index Page
 */
 
const char* serverIndex = 
"https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
   "<input type='file' name='update'>"
        "<input type='submit' value='Update'>"
    "</form>"
 "<div id='prg'>progress: 0%</div>"
 "<script>"
  "$('form').submit(function(e){"
  "e.preventDefault();"
  "var form = $('#upload_form')[0];"
  "var data = new FormData(form);"
  " $.ajax({"
  "url: '/update',"
  "type: 'POST',"
  "data: data,"
  "contentType: false,"
  "processData:false,"
  "xhr: function() {"
  "var xhr = new window.XMLHttpRequest();"
  "xhr.upload.addEventListener('progress', function(evt) {"
  "if (evt.lengthComputable) {"
  "var per = evt.loaded / evt.total;"
  "$('#prg').html('progress: ' + Math.round(per*100) + '%');"
  "}"
  "}, false);"
  "return xhr;"
  "},"
  "success:function(d, s) {"
  "console.log('success!')" 
 "},"
 "error: function (a, b, c) {"
 "}"
 "});"
 "});"
 "</script>";

/*
 * setup function
 */
void setup(void) {
  Serial.begin(115200);

  // Connect to WiFi network
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  /*use mdns for host name resolution*/
  if (!MDNS.begin(host)) { //http://esp32.local
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }
  Serial.println("mDNS responder started");
  /*return index page which is stored in serverIndex */
  server.on("/", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", loginIndex);
  });
  server.on("/serverIndex", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", serverIndex);
  });
  /*handling uploading firmware file */
  server.on("/update", HTTP_POST, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
    ESP.restart();
  }, []() {
    HTTPUpload& upload = server.upload();
    if (upload.status == UPLOAD_FILE_START) {
      Serial.printf("Update: %s\n", upload.filename.c_str());
      if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_WRITE) {
      /* flashing firmware to ESP*/
      if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_END) {
      if (Update.end(true)) { //true to set the size to the current progress
        Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
      } else {
        Update.printError(Serial);
      }
    }
  });
  server.begin();
}

void loop(void) {
  server.handleClient();
  delay(1);
}

Debe cambiar las siguientes líneas en el código para incluir sus propias credenciales de red:

const char* ssid = "";
const char* contraseña = "";

El ejemplo de OTAWebUpdater para ESP32 crea un servidor web asíncrono donde puede cargar código nuevo en su placa sin necesidad de una conexión en serie.Suba el código anterior a tu placa ESP32. No olvide ingresar sus credenciales de red y seleccionar la placa y el puerto serial correctos.

Después de cargar el código, abra el monitor serie a una velocidad de transmisión de 115200, presione el botón de activación de ESP32 y obtendrá la dirección IP de ESP32:

Ahora, puede cargar el código a su ESP32 por aire usando un navegador en su red local.

Para probar el Actualizador web OTA, puede desconectar el ESP32 de su computadora y encenderlo con un banco de energía, por ejemplo (esto es opcional, lo sugerimos para imitar una situación en la que el ESP32 no está conectado a su computadora).

2-Actualización del nuevo código usando el actualizador web OTA

Abra un navegador en su red e ingrese la dirección IP ESP32. Deberías obtener lo siguiente:

otawebupdater-usuario-contraseña

Introduzca el nombre de usuario y la contraseña:

  • Nombre de usuario : admin
  • contraseña : admin

Puede cambiar el nombre de usuario y la contraseña en el código.

Nota:  Después de ingresar el nombre de usuario y la contraseña, será redirigido a la URL /serverIndex . No necesita ingresar el nombre de usuario y la contraseña para acceder a la URL /serverIndex . Por lo tanto, si alguien conoce la URL para cargar el nuevo código, el nombre de usuario y la contraseña no protegen la página web para que otros no puedan acceder a ella.

Debería abrirse una nueva pestaña en la URL /serverIndex . Esta página le permite cargar un nuevo código a su ESP32. Debería cargar archivos .bin (veremos cómo hacerlo en un momento).

ota-web-updater-esp32

3-Preparación del nuevo sketch

Al cargar un nuevo boceto por aire, debe tener en cuenta que debe agregar código para OTA en su nuevo boceto, de modo que siempre pueda sobrescribir cualquier boceto con uno nuevo en el futuro. Por lo tanto, le recomendamos que modifique el boceto de OTAWebUpdater para incluir su propio código.

Con fines de aprendizaje, subamos un nuevo código que parpadee un LED (sin demora). Copie el siguiente código en su IDE de Arduino.

/*
 * Rui Santos 
 * Complete Project Details https://randomnerdtutorials.com
 */

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>

const char* host = "esp32";
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

//variabls to blink without delay:
const int led = 2;
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1000;           // interval at which to blink (milliseconds)
int ledState = LOW;             // ledState used to set the LED

WebServer server(80);

/*
 * Login page
 */

const char* loginIndex = 
 "<form name='loginForm'>"
    "<table width='20%' bgcolor='A09F9F' align='center'>"
        "<tr>"
            "<td colspan=2>"
                "<center><font size=4><b>ESP32 Login Page</b></font></center>"
                "<br>"
            "</td>"
            "<br>"
            "<br>"
        "</tr>"
        "<td>Username:</td>"
        "<td><input type='text' size=25 name='userid'><br></td>"
        "</tr>"
        "<br>"
        "<br>"
        "<tr>"
            "<td>Password:</td>"
            "<td><input type='Password' size=25 name='pwd'><br></td>"
            "<br>"
            "<br>"
        "</tr>"
        "<tr>"
            "<td><input type='submit' onclick='check(this.form)' value='Login'></td>"
        "</tr>"
    "</table>"
"</form>"
"<script>"
    "function check(form)"
    "{"
    "if(form.userid.value=='admin' && form.pwd.value=='admin')"
    "{"
    "window.open('/serverIndex')"
    "}"
    "else"
    "{"
    " alert('Error Password or Username')/*displays error message*/"
    "}"
    "}"
"</script>";
 
/*
 * Server Index Page
 */
 
const char* serverIndex = 
"https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
   "<input type='file' name='update'>"
        "<input type='submit' value='Update'>"
    "</form>"
 "<div id='prg'>progress: 0%</div>"
 "<script>"
  "$('form').submit(function(e){"
  "e.preventDefault();"
  "var form = $('#upload_form')[0];"
  "var data = new FormData(form);"
  " $.ajax({"
  "url: '/update',"
  "type: 'POST',"
  "data: data,"
  "contentType: false,"
  "processData:false,"
  "xhr: function() {"
  "var xhr = new window.XMLHttpRequest();"
  "xhr.upload.addEventListener('progress', function(evt) {"
  "if (evt.lengthComputable) {"
  "var per = evt.loaded / evt.total;"
  "$('#prg').html('progress: ' + Math.round(per*100) + '%');"
  "}"
  "}, false);"
  "return xhr;"
  "},"
  "success:function(d, s) {"
  "console.log('success!')" 
 "},"
 "error: function (a, b, c) {"
 "}"
 "});"
 "});"
 "</script>";

/*
 * setup function
 */
void setup(void) {
  pinMode(led, OUTPUT);
  
  Serial.begin(115200);

  // Connect to WiFi network
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  /*use mdns for host name resolution*/
  if (!MDNS.begin(host)) { //http://esp32.local
    Serial.println("Error setting up MDNS responder!");
    while (1) {
      delay(1000);
    }
  }
  Serial.println("mDNS responder started");
  /*return index page which is stored in serverIndex */
  server.on("/", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", loginIndex);
  });
  server.on("/serverIndex", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html", serverIndex);
  });
  /*handling uploading firmware file */
  server.on("/update", HTTP_POST, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
    ESP.restart();
  }, []() {
    HTTPUpload& upload = server.upload();
    if (upload.status == UPLOAD_FILE_START) {
      Serial.printf("Update: %s\n", upload.filename.c_str());
      if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_WRITE) {
      /* flashing firmware to ESP*/
      if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_END) {
      if (Update.end(true)) { //true to set the size to the current progress
        Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
      } else {
        Update.printError(Serial);
      }
    }
  });
  server.begin();
}

void loop(void) {
  server.handleClient();
  delay(1);

  //loop to blink without delay
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    ledState = not(ledState);

    // set the LED with the ledState of the variable:
    digitalWrite(led, ledState);
  }
}

Como puede ver, hemos agregado el código «parpadeo sin demora» al código OTAWebUpdater, para que podamos realizar actualizaciones más adelante.

Después de copiar el código en su IDE de Arduino, debe generar un archivo .bin .

4-Generación del archivo .bin en Arduino IDE

Guarde su boceto como LED_Web_Updater .

Para generar un archivo .bin a partir de su boceto, vaya a Boceto > Exportar binario compilado

exportar-archivo-bin-arduino-ide

Se debe crear un nuevo archivo en el boceto de la carpeta. Vaya a Bosquejo > Mostrar carpeta de bosquejo . Debe tener dos archivos en su carpeta Sketch: el archivo .ino y el archivo .bin . Debe cargar el archivo .bin mediante el actualizador web de OTA.

5-Carga del nuevo sketch por aire al ESP32

En su navegador, en la página ESP32 OTA Web Updater, haga clic en el botón Elegir archivo . Seleccione el archivo .bin generado anteriormente y luego haga clic en Actualizar .

Después de unos segundos, el código debería cargarse correctamente.

El LED incorporado ESP32 debe estar parpadeando.¡Felicidades! Ha subido un nuevo código a tu ESP32 por aire.

Las actualizaciones inalámbricas hemos visto que son útiles para cargar un nuevo código en su placa ESP32 cuando no es fácilmente accesible. En este segundo caso hemos visto el código OTA Web Updater como crea un servidor web al que puede acceder para cargar un nuevo código en su placa ESP32 utilizando un navegador web en su red local.

Fuentes

https://lastminuteengineers.com/esp32-ota-updates-arduino-ide/

ESP32 Over-the-air (OTA) Programming – Web Updater Arduino IDE