Detector de borde mejorado con circuito de enganche para esp8266

¿Qué se puede hacer con este circuito para mejorarlo/simplificarlo?
Por ejemplo, ¿he hecho algo que es una mala práctica, o algo que se sabe que fallará antes de que hayan pasado cinco años (digo cinco porque creo que es una expectativa de vida normal para los aparatos electrónicos del hogar), o debería/podría usar otras partes que serían más adecuadas.

Nota:
creé esta pregunta para centrarme principalmente en el circuito que creé. Mis pensamientos iniciales fueron hacer una pregunta más amplia, pero veo (y experimenté) que puede ser difícil. Consulte mi otra pregunta (ahora editada): ¿ Cómo se llama este circuito?
Nota 2:
este es un proyecto de código abierto que quiero compartir con la comunidad, no pretende ser un estándar de la industria, pero tampoco quiero hacer algo que se rompa en un par de meses. Está destinado a ser una puerta/ventana/buzón/cualquier sensor de apertura y cierre sobre el que pueda tener un control total.

Creé un prototipo de trabajo que hice fabricar y probar trabajando con mis requisitos. Más explicación más adelante.
Ref: https://easyeda.com/jakibsgaard/low-powered-rising-and-falling-power-on-circuit

Requisitos:

  1. Consumo de energía lo más bajo posible en suspensión profunda (este circuito usa teóricamente menos de 3uA, excepto que el consumo de energía SN74AHC1G86DBVR establece un uso máximo de 10uA).
  2. Tener un tamaño pequeño (este circuito es de aproximadamente 20 mm x 31 mm).
  3. En cada borde, proporcione una señal que sea lo suficientemente larga para que el esp8266 se despierte y mantenga encendido el circuito de enganche (encontré información de que el tiempo de arranque del esp8266 es de alrededor de 300 ms).
  4. Trate de usar componentes básicos en lcspcb para mantener bajos los costos (no quiero soldar estos 0402 yo mismo. Este circuito solo tiene una parte extendida).
  5. Fácil de programar para un aficionado al bricolaje normal. Así que no hay otro microcontrolador que necesite un equipo especial para ser programado.
  6. Utilice los esp-12f o esp-12s ya que estos son muy pequeños.
  7. Ser capaz de que el esp8266 detecte si el sensor está abierto o cerrado.
  8. Alimentado por una batería lipo (he encontrado unos 200 mah que son casi del mismo tamaño que la placa de circuito impreso y tienen un circuito de protección incorporado).
  9. Use un interruptor de láminas u otros sensores sin alimentación (esto es solo para mi caso de uso, para que otros puedan usar lo que quieran).
  10. Ser capaz de comprobar el voltaje de la batería al despertar. Actualmente configuro ADC_MODE (ADC_VCC) en el esp8266, no da un voltaje exacto pero se puede ajustar o pensar en el software. Esto podría ser difícil si se usa un convertidor reductor.
  11. Tenga la mayoría de las piezas en un lado, ya que jlcpcb solo se monta en un lado.

Acerca de mi circuito y experiencias
Primero algo de crédito:
Por el circuito de enganche Rui Santos en los tutoriales de randomnerd .
Para la idea sobre el circuito detector de bordes, la respuesta de Russel McMahon .

Esquemático: ingrese la descripción de la imagen aquí

Cómo funciona:
suponiendo que el interruptor de láminas conectado en P1 está abierto y se está cerrando. Luego, VCC irá directamente a A en el XOR y dado que C1 se está cargando lentamente (debido a R1), B todavía está por debajo del umbral, por lo que la salida Y en el XOR ahora es alta. Esto envía una señal a Q2 que, a su vez, envía una señal a Q3, lo que hace que la compuerta en Q1 se cierre y se envíe energía al esp8266.
El esp8266 se alimenta únicamente debido a la señal del XOR durante un tiempo (determinado por C1, R1 y R3), este tiempo es lo suficientemente largo para que el esp8266 envíe una señal alta al pin 14 (GPIO5) hacia Q3 que luego mantiene el flujo de energía tanto tiempo como sea necesario.
Cuando C1 está lo suficientemente cargado, A y B en el XOR están altos y Q2 está apagado y el esp8266 mantiene el poder solo.
El esp8266 también verifica si la entrada es alta o baja en el pin 6 (GPIO12), esto es para informar si el interruptor está abierto o cerrado.
Luego, cuando el esp8266 termina, deja de enviar la señal alta y el circuito de enganche se apaga.

Luego, cuando el interruptor de lengüeta se cierra y se abre, A en el XOR es bajo, y B sigue siendo alto, ya que C1 todavía mantiene un voltaje por encima del umbral. Esto hace que Y en el XOR sea alto y comience el mismo proceso con el circuito de enganche. D1 está evitando que la corriente regrese al circuito, pero existe alguna fuga.
Cuando C1 se agota lo suficiente, B también es bajo, por lo que la salida Y en el XOR ahora es baja.

En el esp8266, el pin 3 (EN) debe estar alto y el pin 10 (GPIO15) debe estar bajo para que el esp8266 arranque correctamente. El pin 12 (GPIO0) se usa cuando parpadea y debe mantenerse bajo al hacerlo. Pero puede estar flotando cuando no está siendo flasheado. El pin 11 (GPIO2) también puede estar flotando para estar en estado alto.

El encabezado de programación está ahí para facilitar la programación por primera vez. Luego es mejor usar OTA (Over The Air update). También alimenta el esp8266 directamente.

Energía de la batería:
He probado este circuito con éxito en el rango de 2,5 a 4,3 V CC. Por supuesto, esto no se recomienda ya que el rango de voltaje del esp8266 es de 2.5 a 3.6 VDC. Pero desde mi experiencia y la de otros, esto está bien, especialmente porque solo se enciende unas pocas veces al día.
Tampoco necesito condensadores para la alimentación ya que la batería lipo es la fuente directa.

Consumo de energía:
después de la prueba, descubrí que la corriente de reposo en estado cerrado es ~3uA y en estado abierto ~0.40uA.
Entonces, si se activa dos veces al día, usa 3 segundos para arrancar y hace lo que debe hacer a ~80 mA, durará más de 2 años con una batería de 200 mAh (15 % de capacidad reducida en los cálculos).

Circuito latching:
he cambiado algunos componentes por unos más pequeños ya que quería que jlcpcb montara el SMD. Entonces solo componentes básicos y lo más pequeños posible ya que el consumo de energía es muy bajo en la parte "lógica" del circuito.

"Problemas" actuales que puedo cambiar pero que no he probado ni encontrado una solución funcional en la vida real :

  1. D2 y R2 se pueden eliminar ya que parece que no tienen ningún propósito.
  2. El valor de R5 debe aumentarse para que el consumo de energía se reduzca cuando el sensor está cerrado. Pero actualmente se necesita que sea este valor para que GPIO12 se reduzca y no se vea afectado por el ruido proveniente de la corriente inversa de D1.
  3. Debería haber un convertidor reductor o LDO, pero por ahora se alimenta directamente de la batería. Y si se usa un convertidor reductor o LDO, aún debería ser posible medir el voltaje cuando se vuelve bajo.
Intenté eliminar D2 y R2. Pero se necesita D2 cuando gpio12 es alto, o causará alguna interrupción. También se necesitaba R2 para ayudar a que la señal se mantuviera baja al verificar el estado del interruptor. Entonces, en este caso, se necesitan tanto D2 como R2.
Estoy planeando construir 20 de su proyecto compartido para el sistema de calefacción de mi casa con el objetivo de apagar los calentadores cuando abre una ventana por más de 2 minutos por ej... u otro uso, debería estar notificando cuando salí de la casa y me olvidé de cierra una ventana… ¿Tienes algún comentario sobre el tiempo de vida de la batería? ¿Desde hace un año hiciste algunas mejoras? ¿Cómo descubre Home Assistant estos nuevos dispositivos? con API? ¿Dónde puedo encontrar las diferentes bibliotecas? ¿IDE de arduino? ¡Gracias por compartir este proyecto, estaba buscando esto por un tiempo!
Respondido en la tarde, gracias por su interés!
¡Gran proyecto! Te he enviado un correo electrónico. Intentaré replicar con modificaciones. Tú aportación es muy apreciada.

Respuestas (2)

¿Ha considerado un 74HC74 con su señal conectada a la entrada del reloj (quizás a través de un inversor si es necesario), la línea de datos alta y un GPIO de su MCU conectado a la línea de reinicio para que pueda cancelar la solicitud una vez que la MCU se haya encendido? ?

Miré el 74HC74 antes, pero descubrí que no ayudaría en el borde descendente de la señal. ¿Estoy en lo correcto?

¿Ha considerado simplemente mantener el ESP8266 en modo de suspensión profunda y hacer que el interruptor de lengüeta haga que se despierte?

Aquí hay un proyecto de alarma de puerta que usa un ESP8266 que hace eso:

https://github.com/chaeplin/esp8266_and_arduino/tree/master/_48-door-alarm-deepsleep

Más discusión aquí: https://github.com/esp8266/Arduino/issues/1488#issuecomment-205113504

Esa es una buena idea si descartas mi primer requisito, y es que uso un ESP8266. El propio ESP8266 utiliza ~20uA en modo de suspensión profunda. Fuente: espressif.com/sites/default/files/… Luego debe tener en cuenta lo que usa la placa. Es por eso que he usado un mosfet para apagarlo todo.
Creo que esp8266 y esp12 tienen una operación de sueño profundo similar (si no la misma), por ejemplo, consulte: kevinstadler.github.io/notes/…
Sí, en teoría, pero mi problema con el sueño profundo es el consumo de corriente "alto".
Creo que vale la pena probarlo por ti mismo. ¿Has visto este vídeo? youtube.com/watch?v=IYuYTfO6iOs Un ESP-12 que transmite una vez por hora puede durar varios meses en celdas 2AA.
Absolutamente, pero mi objetivo es usar menos energía que la que usa Andreas. youtube.com/watch?v=IYuYTfO6iOs&t=680s Aquí habla sobre el consumo de energía, ~70uA a 4.1Vdc y ~40uA a 3.5Vdc. Mi circuito usa ~3uA durante el apagado (mi versión de sueño profundo)
Todavía a alto consumo de corriente durante el sueño profundo. Lo más bajo que pude ver fue 23uA. No he encontrado ningún dispositivo ESP que tenga una corriente de sueño profundo lo suficientemente baja, ya que necesita mucha corriente para dormir. Lo he visto en otros microcontroladores, pero son demasiado difíciles de programar (en comparación con un ESP8266 o ESP32). Mi pregunta no es sobre el sueño profundo en los microcontroladores, sino en este circuito, ya que el apagado consume menos corriente que cualquier modo de suspensión.