Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Rappel d'anniversaire valable 50 ans

Composants et fournitures

Arduino Nano R3
Clones chinois de Nano ou Mini avec ATmega168P-AU
× 1
Intersil ISL1208 RTC
× 1
Pile bouton Renata CR2450N
× 1
Module CP2102 USB vers série
× 1
Programmateur USBasp
× 1
32,768 KHz Crystal
× 1
Commutateur SPST
× 1
LED CMS
× 1
Dôme LED transparent
× 1
Boîtier de commutation 4" x 4"
Ou vous pouvez imprimer un boîtier en 3D.
× 1
Perfboard
× 1
Connecteurs Berg (M et F)
× 1
Résistance 4.75k ohm
× 3
Résistance 10k ohm
× 2

Outils et machines nécessaires

Dremel
Fer à souder (générique)

Applications et services en ligne

ProgISP
Pour programmer les fusibles et le flash.
Arduino IDE

À propos de ce projet

Oui, vous avez bien lu le titre. Avez-vous déjà oublié votre anniversaire, que vous avez besoin que quelqu'un d'autre vous le rappelle ? Ou si vous pouviez offrir à quelqu'un que vous aimez, un appareil qui lui souhaitera le jour de son anniversaire 50 fois ? Je ne plaisante pas, cette simple alarme d'anniversaire alimentée par Arduino qui fonctionne sur une pile bouton unique CR2450 pouvez souhaiter à vos proches (ou à vous-même) un joyeux anniversaire pendant 50 ans, avant que la batterie ne s'épuise.

Je pense que c'est la première fois que quelqu'un fait une alarme d'anniversaire comme celle-ci, car j'ai essayé de rechercher des projets similaires mais je n'ai rien trouvé. Ce projet est également disponible sur le site Web de mon projet personnel à - https://www.vishnumaiea.in/projects/hardware/birthday-reminder-device-that-will-run-for-50-years-on-a-coin- cellule

Je l'ai construit dans le cadre du Hackaday Coin Cell Challenge. Cette histoire d'alarme d'anniversaire m'est simplement venue à l'esprit et j'ai commencé à rechercher combien de temps nous pouvons exécuter quelque chose sur une pile bouton. Je n'ai jamais utilisé les modes veille d'un microcontrôleur auparavant. J'ai donc dû tout apprendre sur la façon de faire fonctionner les MCU à des courants incroyablement bas et d'économiser chaque peu d'énergie d'une cellule. C'était vraiment un défi ! J'ai utilisé ATmega168P comme microcontrôleur (en fait, j'ai modifié un Arduino Nano qui contient ATmega168P en supprimant tous les composants indésirables tels que le régulateur de tension, le pont USB, etc.) et j'ai utilisé Arduino IDE pour développer le firmware.

L'heure et la date d'anniversaire peuvent être programmées via un moniteur série via USB. Une fois l'heure et l'alarme réglées, le MCU passe en mode veille. Lorsque l'heure RTC actuelle correspond à votre anniversaire chaque année, la LED clignotera pendant une minute et imprimera un message de joyeux anniversaire sur le moniteur série. La consommation moyenne de courant est d'environ 1,2 uAh (autodécharge comprise) ce qui permet de le faire fonctionner pendant plus de 50 ans sur une pile bouton Lithium CR2450 (540mAh).

Fonctionnalités

  • Environ 1,22 uAh consommation moyenne de courant y compris l'autodécharge des cellules (608 nA sans tenir compte de l'autodécharge, mesurée par ampèremètre, sur la cellule CR2450N)
  • Les temps de fonctionnement réels sur différents types de piles boutons au lithium sont :>29 ans sur CR2023 (225 mAh), >50 ans sur CR2450N (540 mAh) et >64 ans sur CR2477N (950 mAh). [le temps de fonctionnement réel dépend de la santé physique et chimique de la batterie au cours de la période]
  • L'anniversaire peut être défini et mis à jour via n'importe quel logiciel de moniteur série via USB avec des commandes simples.
  • Le commutateur de réglage de l'heure dédié permet de régler, de voir et de mettre à jour l'heure à tout moment.
  • Le réglage logiciel de l'heure signifie qu'il peut être réglé assez précisément avec une application s'exécutant sur un ordinateur (un logiciel de réglage/synchronisation de l'heure basé sur le traitement est en cours de développement)
  • Open source :tous les fichiers de conception et codes logiciels sont disponibles au téléchargement avec une documentation détaillée et des images haute résolution.

Maintenant, je vais vous expliquer comment construire cela et vous montrer le test de consommation de courant réel.

Étape 1 :Modification de l'Arduino Nano

Pour ce projet, vous pouvez utiliser un microcontrôleur nu ou utiliser un Arduino Nano ou Mini planches. Tout ce qui est nécessaire, c'est que nous devons le faire fonctionner avec un oscillateur interne (1 MHz) et à une plage de fonctionnement complète de 1,8 à 5 V. Le CR2450 ou des cellules au lithium similaires ont une tension nominale de 3 V, et nous pouvons donc faire fonctionner le MCU sans utiliser de régulateur de tension. Les clones chinois ou Nano et Mini sont extrêmement bon marché que vous pouvez les acheter pour le prix de la puce ! J'ai utilisé un tel clone Nano qui a CH340G comme pont USB vers série. Ci-dessous est celui que j'ai utilisé.

J'avais les versions ATmega168 et 328. J'ai acheté les versions 168 par erreur il y a quelques années (je lui trouve maintenant une utilité). Dans ce tableau particulier, vous devez supprimer,

  • Le CI pont USB vers série qui est ici le CH340G.
  • La diode Shchottky qui est connectée à l'USB 5V.
  • Deux résistances 1K connectées aux broches TX et RX du CH340G.
  • LED RX, TX et PWR (SMD)
  • Le régulateur de tension AMS1117 5 V.

J'ai utilisé la LED sur la broche 13 pour le débogage et comme clignotant principal, je ne l'ai donc pas supprimée. Les condensateurs n'ont pas besoin d'être retirés car ils contribueront à atténuer le bruit. Une fois le régulateur retiré, vous devez court-circuiter les plaquettes du régulateur de tension comme indiqué sur l'image. Cela est dû au routage utilisé dans la conception du PCB. Ne retirez pas encore l'oscillateur à quartz du MCU car nous en aurons besoin pour changer les bits du fusible. Les MCU auront le chargeur de démarrage Arduino et les paramètres de fusible par défaut qui le font fonctionner à un cristal externe de 16 MHz. Si nous retirons le cristal avant de régler le fusible pour utiliser l'OSC interne, nous ne pouvons tout simplement pas programmer la puce avec un programmeur FAI. Vous trouverez ci-dessous la version modifiée de l'Arduino Nano.

Étape 2 :Changer les fusibles de l'ATmega168P

Normalement, les puces des cartes Arduino seront livrées avec le chargeur de démarrage Arduino et les bits de fusible. Nous devons changer cela afin de faire fonctionner le MCU en mode de puissance inférieure. Pour y parvenir, nous devons,

  • Faire fonctionner le MCU à 1MHz. Nous pouvons activer l'oscillateur interne ainsi que le bit "diviser par 8" pour produire une horloge à 1MHz à partir des 8MHz. Moins de vitesse d'horloge, moindre sera la consommation d'énergie. Nous n'allons pas faire de calculs ici, donc 1 MHz est plus que suffisant.
  • Désactiver le module de détection de baisse de tension (BOD).
  • Désactivez tous les modules internes tels que l'ADC, les minuteurs, etc. Nous le ferons dans le logiciel.
  • Désactiver le minuteur de surveillance (WDT).
  • Faire toutes les entrées des broches IO et LOW sauf les broches 13, 2 et 3.

Ci-dessus se trouvent les paramètres de fusible pour ATmega168P. Notez que vous avez besoin des versions "P" des puces ATmega car elles ont la fonction pico-power. Les versions normales (non P) ne prennent pas en charge ces modes d'économie d'énergie supplémentaires. Assurez-vous donc d'obtenir les versions P. Vous pouvez maintenant vous demander pourquoi j'utilise 168 au lieu de 328. C'est parce que lorsque je testais le circuit, 328 semblait consommer environ 30 uA pour le même code et le même réglage que j'ai utilisé pour 168 qui ne consommait qu'environ 2 uA. Je ne sais pas pourquoi c'est. Comme je l'ai déjà dit, c'est la première fois que je joue avec les modes d'économie d'énergie tels que le sommeil profond. Donc je rate peut-être quelque chose. Si vous en savez quelque chose, faites-le moi savoir dans les commentaires.

Pour changer les bits de fusible, nous avons besoin d'un programmeur ISP. Il existe de nombreux programmeurs FAI et logiciels compatibles. J'ai utilisé le USBasp en tant que programmeur et ProgISP comme logiciel de programmation. L'ID de puce ou la signature de l'ATega168P-AU que j'ai utilisé est 1E940B . Cela peut changer en fonction de la version que vous avez. Pour changer les embouts fusibles :

  • Connectez l'USBasp à Nano. Normalement, USBasp aura un connecteur à 10 broches mais Nano a un en-tête ISP à 6 broches. J'ai donc fait un simple adaptateur 10 broches à 6 broches. Vous devrez peut-être faire quelque chose de similaire ou trouver un câble.
  • Sélectionnez le modèle de MCU dans la liste et vérifiez la signature avec le RD bouton.
  • Définissez les cases à cocher et les fusibles comme indiqué dans l'image ci-dessous et utilisez la fonction Auto ou le bouton Écrire bouton sur la fenêtre de réglage des fusibles pour mettre à jour les bits de fusible.

En cas de succès, un message sera imprimé sur la console. À partir de maintenant, vous aurez besoin du FAI pour flasher le MCU. Ci-dessous se trouve l'USBasp que j'ai utilisé.

Étape 3 : compilation et téléchargement

Maintenant que nous avons changé les fusibles de notre microcontrôleur, nous devons également informer le logiciel Arduino et le compilateur des modifications que nous avons apportées afin que nous puissions compiler correctement le code dans l'IDE Arduino. Pour ce faire, nous ajoutons une définition de tableau personnalisé dans le "boards.txt" fichier qui réside dans le répertoire d'installation Arduino qui se trouve normalement à /Arduino/hardware/arduino/avr/boards.txt" sur les systèmes Windows. Cela peut être différent pour vous en fonction de votre système d'exploitation ou de la version de l'IDE que vous possédez. J'utilise la version IDE 1.8.5

Une fois que nous avons localisé le fichier boards.txt, vous devez ajouter une définition personnalisée d'un nouveau Arduino Pro Mini Conseil. Autour de la ligne 655 débutera les définitions de cartes Pro Mini existantes. Il y aura plusieurs versions des planches. Nous devons donc ajouter une nouvelle variante. Ajoutez-y la définition suivante et enregistrez.

## Arduino Pro ou Pro Mini (3,3 V, 1 MHz) avec 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.menu.cpu.1MHzatmega .bootloader.high_fuses=0xDF pro.menu.cpu.1MHzatmega168.bootloader.extended_fuses=0xF9 pro.menu.cpu.1MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_pro_8MHz.hex pro.menuatmega168.1MHz .menu.cpu.1MHzatmega168.build.f_cpu=1000000L

Et voici une capture d'écran.

Vous devez éditer le boards.txt pendant que l'Arduino n'est pas en cours d'exécution. Une fois que vous avez enregistré le nouveau fichier boards.txt et redémarré Arduino IDE, vous verrez la nouvelle carte que nous venons d'ajouter dans la liste. Jetez un œil aux captures d'écran ci-dessous.

Nous sommes maintenant prêts à compiler les codes Arduino pour notre nouvelle carte. Comme nous n'utilisons pas le chargeur de démarrage Arduino (BL) , nous devons créer un fichier hexadécimal du programme et utiliser USBasp et ProgISP pour flasher le microcontrôleur. Nous pouvons le faire en utilisant le "Exporter le binaire compilé" option du menu Sketch de l'IDE ou appuyez sur Ctrl + Alt + S . Lorsque nous faisons cela, deux fichiers hexadécimaux (format intel) sera créé dans le même répertoire que notre esquisse. Un fichier hexadécimal est avec BL et l'autre sans BL.

Une fois que nous avons le fichier hexadécimal, dans le ProgISP choisissez le Charger Flash option pour charger le fichier hexadécimal avec lequel nous voulons flasher le MCU, puis appuyez sur Auto bouton. Si le téléchargement réussit, il sera imprimé sur la console du ProgISP.

Étape 4 :Intersil ISL1208 I2C RTC

Le Intersil ISL1208 est une puce RTC basse consommation avec interface I2C. Il utilise un cristal externe de 32,768 KHz pour garder une trace de l'heure. A des registres d'alarme mois-date-heure-min-sec. Il ne consomme qu'environ 400 nA en fonctionnement VBAT et un maximum de 1,2 uA en VDD. La tension de fonctionnement est de 1,8V à 5,5V. Ce qui en fait un bon candidat, c'est la consommation d'énergie et la fonction d'alarme mois-date. Les RTC normaux tels que le DS1307 n'ont pas de réglage de mois dans le registre d'alarme sans lequel nous ne pouvons pas générer une alarme d'anniversaire chaque année. Il a une broche de sortie d'interruption qui générera un 250 mS signal LOW actif lorsque l'heure actuelle correspond à la date et à l'heure de l'alarme. Nous l'utiliserons pour sortir le MCU du mode veille, ce que j'expliquerai plus en détail ci-dessous.

Caractéristiques de l'ISL1208

  • Horloge/Calendrier en temps réel
  •  - Piste du temps en heures, minutes et secondes
  • - Jour de la semaine, jour, mois et année
  • 15 sorties de fréquence sélectionnables
  • Alarme unique
  • - Réglable sur la seconde, la minute, l'heure, le jour de la semaine, le jour ou le mois
  • - Mode événement unique ou interruption d'impulsion
  • Sauvegarde automatique sur batterie ou super condensateur
  • Détection de panne de courant
  • Compensation de l'oscillateur sur puce
  • SRAM utilisateur de 2 octets alimentée par batterie
  • Interface I2C
  • - Taux de transfert de données de 400 kHz
  • Courant d'alimentation de la batterie 400 nA
  • Même brochage que les appareils ST M41Txx et Maxim DS13xx

Comme j'avais une version SMD de l'ISL1208, j'ai dû faire une carte de dérivation afin de la brancher sur ma carte principale. Ci-dessous est ce que j'ai fait.

Étape 5 :Pile bouton CR2450N

Spécifications

  • Système chimique - Li / MnO2 (selon IEC 60086)
  • Tension nominale - 3 V
  • Capacité nominale - 540 mAh
  • Courant de décharge standard - 0,8 mA
  • Max. Suite Courant de décharge - 3,0 mA
  • Poids moyen - 5,9 g
  • Température de fonctionnement* - -40 - +85 °C
  • Autodécharge à 23°C - <1% / an
  • Durée de conservation - jusqu'à 10 ans

Étape 6 :Schéma

Utilisez le schéma ci-dessus pour souder les modules sur un panneau perforé. Les deux résistances de 4,7K sont les tractions I2C . Les valeurs peuvent aller de 3,3K à plus de 5,6K. Les R2 et R3 sont des pull-ups pour les broches d'interruption. Arduino Nano a deux broches d'interruption matérielle - les broches numériques 3 et 2. La broche numérique 2 sera utilisée pour l'interruption de réveil de l'alarme du RTC et la broche numérique 3 sera utilisée pour réveiller le MCU lorsque vous devez régler l'heure. Ci-dessous le CP2102 Module USB vers série que j'ai utilisé.

Le module USB vers série sera utilisé pour communiquer via le moniteur série. Les broches RX et TX de CP2102 sont respectivement connectées aux broches RX et TX de Nano. Notez que vous ne devez pas connecter le +5V de l'USB à la tension principale VCC.

Étape 7 :Comment ça marche ?

Le fonctionnement de l'appareil est en fait simple et silencieux. Voyons comment fonctionne l'algorithme principal,

  • Réglez l'heure actuelle sur le RTC via un moniteur série.
  • Réglez l'heure et la date de l'alarme sur le RTC.
  • Le MCU passe en mode veille après avoir réglé l'heure et l'alarme en désactivant les périphériques internes, y compris les minuteries et l'ADC.
  • Lorsque l'heure actuelle correspond à la date et à l'heure de l'alarme (MM, DD, hh, mm, ss, p), le RTC génère, interrompt et réveille le MCU du mode veille.
  • Au réveil, le MCU activera les périphériques internes requis et imprimera un message de joyeux anniversaire sur le moniteur série. Il fait également clignoter la LED à l'intérieur du dôme selon un certain motif.
  • Après vous avoir souhaité un joyeux anniversaire, le MCU se mettra à nouveau en mode veille et ne se réveillera que le jour de votre anniversaire l'année prochaine.
  • Mais vous pouvez voir l'heure et la mettre à jour chaque fois que nécessaire en tournant le interrupteur de mise à jour de l'heure ACTIVÉ.

Lors de la première mise sous tension, tous les registres RTC seront à zéro et n'augmenteront pas jusqu'à ce que nous écrivions d'abord sur l'un d'entre eux. Pour régler l'heure sur le RTC,

  • Allumez le commutateur de mise à jour de l'heure (connectez la broche numérique 3 à GND). On ne peut pas régler l'heure sans tirer sur la goupille 3 LOW.
  • Connectez d'abord l'appareil à votre ordinateur à l'aide d'un câble USB. Un port COM sera établi sur votre PC pour communiquer.
  • Recherchez le port COM de l'appareil à partir du gestionnaire d'appareils.
  • Ouvrez n'importe quel logiciel de moniteur série ou moniteur série Arduino avec le port COM de l'appareil.

Le MCU imprimera le message ci-dessous sur le moniteur série.

Série établie. Heure de mise à jour prête. 
  • Envoi de "t" La commande imprimera l'heure actuelle, "a" imprimera la date et l'heure de l'alarme, et "c" annulera l'opération de réglage de l'heure et mettra le MCU en mode veille après 6 secondes.
  • Vous devez envoyer l'heure actuelle dans le format indiqué ci-dessous,
TYYMMDDhhmmssp# 

Où :

  • T =indique l'heure
  • AA =chiffres les moins significatifs d'une année (par exemple, 18 pour 2018, la plage va de 00 à 99)
  • MM =mois (par exemple 01 pour janvier, la plage est de 01 à 12)
  • JJ =date (par exemple 24, la plage est de 01 à 31)
  • hh =heures (par exemple 06, la plage est de 01 à 12 pour le format 12 heures)
  • mm =minutes (par exemple 55, la plage est de 00 à 59)
  • s =secondes (par exemple 30, la plage est de 00 à 59)
  • p =période de la journée pour le format 12 heures (0 =AM, 1 =PM)
  • # =délimiteur

Par exemple, pour régler l'heure et la date "08:35:12 AM, 05-01-2018", nous devons envoyer :

T1801050835120# 

Vers l'appareil où :

  • T =indique l'heure
  • 18 =l'année 2018
  • 01 =mois janvier
  • 05 =date
  • 08 =heures
  • 35 =minutes
  • 12 =secondes
  • 0 =AM
  • # =délimiteur

Si l'opération réussit, le MCU imprimera l'heure reçue sur la console sous la forme :

Mise à jour de l'heure reçue =T1801050835120La date et l'heure sont 08:35:12 AM, 5-1-18 

Si la chaîne d'heure que vous avez saisie n'est pas valide, le message ci-dessous sera imprimé :

Entrée d'heure non valide - ,  

Une fois que vous avez réglé l'heure avec succès, le RTC en gardera une trace tant qu'il y aura de l'énergie à sa disposition. Vous pouvez vérifier l'heure que vous venez de régler en envoyant le "t" commander. Le réglage de l'alarme est similaire à celui-ci, sauf que le format des données est différent. Pour régler l'alarme, vous devez l'envoyer en tant que :

AMMDDhhmmssp# 

Où :

  • Un =indique les informations d'alarme
  • MM =mois
  • JJ =date
  • hh =heures
  • mm =minutes
  • s =secondes
  • p =période (0 =AM, 1 =PM)
  • # =délimiteur

Notez qu'il n'y a pas d'informations sur l'année avec la chaîne d'alarme car nous n'en avons évidemment pas besoin. Par exemple, pour définir mon anniversaire "08:00:00 AM, 28-08", je dois envoyer :

A08240800000# 

Vous pouvez vérifier l'heure de l'alarme à tout moment avec la commande "a" . Une fois l'heure et la date de l'alarme réglées, il est temps de mettre le MCU en veille. L'appareil imprimera donc le message suivant :

Tout est réglé. Veuillez désactiver la broche de réglage de l'heure maintenant. 

Maintenant, vous devez éteindre l'interrupteur de réglage de l'heure, c'est-à-dire tirer sur la broche numérique 3 HAUT (le pull-up 10K le fera). Le système ne dormira pas tant que vous ne l'aurez pas fait. Lorsque l'interrupteur de réglage de l'heure est éteint, l'appareil entrera en mode veille dans 6 secondes et imprimera le message ci-dessous avant lui.

Bravo ! Dormir en 6 secondes.. 

C'est ainsi que vous réglez l'heure et l'alarme. Désormais, chaque fois que vous devez vérifier l'heure ou la mettre à jour, vous pouvez activer l'interrupteur de réglage de la minuterie et le système se réveillera, établira une communication série et vous invitera à envoyer l'heure. Il imprimera le message suivant au réveil,

Série établie. Mise à jour de l'heure de réveil. Prêt à mettre à jour l'heure. 

Si vous vérifiez simplement si l'heure est correcte et que vous ne voulez rien changer, envoyez "c" commande pour annuler l'opération et remettre le système en veille. Vous devez également désactiver le commutateur de réglage de l'heure à ce stade.

Lorsque l'heure actuelle correspond à l'heure de l'alarme, c'est-à-dire. votre anniversaire, le RTC générera un signal d'interruption de 250 mS sur la broche numérique 2 du Nano. Ce signal réveillera le système. Au réveil, l'appareil saura que c'est votre anniversaire et établira une communication série (uniquement si vous avez connecté l'USB) et imprimera le message suivant,

Tada ! C'est ton anniversaire! Joyeux anniversaire  :) Rendez-vous le jour de votre prochain anniversaire ! TC. Au revoir ! Dormir dans 6 secondes. 

Et il fera également clignoter la LED connectée à la broche numérique 13. Voici une capture d'écran du moniteur série Arduino pendant que je testais le système.

C'est ainsi que vous utilisez cet appareil. Pour comprendre cela au niveau du code, lisez la section suivante.

Étape 8 :Coder

Ce projet est entièrement open source et j'ai donc publié le code source du firmware sur mon GitHub à l'adresse https://github.com/vishnumaiea/Birthday-Alarm/ sous licence MIT. Vous êtes libre d'adapter, de modifier et de redistribuer sans aucune restriction. Si vous souhaitez ajouter un backlink à ce projet à partir de votre projet modifié, ce serait apprécié. J'ai bien commenté le code et je l'ai rendu simple dans la mesure du possible.

Nous avons un total de 13 fonctions/procédures dans le code. Ce sont :

1. void setup()

C'est la fonction de configuration de l'Arduino qui initialise tout et définit les registres de configuration de l'ISl1208 RTC.

2. boucle vide()

La fonction de boucle principale.

3. void sleepNow()

Cette fonction met fin à toutes les communications, désactive les périphériques internes du MCU, attache les interruptions aux broches numériques 3 et 2 et met le système en mode veille profonde. Sur n'importe quelle interruption, l'exécution du programme continue à partir de la ligne après sleep_mode() . Notez qu'avant que l'exécution normale du programme ne reprenne, le MCU aurait terminé les routines de service d'interruption associées aux broches d'interruption qui sont alarmInterrupt() et timeUpdateInterrupt()

4. annuler alarmInterrupt()

L'ISR associé à l'INT0 interruption sur la broche numérique 2.

5. void timeUpdateInterrupt()

L'ISR associé à l'INT1 interruption sur la broche numérique 3.

6. void fetchTime()

fetchTime() lit les registres de temps du RTC et imprimera l'heure actuelle sur la console.

7. void blinkLED()

Clignote évidemment les LED.

8. bool établirSerial()

Établit une communication série à l'aide du module USB-série.

9. bool endSerial()

Met fin à la communication série.

10. octet bcdToDec(octet)

Accepte un BCD (chiffres codés binaires) et traduisez-la en valeur décimale correspondante. Nous en avons besoin car le RTC enregistre uniquement, stocke et accepte les valeurs BCD. Nous devons donc effectuer des conversions vers et depuis BCD de temps en temps.

11. octet decToBcd(octet)

Accepte une valeur décimale et la traduit en valeur BCD correspondante.

12. void printTime()

Lit les registres d'heure RTC et imprime l'heure actuelle sur la console lorsque "t" la commande est reçue.

13. void printAlarmTime()

Lit les registres d'alarme RTC et imprime l'heure et la date de l'alarme sur la console lorsque le "a" la commande est reçue.

Étape 9 :Tester

Ce serait la partie la plus intéressante de ce projet où vous saurez comment j'ai fini par fabriquer un appareil qui a fonctionné pendant 50 ans sur une pile bouton ! J'ai d'abord prototype l'ensemble du circuit sur une maquette et finalisé la conception. J'ai utilisé une batterie Li-Ion (3,6 V) à des fins de test afin d'économiser mes toutes nouvelles piles boutons. J'ai utilisé mon Fluke 87 True RMS multimètre pour les mesures de courant. Il a un 0,1 uA précision pour la gamme de micro ampères.

Voyons comment nous pouvons mettre l'Atmega168P en mode veille profonde et réduire considérablement la consommation de courant.

noInterrupts (); //désactive temporairement les interruptions set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Choisissez notre mode de veille préféré :sleep_enable(); // Définir le bit d'activation du sommeil (SE) :ADCSRA =0 ; //désactive l'ADC power_all_disable(); //désactive tous les modules digitalWrite(LED_PIN, LOW); //éteindre la LED pour indiquer les interruptions de sommeil (); //réactiver les interruptions sleep_mode(); //s'endorme  

Comme je l'ai déjà dit, c'est la première fois que j'utilise les modes veille dans un microcontrôleur (MCU) car je n'en ai jamais eu besoin auparavant. La plupart des informations relatives aux modes de veille AVR ont été trouvées dans ce fil de discussion et dans la documentation de la bibliothèque AVR.

L'ATmega168P dispose de cinq modes de veille.

  • SLEEP_MODE_IDLE – moins d'économies d'énergie
  • 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 courant. 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 :)

Code

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

Schémas

Schematic of Arduino clone.

Processus de fabrication

  1. Industrie 4.0 et IoT :tendances du marché pour les prochaines années
  2. 10 facteurs pour trouver le commutateur parfait pour votre application
  3. NVIDIA :ordinateur AI CUDA-X qui exécute tous les modèles AI
  4. Kontron :commutateur Ethernet 40 Gigabit pour une utilisation dans des environnements difficiles
  5. Pour les cybercriminels, COVID est le cadeau qui continue de donner
  6. 7 signes qui montrent qu'il est temps de mettre à niveau le générateur
  7. 3 signes qui indiquent qu'il est temps de rembobiner le moteur
  8. Pratiques permettant un assemblage de PCB sans faille
  9. Il y a un robot pour ça !