Apague arduino a través del software

Tengo un arduino que funciona con una batería de bloque de 9v y está habilitado por un interruptor. Quiero cambiar el circuito, para que cuando se apague el interruptor, el arduino permanezca encendido hasta que finalicen ciertas acciones, y luego se apague.

Sin embargo, no solo quiero que el arduino duerma, la alimentación debe desconectarse. Esto es importante porque tengo componentes adicionales que consumen energía del pin de 5 V (alrededor de 300 mA) y quiero que también se apaguen.

Mi primera idea fue usar un relé en paralelo al interruptor. Cuando se enciende el interruptor, el arduino también enciende el relé. Cuando el interruptor está apagado, el arduino todavía se alimenta a través del relé. El arduino detecta cuando el interruptor está apagado (el interruptor es de doble polo, por lo que puedo detectar su estado con un pin de entrada digital) y apaga el relé cuando finalizan las acciones restantes.

¿Hay una mejor manera que usar un relé? ¿Puedo usar un mosfet o algo más en lugar del relé?

Y tal vez, en el futuro, necesitaré los 9V para componentes adicionales, que también deberían apagarse cuando el arduino decida apagarse. Pero cuando el relé/mosfet/..? se coloca entre la batería y el VIN de arduino. ¿Puedo conectarlos entre relé/mosfet/..? y el arduino. Así que esto debería ser simple.

Editar: según la respuesta de Passerbys, se me ocurrió esto:ingrese la descripción de la imagen aquí

El motor es solo un marcador de posición para mis componentes adicionales que consumen energía de la batería y también deben apagarse.

Un esquema de circuito con su idea propuesta sería útil.

Respuestas (2)

Un sistema que uso comúnmente:

esquemático

simular este circuito : esquema creado con CircuitLab

M1 normalmente se mantiene APAGADO por R1. SW1 tira de la compuerta M1 BAJA cuando se presiona para encender M1. Eso luego proporciona energía al Arduino.

La primera operación que realiza Arduino es conducir el GPIO conectado a la puerta de M2 ​​(que debe ser un FET de "nivel lógico" con un umbral lo suficientemente bajo como para conducir directamente con un Arduino; también puede usar un NPN BJT). Eso luego pasa por alto el interruptor SW1 manteniendo el sistema encendido.

Entonces se puede soltar el interruptor y la alimentación permanece encendida.

El Arduino puede liberar el GPIO llevándolo a BAJO o configurándolo en ENTRADA (R3 lo bajará en ese caso) apagando M2, lo que luego permite que R1 levante la puerta de M1 apagándolo.

El único inconveniente de este circuito cuando se trabaja con un Arduino es que debe mantener presionado el botón de encendido el tiempo suficiente para que el cargador de arranque termine de ejecutarse (alrededor de 2 segundos) antes de que la alimentación permanezca encendida. Puede ser beneficioso agregar un LED (y una resistencia limitadora de corriente asociada) al GPIO que impulsa la puerta de M2 ​​para que obtenga una respuesta visual de "encendido" (o podría usar un GPIO separado si así lo desea) para que pueda saber cuándo ha mantenido presionado el botón el tiempo suficiente.

Una solución similar que resuelve el problema de 'esperar el gestor de arranque' youtube.com/watch?v=9CnTguj_qvY
@ambitiose_sed_ineptum No está mal: lo hace más complejo de implementar (más componentes), y los 2 segundos en realidad actúan como un rebote extremo del botón (el encendido se convierte en una acción muy definida que no puede ser accidental).
sí, solo otra sugerencia en caso de que el OP lo quiera. Diga, ¿no lograría casi lo mismo una resistencia pull up (digamos 1k) desde VIN hasta la puerta de M2?
Posible, aunque no me gustaría vincular VIN a un GPIO incluso a través de 1100Ω.
bueno, entonces podría controlar esa señal con un npn bjt en su lugar.
Y luego eres tan complejo como el otro circuito;) Hay muchas formas de despellejar a un gato, algunas más complicadas que otras: P Personalmente, no sufro por la cuestión de los 2 segundos ya que no tengo un gestor de arranque que espere. como eso. Tenga en cuenta que en estos días rara vez busco una solución completa de apagado, pero cuando tiene el Arduino terriblemente ineficiente, supongo que necesita alguna forma de limitar la energía desperdiciada del calentador de espacio LDO.
Gracias, esto parece exactamente lo que necesito. Los 2 segundos no son un problema para mí. ¿Puedes explicar por qué usas un segundo FET M2? Agregué un circuito a mi pregunta que solo usa uno, como propuso Passerby.
¿Cuáles serían buenos mosfets para usar aquí? Para M2 necesito V_GS pequeño (<2.5V con lógica de 5V) y quiero que R_DS sea alto, cuando el Mosfet está cerrado (por lo que tengo un bajo consumo de energía cuando el dispositivo está apagado). Para M1 solo necesito que U_DS sea> 9V. ¿Es eso correcto? ¿Algo más a tener en cuenta?
Para M2 realmente no te importa mucho R D S o norte y R D S o F F siempre será muy alto. Para M1 quieres R D S o norte ser agradable y bajo, y I D ser lo suficientemente alto para manejar la corriente que necesita. También debe observar la disipación de energía ( PAG = I D 2 R D S o norte ).

Un transistor pnp de lado alto o un mosfet de canal p con una resistencia pull up en su base/compuerta entre el regulador de 5 V y su circuito accesorio. Cuando su arduino se vaya a dormir, configure el pin de control alto o el modo de entrada para apagar el transistor. Cuando necesite energía, baje el pin.

Un relé es demasiado grande y agotará su batería de 9V muy rápido.