Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Recordatorio de cumpleaños que dura 50 años

Componentes y suministros

Arduino Nano R3
Clones chinos de Nano o Mini con ATmega168P-AU
× 1
Intersil ISL1208 RTC
× 1
Celda de monedas Renata CR2450N
× 1
CP2102 USB a módulo serial
× 1
Programador USBasp
× 1
Cristal de 32,768 KHz
× 1
SPST Switch
× 1
LED SMD
× 1
Cúpula LED transparente
× 1
Caja de interruptores de 4 "x 4"
O puede imprimir un gabinete en 3D.
× 1
Perfboard
× 1
Conectores Berg (tanto M como F)
× 1
Resistencia de 4,75 k ohmios
× 3
Resistencia de 10k ohmios
× 2

Herramientas y máquinas necesarias

Dremel
Soldador (genérico)

Aplicaciones y servicios en línea

ProgISP
Para programar los fusibles y flash.
Arduino IDE

Acerca de este proyecto

Sí, leíste el título correctamente. ¿Alguna vez olvidaste tu cumpleaños y necesitas que alguien más te lo recuerde? ¿O qué pasaría si pudieras regalarle a alguien que amas un dispositivo que le deseará 50 veces en su cumpleaños? ? No bromeo, esta simple alarma de cumpleaños con Arduino que se ejecuta en una celda de botón única CR2450 puede desearles a sus seres queridos (oa usted mismo) un feliz cumpleaños durante 50 años, antes de que se agote la batería.

Creo que esta es la primera vez que alguien hace una alarma de cumpleaños como esta, porque intenté buscar proyectos similares pero no encontré nada. Este proyecto también está disponible en el sitio web de mi proyecto personal en - https://www.vishnumaiea.in/projects/hardware/birthday-reminder-device-that-will-run-for-50-years-on-a-coin- celda

Construí esto como parte del Hackaday Coin Cell Challenge. Esta alarma de cumpleaños simplemente me vino a la mente y comencé a investigar cuánto tiempo podemos ejecutar algo en una celda de moneda. Nunca antes había usado los modos de suspensión de ningún microcontrolador. Así que tuve que aprender todo sobre cómo hacer que las MCU funcionen a corrientes increíblemente bajas y ahorrar cada bit de energía de una celda. ¡Realmente fue un desafío! Usé ATmega168P como microcontrolador (en realidad modifiqué un Arduino Nano que tiene ATmega168P quitando todos los componentes no deseados, como el regulador de voltaje, el puente USB, etc.) y usé Arduino IDE para desarrollar el firmware.

La hora y la fecha de cumpleaños se pueden programar mediante un monitor en serie a través de USB. Una vez que se configuran la hora y la alarma, la MCU pasa al modo de suspensión. Cuando la hora actual de RTC coincide con su cumpleaños cada año, el LED parpadeará durante un minuto e imprimirá un mensaje de feliz cumpleaños en el monitor de serie. El consumo de corriente medio es de alrededor de 1,2 uAh (incluida la autodescarga), lo que hace posible su funcionamiento durante más de 50 años en una pila de botón de litio CR2450 (540 mAh).

Características

  • Alrededor de 1,22 uAh consumo de corriente medio, incluida la autodescarga de la celda ( 608 nA sin considerar la autodescarga, medida con amperímetro, en la celda CR2450N)
  • Los tiempos de funcionamiento reales de los diferentes tipos de pilas de botón de litio son:> 29 años en CR2023 (225 mAh), > 50 años en CR2450N (540 mAh) y > 64 años en CR2477N (950 mAh). [el tiempo de funcionamiento real depende de la salud física y química de la batería durante el período]
  • El cumpleaños se puede configurar y actualizar a través de cualquier software de monitorización en serie a través de USB con comandos simples.
  • El interruptor de configuración de tiempo dedicado permite configurar, ver y actualizar la hora en cualquier momento que desee.
  • La configuración del software de la hora significa que se puede configurar con bastante precisión con una aplicación que se ejecuta en una computadora (se está desarrollando un software de sincronización / configuración de la hora basado en Processing)
  • Código abierto:todos los archivos de diseño y códigos de software están disponibles para descargar con documentación detallada e imágenes de alta resolución.

Ahora lo guiaré a través de las instrucciones sobre cómo construir esto y le mostraré la prueba de consumo actual real.

Paso 1:modificar el Arduino Nano

Para este proyecto, puede usar un microcontrolador simple o usar un Arduino Nano o Mini tableros. Todo lo que se requiere es ejecutarlo con un oscilador interno (1MHz) y en el rango operativo completo de 1.8 - 5V. El CR2450 o celdas de litio similares tienen un voltaje nominal de 3V, por lo que podemos hacer funcionar el MCU sin usar un regulador de voltaje. ¡Los clones chinos o Nano y Mini son extremadamente baratos y puedes comprarlos por el precio del chip! Usé un clon Nano que tiene CH340G como el puente USB a serie. A continuación se muestra el que utilicé.

Tenía versiones ATmega168 y 328. Compré las 168 versiones por error hace unos años (ahora le encontré un uso). En este tablero en particular, debes eliminar

  • El CI de puente USB a serie, que aquí es el CH340G.
  • El diodo Shchottky que está conectado al USB 5V.
  • Dos resistencias de 1K conectadas a los pines TX y RX del CH340G.
  • LED RX, TX y PWR (SMD)
  • El regulador de voltaje AMS1117 de 5V.

Usé el LED en el pin 13 para depurar y como el intermitente principal, por lo que no lo quité. No es necesario quitar los condensadores, ya que ayudarán a atenuar el ruido. Una vez que se retira el regulador, debe acortar las almohadillas del regulador de voltaje como se muestra en la imagen. Esto se debe al enrutamiento utilizado en el diseño de la PCB. No retire el oscilador de cristal de la MCU todavía porque lo necesitaremos para cambiar los bits del fusible. Las MCU tendrán el cargador de arranque Arduino predeterminado y la configuración de fusibles que hace que se ejecute en un cristal externo de 16MHz. Si quitamos el cristal antes de configurar el fusible para usar OSC interno, simplemente no podemos programar el chip con un programador ISP. A continuación se muestra la versión modificada del Arduino Nano.

Paso 2:Cambiar los bits de fusible de ATmega168P

Normalmente, los chips en las placas Arduino vendrán con el cargador de arranque Arduino y los bits de fusible. Necesitamos cambiar esto para ejecutar la MCU en modo de menor potencia. Para lograr esto, necesitamos,

  • Haga que la MCU funcione a 1 MHz. Podemos habilitar el oscilador interno y también el bit "dividir por 8" para producir un reloj de 1MHz a partir de los 8MHz. A menor velocidad de reloj, menor será el consumo de energía. No procesaremos ningún número aquí, por lo que 1MHz es más que suficiente.
  • Desactive el módulo de detección de apagones (BOD).
  • Deshabilite todos los módulos internos como ADC, Timers, etc. Haremos esto en el software.
  • Desactive el temporizador de vigilancia (WDT).
  • Haga todas las entradas de los pines IO y BAJO excepto los pines 13, 2 y 3.

Arriba está la configuración de fusibles para ATmega168P. Tenga en cuenta que necesita las versiones "P" de los chips ATmega porque tienen la función de pico de potencia. Las versiones normales (no P) no admiten estos modos de ahorro de energía adicionales. Así que asegúrese de obtener las versiones P. Quizás ahora se pregunte por qué estoy usando 168 en lugar de 328. Eso es porque cuando estaba probando el circuito, 328 parecía consumir alrededor de 30uA para el mismo código y configuración que usé para 168 que solo consumía alrededor de 2uA. No sé por qué es esto. Como dije antes, esta es la primera vez que estoy jugando con modos de ahorro de energía como el sueño profundo. Así que puede que me esté perdiendo algo. Si sabe algo al respecto, hágamelo saber en los comentarios.

Para cambiar los bits de los fusibles, necesitamos un programador ISP. Hay muchos programadores ISP y softwares compatibles. Usé el USBasp como programador y ProgISP como software de programación. El ID de chip o la firma del ATega168P-AU que utilicé es 1E940B . Esto puede cambiar según la versión que tenga. Para cambiar los bits de fusible:

  • Conecte el USBasp a Nano. Normalmente, USBasp tendrá un conector de 10 pines, pero Nano tiene un encabezado ISP de 6 pines. Así que hice un adaptador simple de 10 pines a 6 pines. Es posible que deba hacer algo similar o encontrar un cable.
  • Seleccione el modelo de MCU de la lista y verifique la firma con el RD botón.
  • Establezca las casillas de verificación y los bits de fusión como se muestra en la imagen a continuación y use Auto o el botón Escribir en la ventana de configuración del fusible para actualizar los bits del fusible.

Si tiene éxito, se imprimirá un mensaje en la consola. A partir de ahora, necesitará que el ISP actualice la MCU. A continuación se muestra el USBasp que utilicé.

Paso 3:compilación y carga

Ahora que hemos cambiado los bits de fusible de nuestro microcontrolador, también debemos informar al software Arduino y al compilador sobre los cambios que hicimos para que podamos compilar el código correctamente dentro del IDE de Arduino. La forma de hacerlo es agregando una definición de tablero personalizada en "tables.txt" archivo que reside en el directorio de instalación de Arduino que normalmente se encuentra en /Arduino/hardware/arduino/avr/boards.txt " en sistemas Windows. Esto puede ser diferente para usted según el sistema operativo que tenga o la versión del IDE que tenga. Estoy usando la versión de IDE 1.8.5

Una vez que ubiquemos el archivo boards.txt, debe agregar una definición personalizada de un nuevo Arduino Pro Mini Junta. Alrededor de la línea 655 será el comienzo de las definiciones de placa Pro Mini existentes. Habrá muchas versiones de los tableros. Entonces necesitamos agregar una nueva variante. Agregue la siguiente definición y guárdelo.

  ## Arduino Pro o Pro Mini (3.3V, 1 MHz) con ATmega168 ## ------------------------- ------------------------- pro.menu.cpu.1MHzatmega168 =ATmega168 (3.3V, 1 MHz) pro.menu.cpu.1MHzatmega168.upload .maximum_size =14336 pro.menu.cpu.1MHzatmega168.upload.maximum_data_size =1024 pro.menu.cpu.1MHzatmega168.upload.speed =19200 pro.menu.cpu.1MHzatmega168.bootloader.low_fuses =0x62 pro.menuMenu .bootloader.high_fuses =0xDF pro.menu.cpu.1MHzatmega168.bootloader.extended_fuses =0xF9 pro.menu.cpu.1MHzatmega168.bootloader.file =atmega / ATmegaBOOT_168_pro_8MHz.megapu16.18M.menu.cpu.1MHz .menu.cpu.1MHzatmega168.build.f_cpu =1000000L  

Y aquí hay una captura de pantalla.

Necesita editar el archivo boards.txt mientras Arduino no se está ejecutando. Una vez que guarde el nuevo archivo boards.txt y reinicie Arduino IDE, verá la nueva placa que acabamos de agregar en la lista. Eche un vistazo a las capturas de pantalla a continuación.

Ahora estamos listos para compilar códigos Arduino para nuestra nueva placa. Como no estamos usando el gestor de arranque Arduino (BL) , necesitamos crear un archivo hexadecimal del programa y usar USBasp y ProgISP para actualizar el microcontrolador. Podemos hacer esto usando el "Exportar binario compilado" opción del menú Sketch del IDE o presione Ctrl + Alt + S . Cuando hacemos eso, dos archivos hexadecimales (formato Intel) se creará en el mismo directorio donde reside nuestro boceto. Un archivo hexadecimal está con BL y el otro sin BL.

Una vez que tenemos el archivo hexadecimal, en el ProgISP elegimos Cargar Flash opción para cargar el archivo hexadecimal con el que queremos actualizar la MCU y luego presionar Auto botón. Si la carga se realiza correctamente, se imprimirá en la consola de ProgISP.

Paso 4:Intersil ISL1208 I2C RTC

El Intersil ISL1208 es un chip RTC de baja potencia con interfaz I2C. Utiliza un cristal externo de 32,768 KHz para realizar un seguimiento del tiempo. Tiene registros de alarma mes-fecha-hora-min-seg. Solo consume alrededor de 400 nA en funcionamiento VBAT y un máximo de 1,2 uA en VDD. La tensión de funcionamiento es de 1,8 V a 5,5 V. Lo que lo convierte en un buen candidato son el consumo de energía y la función de alarma de la fecha del mes. Los RTC normales como DS1307 no tienen un ajuste de mes en el registro de alarma sin el cual no podemos generar una alarma de cumpleaños todos los años. Tiene un pin de salida de interrupción que generará un 250 mS señal BAJA activa cuando la hora actual coincide con la fecha y hora de la alarma. Usaremos esto para despertar la MCU del modo de suspensión que explicaré más adelante.

Funciones de ISL1208

  • Reloj / calendario en tiempo real
  • -Rastrea el tiempo en horas, minutos y segundos
  • - Día de la semana, día, mes y año
  • 15 salidas de frecuencia seleccionables
  • Alarma única
  • :configurable en segundo, minuto, hora, día de la semana, día o mes
  • - Modo de interrupción de impulso o evento único
  • Respaldo automático a batería o supercondensador
  • Detección de fallas de energía
  • Compensación del oscilador en chip
  • SRAM de usuario con respaldo de batería de 2 bytes
  • Interfaz I2C
  • - Tasa de transferencia de datos de 400 kHz
  • Corriente de suministro de batería de 400nA
  • Mismo pin Out que los dispositivos ST M41Txx y Maxim DS13xx

Como tenía una versión SMD del ISL1208, tuve que hacer una placa de conexión para poder conectarla a mi placa principal. A continuación se muestra lo que hice.

Paso 5:celda de moneda CR2450N

Especificaciones

  • Sistema químico:Li / MnO2 (según IEC 60086)
  • Voltaje nominal - 3 V
  • Capacidad nominal:540 mAh
  • Corriente de descarga estándar - 0.8 mA
  • Max. Cont. Corriente de descarga:3,0 mA
  • Peso medio:5,9 g
  • Temperatura de funcionamiento * - -40 - +85 ° C
  • Autodescarga a 23 ° C - <1% / año
  • Vida útil:hasta 10 años

Paso 6:esquema

Utilice el esquema anterior para soldar los módulos en una placa perfilada. Las dos resistencias de 4.7K son las dominadas I2C . Los valores pueden oscilar entre 3,3 K y más de 5,6 K. El R2 y R3 son pull-ups para los pines de interrupción. Arduino Nano tiene dos pines de interrupción de hardware:pin digital 3 y 2. El pin digital 2 se utilizará para la interrupción de activación de alarma desde el RTC y el pin digital 3 se utilizará para despertar el MCU cuando necesite configurar la hora. A continuación se muestra el CP2102 Módulo USB a serie que utilicé.

El módulo USB a serie se utilizará para comunicarse a través del monitor en serie. Los pines RX y TX de CP2102 están conectados a los pines RX y TX de Nano respectivamente. Tenga en cuenta que no debe conectar los + 5 V del USB al voltaje VCC principal.

Paso 7:¿Cómo funciona?

El funcionamiento del dispositivo en realidad es bastante simple. Veamos cómo funciona el algoritmo principal,

  • Establezca la hora actual en el RTC a través del monitor en serie.
  • Configure la hora y la fecha de la alarma en el RTC.
  • La MCU pasa al modo de suspensión después de configurar la hora y la alarma al deshabilitar los periféricos internos, incluidos los temporizadores y el ADC.
  • Cuando la hora actual coincide con la fecha y la hora de la alarma (MM, DD, hh, mm, ss, p), el RTC generará e interrumpirá y despertará la MCU del modo de suspensión.
  • Al despertar, la MCU habilitará los periféricos internos necesarios e imprimirá un mensaje de feliz cumpleaños en el monitor en serie. También hace parpadear el LED dentro del domo en un patrón determinado.
  • Después de desearte un feliz cumpleaños, la MCU volverá al modo de suspensión y solo se despertará en tu cumpleaños el próximo año.
  • Pero puede ver la hora y actualizarla cuando sea necesario girando el interruptor de actualización de hora ENCENDIDO.

Cuando se enciende por primera vez, todos los registros RTC serán cero y no se incrementa hasta que escribimos por primera vez en cualquiera de ellos. Para establecer la hora en el RTC,

  • Encienda el interruptor de actualización de tiempo (conecte el pin digital 3 a GND). No podemos fijar el tiempo sin tirar del pin 3 BAJO.
  • Primero conecte el dispositivo a su computadora con un cable USB. Se establecerá un puerto COM en su PC para comunicarse.
  • Busque el puerto COM del dispositivo en el administrador de dispositivos.
  • Abra cualquier software de monitor serie o monitor serie Arduino con el puerto COM del dispositivo.

La MCU imprimirá el siguiente mensaje en el monitor en serie.

  Serie establecida. Listo para actualizar la hora.  
  • Enviando "t" El comando imprimirá la hora actual, "a" imprimirá la fecha y la hora de la alarma, y ​​ "c" cancelará la operación de ajuste de tiempo y pondrá la MCU en modo de suspensión después de 6 segundos.
  • Debe enviar la hora actual en el formato que se muestra a continuación,
  TYYMMDDhhmmssp #  

Dónde:

  • T =indica información de tiempo
  • YY =dígitos menos significativos de un año (por ejemplo, 18 para 2018, el rango es de 00 a 99)
  • MM =mes (por ejemplo, 01 para enero, el rango es 01 a 12)
  • DD =fecha (por ejemplo, 24, el rango es de 01 a 31)
  • hh =horas (por ejemplo, 06, el rango es de 01 a 12 para el formato de 12 horas)
  • mm =minutos (por ejemplo, 55, el rango es de 00 a 59)
  • ss =segundos (por ejemplo, 30, el rango es de 00 a 59)
  • p =período del día para formato de 12 horas (0 =AM, 1 =PM)
  • # =delimitador

Por ejemplo, para configurar la hora y la fecha "08:35:12 AM, 05-01-2018", debemos enviar:

  T1801050835120 #  

Al dispositivo donde:

  • T =indica información de tiempo
  • 18 =el año 2018
  • 01 =mes de enero
  • 05 =fecha
  • 08 =horas
  • 35 =minutos
  • 12 =segundos
  • 0 =AM
  • # =delimitador

Si la operación es exitosa, la MCU imprimirá la hora recibida en la consola como:

  Actualización de hora recibida =T1801050835120 La fecha y la hora son las 8:35:12 a.m., 5-1-18  

Si la cadena de tiempo que ingresó no es válida, se imprimirá el siguiente mensaje:

  Entrada de tiempo no válida:,   

Una vez que haya configurado correctamente la hora, el RTC lo rastreará siempre que haya energía disponible. Puede verificar la hora que acaba de establecer enviando la "t" mando. Configurar la alarma es similar a esto, excepto que el formato de datos es diferente. Para configurar la alarma, debe enviarla como:

  AMMDDhhmmssp #  

Dónde:

  • A =indica información de alarma
  • MM =mes
  • DD =fecha
  • hh =horas
  • mm =minutos
  • ss =segundos
  • p =período de tiempo (0 =a. m., 1 =p. m.)
  • # =delimitador

Tenga en cuenta que no hay información de año con la cadena de alarma porque obviamente no la necesitamos. Por ejemplo, para establecer mi cumpleaños "08:00:00 a. M., 28-08", necesito enviar:

  A08240800000 #  

Puede consultar la hora de la alarma en cualquier momento con el comando "a" . Una vez configuradas la hora y la fecha de la alarma, es hora de poner la MCU en suspensión. Entonces el dispositivo imprimirá el siguiente mensaje:

  Todo está configurado. Desactive el pin de tiempo establecido ahora.  

Ahora necesita apagar el interruptor de ajuste de tiempo, es decir, jalar el pin digital 3 HIGH (el pull-up de 10K lo hará). El sistema no dormirá hasta que haga esto. Cuando el interruptor de ajuste de la hora está APAGADO, el dispositivo entrará en modo de suspensión en 6 segundos e imprimirá el siguiente mensaje antes.

  ¡Bien hecho! Dormir en 6 segundos ..  

Así es como se configura la hora y la alarma. Ahora, siempre que necesite verificar la hora o actualizarla, puede encender el interruptor de configuración del temporizador y el sistema se activará, establecerá una comunicación en serie y le pedirá que envíe la hora. Imprimirá el siguiente mensaje al despertar,

  Serie establecida. Hora de activación de la actualización. Listo para actualizar la hora.  

Si solo está comprobando si la hora es correcta y no desea cambiar nada, envíe "c" comando para cancelar la operación y poner el sistema en reposo nuevamente. También debe deshabilitar el interruptor de configuración de la hora en este punto.

Cuando la hora actual coincide con la hora de la alarma, es decir. su cumpleaños, el RTC generará una señal de interrupción de 250mS al pin digital 2 del Nano. Esta señal despertará el sistema. Al despertar, el dispositivo sabrá que es tu cumpleaños y establecerá comunicación en serie (solo si tienes el USB conectado) e imprimirá el siguiente mensaje,

  ¡Tada! ¡Es tu cumpleaños! Happy B'Day  :) ¡Nos vemos en tu próximo cumpleaños! TC. ¡Adiós! Dormir en 6 segundos ..  

Y también parpadeará el LED conectado al pin digital 13. Aquí hay una captura de pantalla del monitor serial Arduino mientras probaba el sistema.

Así es como operas este dispositivo. Para entender esto en el nivel de código, lea la siguiente sección.

Paso 8:Código

Este proyecto es completamente de código abierto y, por lo tanto, publiqué el código fuente del firmware en mi GitHub en https://github.com/vishnumaiea/Birthday-Alarm/ bajo licencia MIT. Eres libre de adaptar, modificar y redistribuir sin restricciones. Si desea agregar un vínculo de retroceso a este proyecto desde su uno modificado, se lo agradecería. He comentado detenidamente el código y lo he simplificado siempre que ha sido posible.

Tenemos un total de 13 funciones / procedimientos en el código. Ellos son:

  1. configuración vacía ()  

Esta es la función de configuración de Arduino que inicializará todo y establecerá los registros de configuración del ISl1208 RTC.

  2. bucle vacío ()  

La función de bucle principal.

  3. void sleepNow ()  

Esta función finaliza todas las comunicaciones, desactiva los periféricos internos de la MCU, conecta las interrupciones a los pines digitales 3 y 2 y pone el sistema en modo de suspensión profunda. En cualquier interrupción, la ejecución del programa continúa desde la línea después de sleep_mode () . Tenga en cuenta que antes de que se reanude la ejecución normal del programa, la MCU habría completado las rutinas del servicio de interrupción asociadas con los pines de interrupción que son alarmInterrupt () y timeUpdateInterrupt ()

  4. void alarmInterrupt ()  

El ISR asociado con INT0 interrumpir en el pin digital 2.

  5. void timeUpdateInterrupt ()  

El ISR asociado con INT1 interrumpir en el pin digital 3.

  6. void fetchTime ()  

fetchTime () lee los registros de tiempo del RTC e imprimirá la hora actual en la consola.

  7. void blinkLED ()  

Obviamente, los LED parpadean.

  8. bool establteSerial ()  

Establece la comunicación en serie con la ayuda del módulo USB a serie.

  9. bool endSerial ()  

Finaliza la comunicación en serie.

  10. byte bcdToDec (byte)  

Acepta un BCD (Dígitos codificados binarios) y traducirlo al valor decimal correspondiente. Necesitamos esto porque el RTC registra solo almacena y acepta valores BCD. Por lo tanto, debemos convertir hacia y desde BCD ocasionalmente.

  11. byte decToBcd (byte)  

Acepta un valor decimal y lo traduce al valor BCD correspondiente.

  12. void printTime ()  

Lee los registros de tiempo RTC e imprime la hora actual en la consola cuando "t" se recibe el comando.

  13. void printAlarmTime ()  

Lee los registros de alarma del RTC e imprime la hora y la fecha de la alarma en la consola cuando el "a" se recibe el comando.

Paso 9:prueba

Esta sería la parte más interesante de este proyecto en la que sabrá cómo terminé haciendo un dispositivo que funciona durante 50 años en una celda de moneda. Primero hice un prototipo de todo el circuito en una placa de pruebas y finalicé el diseño. Utilicé una batería de iones de litio (3,6 V) con fines de prueba para guardar mis nuevas pilas de botón. Usé mi Fluke 87 True RMS multímetro para las medidas de corriente. Tiene un 0,1 uA precisión para el rango de microamperios.

Veamos cómo podemos poner el Atmega168P en modo de suspensión profunda y reducir drásticamente el consumo de corriente.

  noInterrupts (); // inhabilita temporalmente las interrupciones set_sleep_mode (SLEEP_MODE_PWR_DOWN); // Elija nuestro modo de suspensión preferido:sleep_enable (); // Establecer el bit de habilitación de suspensión (SE):ADCSRA =0; // deshabilita ADC power_all_disable (); // deshabilita todos los módulos digitalWrite (LED_PIN, LOW); // apaga el LED para indicar interrupciones del sueño (); // volver a habilitar las interrupciones sleep_mode (); // se va a dormir  

Como dije antes, esta es la primera vez que utilizo modos de suspensión en un microcontrolador (MCU) porque nunca antes lo había necesitado. La mayor parte de la información relacionada con los modos de suspensión de AVR se encontró en este hilo del foro y en la documentación de la biblioteca de AVR.

ATmega168P tiene cinco modos de suspensión.

  • SLEEP_MODE_IDLE - menor ahorro de energía
  • SLEEP_MODE_ADC
  • SLEEP_MODE_PWR_SAVE
  • SLEEP_MODE_STANDBY
  • SLEEP_MODE_PWR_DOWN – most power savings

More info on the sleep modes can be found here and in this video. We're using the SLEEP_MODE_PWR_DOWN mode as you can see there. At this mode, the current consumption at 3.6V is only around 0.2 uA See the below graph from the ATmega168PA datasheet that shows the relation between active current vs supply voltage and power down current vs supply voltage.

Here's the actual reading of the current consumed by sleeping ATmega168P @1MHz.

The value hops between 0.1 uA and 0.2 uA due to the lack of precision. But such a precise measurement isn't necessary but would've been interesting to see.

The power consumption of ISL1208 RTC at max is 1.2 uA . So if we add this with the power down mode current consumption of the MCU we get 1.2 + 0.2 =1.4 uA . My meter measured between 1.4 uA and 1.6 uA which justifies the calculations. The variations is only due to the lack of precision and our approximation or rounding of numbers.

Here's an unlisted video from my YouTube channel where I show the testing.

Now let's do the simple math to find how long we can the system on a coin cell. The CR2450N from Reneta has a nominal capacity of 540mAh . I have two red SMD LEDs on the system which consume about 6 mA (even with two LEDs) with when turned ON. So that's the peak current consumption of the device at worst. How long these LEDs light up can be summarized as,

1. As long as the time setting switch is activated while you're setting the time (but you don't have to do this every year)

2. The 6 second delay before sleep.

3. LED flashes on your birthday and stay ON for about 19 seconds.

Let's not be accurate here but just make an approximation. Let's assume the time setting requires 2 minutes (LEDs will be ON for 2 mins) and and additional 1 minute ON time for other things including the birthday flashing. So it's total 3 minutes or 180 seconds for which the system consumes 3 mA current. Let's take the sleep or idle current as 1.6 uA , though it's lower actually. There's 31557600 seconds in a year of 365.25 days. If LEDs stay ON for 180 seconds in a year and OFF for (31557600 - 180) seconds, then the average current consumption will be,

Average Current =[((6 x 10^-3) x 180) + ((1.6 x 10^-6) x 31557420))] / 31557600 =(1.08 + 50.491872) / 31557600 =51.571872 / 31557600 =1.634 x 10^-6 =1.634 uAh 

If the average current consumption is 1.634 uAh, then the 540 mAh cell can run the device for:

Time Span (approx) =(540 x 10^-3) / (1.634 x 10^-6) =330477.3562 hours =13769.88 days =37.699 years 

Note than this approximation is do not consider self-discharge of the battery. It'll be taken into account later. You can also use the ElectroDroid app to calculate battery life. Here's a screenshot of the calculations we just did.

BUT WAIT...

Can we reduce the current consumption further ? YES WE CAN! I made further optimizations to my design to limit the average current consumption to 0.6 uA , yes I did that. Not let's see what optimizations I did,

1. To remove the extra red SMD LED to reduce the current when the system is active/running. Before it was 6 mA at max with two LEDs. So with one LED, it'll be reduced to half, ie 3 mA.

2. To reduce the current consumption of RTC, we need to disconnect the VDD pin of the ISL1208 RTC from the VBAT pin. Previously the VDD pin was connected to the VBAT pin where I supplied the 3V from the cell (you can see this in the schematic). In that configuration, I also had the LOW_POWER mode bit (LPMOD ) of the RTC set to 1 activating the low power mode. So now you might think if the low power mode is set, then the chip might be consuming the lowest current. But that's not the case when we have the VDD tied to VBAT. Because low power mode bit is only useful if we have VDD> VBAT all the time. At such situation, the RTC's internal power switch will select VBAT as power source reducing the current further by 600 nA when VDD>=VBAT (from typical 1.2 uA which I've mentioned before). But if we can run the RTC in VBAT only with VDD =0, the current consumption can be reduced to the minimum ie, 400 nA as per the datasheet. So what I did is, first I disabled the low power mode by setting LPMOD to 0. Then added a jumper to the RTC breakout board to disconnect the VDD pin from VBAT when I don't need it. Why need the jumper is because, the VDD pin must be greater than or equal to VBAT in order for the I2C to work. So I can connect the jumpers when I need I2C while I'm setting the time, and can disconnect it after. This will let the RTC to consume the targeted 400 nA current. Tada! We did it!

Now that we have reduced the current consumption of the RTC from 1.2 uA to 0.4 uA (400 nA), we can do the math again!

System Active Current =3 mAh max

System Sleep Mode Current =0.4 uA (RTC) + 0.2 uA (MCU) =0.6 uAh

System ON time =60 s (time setting) + 19 s (birthday flashing) + 6 s (before sleep) =85 seconds

System Sleeping Time =31557600 s - 85 s =31557515 seconds

Total time in a year =31557600 seconds

Battery capacity =540 mAh

Here's the current consumption test video after the optimizations and mods.

If we put those new values to the ElectroDroid's battery life calculator, we get, 101 years and 136 days. A theoretical operating time of more than a century! The average current consumption is now only 608 nA . Here's the screenshot.

Okay, What's the actual operating time ?

Batteries aren't perfect, nor anything we design. So let's also consider the 1% self discharge of the cell into account.

1% of initial capacity of 540 mAh CR2450N =5.4 mAh

Self-discharge current =5.4 mA per year or 616.4 nAh (5.4 mA / hours in a year)

Adding this 616.4 nAh with the 600 nAh sleep current =1.216 uAh

Expected operating time with average current of 1.224 uAh =50 years, and 131 days.

That's the actual operating time if the cell will be fine

Here's a table of actual operating times of different types of coin cells with the 1% self-discharge of initial capacity every year.

The main practical concerns associated with running the device for such long periods are,

1. Will the battery retain the charge and voltage for that long ?

2. The effects of environmental variations on the circuit and battery performance.

3. And you screwing up things! XD (don't drop it, chew it, sit on it, run your car through it or launch it into space!)

Coin cells are usually made to last for 10 years, which is their shelf life , and some even last longer than that. But that doesn't mean they'll start to disintegrate to an useless state after that. If the cell is physically fine, it can still power things. As per Renata datasheet, the self-discharge rate of CR2450N is less than 1% of the capacity every year. As per this datasheet from Energizer, that 1% figure is of the fresh capacity. Below is a chart that shows the standard discharge time in years (this doesn't consider the self-discharge or other exceptions). It clearly shows the theoretical expected operating time is way too longer than 10 years.

Self-discharging not only reduces the capacity but also reduces the voltage. Both ATmega168P and ISL1208 are designed to be operated fine at voltages as low as 1.8V. So the reduction in voltage might not be a problem. You can learn more about running systems with coin cells here.

To ensure long operating span, we must make sure the device is properly concealed against much of the environmental changes such as temperature, humidity, corrosion etc. These are some things you can do to protect your circuits,

1. Coat the PCB with long lasting conformal coating.

2. Place a pack of silica gel inside the enclosure.

3. Seal the enclosure with less temperature conductive materials and make it air tight.

4. Place it somewhere safe from naughty hands!

Step 10:Building

I used a perfboard to solder everything as per the schematic. I used berg connectors for the battery, switch and LED so that it'll be easy to remove them if needed. Below are the some images of the PCB.

To build the enclosure I used a 4" x 4" switch box which I bought from an electrical shop. I made two rectangular holes for the switch and USB. You can 3D print an enclosure if you want; sadly I don't have one. The dome was snatched from a cheap LED light and used super glue to fix it on the box. I painted it with silver spray paint.

Use your ingenuity to build it.

What missing is some decorations . I'm not good at decorating things. If you are going to gift this to someone, you know what to do.

The final output is satisfying to the extend of my hardwork. I might find someone else to decorate it.

Step 11 :Improvements

There's always room for improvement. Some of my suggestions are,

1. Using a Nokia 5110 LCD with or instead of the LED bulb. The LCD controller only consumes a couple of 100 uA at normal operating modes without the LED backlighting of course. Monochrome LCDs only consume extremely low currents. So using it would be better than a flashing LED, where you can actually print the happy birthday message on the screen itself. I might do this in future because I have couple of them lying around here.

2. A software that runs on the computer that'll set/sync the time accurately and automatically. I'm thinking of developing a simple one using Processing.

3. Flashing the LEDs to indicate the current age - for example if it's your 5th birthday (OMG are you're reading this ?!), it'll flash a sequence for 5 times. Currently you can not set the current age in the system. You may add this.

4. Designing a dedicated PCB in eagle (planned).

5. If blinking LED isn't your thing you can actually make this more exciting with for example using an opto-coupler you can turn on an AC alarm, music player, lights or anything you want to blink, move and scream on the birthday of the one you wish. You can even exclude the microcontroller and only use the interrupt from the RTC. Everything's possible!

So what are you waiting for ? Make one, decorate it with stickers, color papers, glitter or anything and gift to your loved ones or even yourself! And tell them to wait for this magical device to wish them happy birthday.

What you see here is actually a prototype of a device that'll refine and release in future. So stay tuned. Please feel free to share if you have found any errors with this documentation or have any improvement suggestions. Happy making :)

Código

Birthday Alarm
https://github.com/vishnumaiea/Birthday-Alarm

Esquemas

Schematic of Arduino clone.

Proceso de manufactura

  1. Industria 4.0 e IoT:Tendencias del mercado para los próximos años
  2. 10 factores para encontrar el interruptor perfecto para su aplicación
  3. NVIDIA:computadora CUDA-X AI que ejecuta todos los modelos AI
  4. Kontron:conmutador Ethernet de 40 Gigabit para uso en entornos hostiles
  5. ¡No golpees ese rumbo! Instrucciones adecuadas para el montaje en frío
  6. Recubrimiento nano para varios colores
  7. Para los ciberdelincuentes, COVID es el regalo que sigue dando
  8. 7 señales que muestran que es hora de actualizar el generador
  9. 3 señales que indican que es hora de rebobinar el motor
  10. Prácticas que dan cuenta de un ensamblaje de PCB impecable
  11. ¡Hay un robot para eso!