ESP8266: diferenciar la activación debido al intervalo de suspensión frente a la pulsación del botón

Tengo un módulo ESP8266, ESP-12F que está en modo de suspensión profunda.

Se despierta cada 6 horas para leer el sensor de humedad, mostrarlo en LED y luego publicarlo en IFTTT. Debido a que es cada 6 horas, en realidad se despierta cada hora solo para verificar un contador almacenado en EEPROM para ver si han transcurrido las 6 horas. De lo contrario, aumentará o restablecerá el contador de EEPROM en consecuencia.

También quiero que el usuario presione un botón para despertar el ESP, lea el sensor de humedad, lo muestre en el LED y envíe a IFTTT incluso si no han transcurrido las 6 horas.

¿Hay alguna manera de diferenciar la activación debido al intervalo de suspensión frente a un reinicio al presionar un botón? En ambos casos, el motivo de reinicio es 5.

Estoy abierto a soluciones de hardware y firmware.

También he intentado simular un posible circuito . Pero el GPIO12 (que estoy tratando de leer como BAJO justo después de que ESP se despierta) no mantiene el valor BAJO el tiempo suficiente para que lo lea justo después de despertar.

Respuestas (2)

Una solución de hardware es utilizar SR Latch . Según la descripción, parece que el NAND (/S, /R) sería adecuado en esta situación. Debería poder encontrar un chip con dicho pestillo o construir uno a partir de puertas usando, por ejemplo, 74HC00 (4 puertas nand de las cuales se usarían 2). Sin embargo, se necesita un pin adicional para restablecer el pestillo SR después del encendido causado por el botón externo.

La conexión podría ser la siguiente:

  • /S - conectado al botón de activación conectado también a ESP8266. Suponiendo que el despertador ESP8266 (/ RESET) está activo bajo, el interruptor momentáneo pasa a GND, y esta línea normalmente se levanta (como en el esquema de falstad de la pregunta).
  • /R - conectado a alguna salida del ESP8266 (GPIO) - también necesitaría levantar este pin, por lo que se define cuando el ESP8266 está apagado
  • Q (salida SR) - conectado a alguna entrada del ESP8266 (GPIO)

El funcionamiento sería el siguiente:

  1. Al presionar el interruptor momentáneo (cortocircuito a GND), cambiaría el estado de la salida SR a 1.
  2. Una vez finalizado el arranque, el software leerá el estado de la Q: si es "1", se trata de un encendido debido al interruptor/si es 0, se trata de un encendido debido al temporizador.
  3. Antes de volver a dormir, armaría el pestillo SR para el próximo encendido aplicando un pulso corto a GND en el pin /R para que Q sea 0.

Una desventaja de esta solución es que después de aplicar energía al sistema por primera vez (aumento de 3,3 V), se desconoce el estado del pestillo SR (ya sea 0 o 1). Esto significa que es posible que haya leído mal el motivo del primer encendido, pero más tarde estará bien.

Descargo de responsabilidad estándar: solución provista sin ninguna simulación o creación de prototipos: debe pensarlo detenidamente, verificar si funciona y si es adecuado para su aplicación.

Una respuesta fácil es utilizar la dirección de diodos y un límite de retardo.

Activar desde un botón... Su botón de reinicio va a 2 diodos, uno se conecta al pin ESP RST, el otro se conecta a cualquier otro GPIO (digamos GPIO 6). GPIO-6 tiene un límite a tierra y una resistencia de extracción lenta. Al presionar el botón se bajan ambos pines y se descarga la tapa, al soltar el botón se libera el pin de reinicio, la tapa mantiene bajo el GPIO 6 durante algún tiempo, se prueba el GPIO 6 durante el arranque antes de que se cargue la tapa.

Wake from timer... GPIO 16 del ESP va al pin RST. Cuando esto pasa a nivel bajo, GPIO 6 no pasa a nivel bajo. Tal vez use un diodo aquí también, de modo que presionar el botón de reinicio no baje el GPIO 6 (está configurado como una salida, es mejor no sobrecargarlo).

Por supuesto, puede hacer lo contrario, GPIO16 baja tanto RST como GPIO 6, el botón de reinicio baja solo el pin RST.