Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Geburtstagserinnerung, die 50 Jahre läuft

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
Chinesische Klone von Nano oder Mini mit ATmega168P-AU
× 1
Intersil ISL1208 RTC
× 1
Renata CR2450N Knopfzelle
× 1
CP2102 USB-zu-Seriell-Modul
× 1
USBasp-Programmierer
× 1
32.768 KHz Quarz
× 1
SPST-Schalter
× 1
SMD-LEDs
× 1
Klare LED-Kuppel
× 1
4" x 4" Schaltkasten
Oder Sie können ein Gehäuse in 3D drucken.
× 1
Perfboard
× 1
Berg Connectors (sowohl M als auch F)
× 1
Widerstand 4,75 kOhm
× 3
Widerstand 10k Ohm
× 2

Notwendige Werkzeuge und Maschinen

Dremel
Lötkolben (generisch)

Apps und Onlinedienste

ProgISP
Um Sicherungen und Blitz zu programmieren.
Arduino-IDE

Über dieses Projekt

Ja, Sie haben den Titel richtig gelesen. Haben Sie schon einmal Ihren Geburtstag vergessen und brauchen jemanden, der Sie daran erinnert? Oder wie wäre es, wenn Sie jemandem, den Sie lieben, ein Gerät schenken könnten, das ihm 50 Mal zum Geburtstag gratuliert? ? Ich mache keine Witze, dieser einfache Arduino-betriebene Geburtstagsalarm das auf einer einzelnen CR2450-Knopfzelle läuft können Ihren Lieben (oder sich selbst) 50 Jahre lang alles Gute zum Geburtstag wünschen, bevor die Batterie leer ist.

Ich glaube, dies ist das erste Mal, dass jemand einen solchen Geburtstagsalarm macht, weil ich versucht habe, nach ähnlichen Projekten zu suchen, aber nichts gefunden habe. Dieses Projekt ist auch auf meiner persönlichen Projekt-Website verfügbar unter - https://www.vishnumaiea.in/projects/hardware/birthday-reminder-device-that-will-run-for-50-years-on-a-coin- Zelle

Ich habe dies im Rahmen der Hackaday Coin Cell Challenge gebaut. Diese Sache mit dem Geburtstagsalarm kam mir einfach in den Sinn und ich begann zu recherchieren, wie lange wir etwas mit einer Knopfzelle betreiben können. Ich habe noch nie die Schlafmodi von Mikrocontrollern verwendet. Also musste ich alles darüber lernen, wie man MCUs mit wahnsinnig niedrigen Strömen laufen lässt und jedes bisschen Energie aus einer Zelle spart. Es war wirklich eine Herausforderung! Ich habe ATmega168P als Mikrocontroller verwendet (eigentlich habe ich einen Arduino Nano mit ATmega168P modifiziert, indem ich alle unerwünschten Komponenten wie den Spannungsregler, die USB-Brücke usw. entfernt habe) und die Arduino IDE verwendet, um die Firmware zu entwickeln.

Die Uhrzeit und das Geburtstagsdatum können über einen seriellen Monitor über USB programmiert werden. Sobald die Uhrzeit und der Alarm eingestellt sind, geht die MCU in den Schlafmodus. Wenn die aktuelle RTC-Zeit jedes Jahr mit Ihrem Geburtstag übereinstimmt, blinkt die LED eine Minute lang und druckt eine Geburtstagsnachricht auf dem seriellen Monitor aus. Der durchschnittliche Stromverbrauch beträgt ca. 1,2 uAh (einschließlich Selbstentladung), was einen Betrieb über 50 Jahre mit einer CR2450 (540mAh) Lithium-Knopfzelle ermöglicht.

Funktionen

  • Ungefähr 1,22 uAh durchschnittliche Stromaufnahme inklusive Zellenselbstentladung (608 nA ohne Berücksichtigung der Selbstentladung, gemessen mit einem Amperemeter, an der Zelle CR2450N)
  • Die tatsächlichen Betriebszeiten der verschiedenen Arten von Lithium-Knopfzellen sind:>29 Jahre auf CR2023 (225 mAh), >50 Jahre auf CR2450N (540 mAh) und >64 Jahre auf CR2477N (950 mAh). [tatsächliche Betriebszeit hängt vom physikalischen und chemischen Zustand der Batterie über den Zeitraum ab]
  • Der Geburtstag kann über eine beliebige serielle Monitorsoftware über USB mit einfachen Befehlen eingestellt und aktualisiert werden.
  • Dedizierter Zeiteinstellungsschalter ermöglicht das Einstellen, Anzeigen und Aktualisieren der Zeit, wann immer Sie möchten.
  • Die Zeiteinstellung per Software bedeutet, dass sie mit einer auf einem Computer ausgeführten App ziemlich genau eingestellt werden kann (eine Zeiteinstellungs-/Synchronisierungssoftware basierend auf Verarbeitung ist in Entwicklung)
  • Open Source - alle Designdateien und Softwarecodes stehen mit ausführlicher Dokumentation und hochauflösenden Bildern zum Download bereit.

Jetzt werde ich Sie durch die Anweisungen zum Aufbau führen und Ihnen den tatsächlichen Stromverbrauchstest zeigen.

Schritt 1:Ändern des Arduino Nano

Für dieses Projekt können Sie einen nackten Mikrocontroller oder einen Arduino Nano verwenden oder Mini Bretter. Alles, was erforderlich ist, ist, dass wir es mit einem internen Oszillator (1MHz) und einem vollen Betriebsbereich von 1,8 - 5 V betreiben müssen. Der CR2450 oder ähnliche Lithiumzellen haben eine Nennspannung von 3V, sodass wir die MCU ohne Spannungsregler betreiben können. Chinesische Klone oder Nano und Mini sind extrem günstig, dass man sie zum Chippreis kaufen kann! Ich habe einen solchen Nano-Klon verwendet, der CH340G hat als USB-zu-Seriell-Brücke. Unten ist die, die ich verwendet habe.

Ich hatte sowohl ATmega168 als auch 328 Versionen. Ich habe die 168er Versionen vor einigen Jahren aus Versehen gekauft (jetzt habe ich eine Verwendung dafür gefunden). In diesem speziellen Board müssen Sie entfernen,

  • Der USB-zu-Seriell-Brücken-IC, hier der CH340G.
  • Die Shchottky-Diode, die an USB 5V angeschlossen ist.
  • Zwei 1K-Widerstände, die mit den TX- und RX-Pins des CH340G verbunden sind.
  • RX-, TX- und PWR-LEDs (SMD)
  • Der AMS1117 5V Spannungsregler.

Ich habe die LED an Pin 13 zum Debuggen und als Hauptblinker verwendet und sie daher nicht entfernt. Die Kondensatoren müssen nicht entfernt werden, da sie das Rauschen dämpfen. Sobald der Regler entfernt ist, müssen Sie die Pads des Spannungsreglers wie in der Abbildung gezeigt kurzschließen. Dies ist auf das Routing zurückzuführen, das im PCB-Design verwendet wird. Entfernen Sie den Quarzoszillator der MCU noch nicht, da wir ihn zum Ändern der Sicherungsbits benötigen. Die MCUs haben die standardmäßigen Arduino-Bootloader- und Sicherungseinstellungen, die sie mit einem externen 16-MHz-Kristall ausführen. Wenn wir den Quarz entfernen, bevor wir die Sicherung für die Verwendung des internen OSC einstellen, können wir den Chip einfach nicht mit einem ISP-Programmierer programmieren. Unten ist die modifizierte Version des Arduino Nano.

Schritt 2:Ändern der Sicherungsbits von ATmega168P

Normalerweise werden die Chips auf den Arduino-Platinen mit dem Arduino-Bootloader und den Sicherungsbits geliefert. Wir müssen dies ändern, um die MCU im Energiesparmodus zu betreiben. Um dies zu erreichen, müssen wir

  • Lassen Sie die MCU mit 1 MHz laufen. Wir können den internen Oszillator und auch das "Divide by 8"-Bit aktivieren, um 1MHz-Takt aus den 8MHz zu erzeugen. Weniger Taktfrequenz, geringer wird der Stromverbrauch sein. Wir werden hier keine Zahlen berechnen, also ist 1MHz mehr als genug.
  • Deaktivieren Sie das Brown-out-Erkennungsmodul (BOD).
  • Deaktivieren Sie alle internen Module wie ADC, Timer usw. Wir werden dies in der Software tun.
  • Deaktiviere den Watchdog-Timer (WDT).
  • Machen Sie alle IO-Pins als Eingänge und LOW außer den Pins 13, 2 und 3.

Oben sind die Sicherungseinstellungen für ATmega168P. Beachten Sie, dass Sie die "P"-Versionen der ATmega-Chips benötigen, da sie über die Pico-Power-Funktion verfügen. Die normalen Versionen (nicht P) unterstützen diese zusätzlichen Energiesparmodi nicht. Stellen Sie also sicher, dass Sie die P-Versionen erhalten. Sie fragen sich jetzt vielleicht, warum ich 168 anstelle von 328 verwende. Das liegt daran, dass 328 beim Testen der Schaltung ungefähr 30uA für denselben Code und dieselbe Einstellung zu verbrauchen schien, die ich für 168 verwendet habe, die nur ungefähr 2uA verbraucht. Ich weiß nicht, warum das so ist. Wie ich schon sagte, dies ist das erste Mal, dass ich mit Energiesparmodi wie dem Tiefschlaf herumfummele. Also könnte mir etwas fehlen. Wenn Sie etwas darüber wissen, lassen Sie es mich bitte in den Kommentaren wissen.

Um die Sicherungsbits zu ändern, benötigen wir einen ISP-Programmierer. Es gibt viele ISP-Programmierer und kompatible Software. Ich habe den USBasp verwendet als Programmierer und ProgISP als Programmiersoftware. Die Chip-ID oder Signatur des von mir verwendeten ATega168P-AU ist 1E940B . Dies kann sich je nach Version ändern. So ändern Sie die Sicherungsbits:

  • Verbinden Sie den USBasp mit Nano. Normalerweise hat USBasp einen 10-Pin-Anschluss, aber Nano hat einen 6-Pin-ISP-Header. Also habe ich einen einfachen 10-Pin-zu-6-Pin-Adapter gemacht. Möglicherweise müssen Sie etwas Ähnliches herstellen oder ein Kabel finden.
  • Wählen Sie das MCU-Modell aus der Liste aus und überprüfen Sie die Signatur mit dem RD Taste.
  • Setzen Sie die Kontrollkästchen und Sicherungsbits wie in der Abbildung unten gezeigt und verwenden Sie die Auto oder Schreiben Schaltfläche im Sicherungseinstellungsfenster, um die Sicherungsbits zu aktualisieren.

Bei Erfolg wird eine Nachricht an die Konsole ausgegeben. Von nun an benötigen Sie den ISP, um die MCU zu flashen. Unten ist der USBasp, den ich verwendet habe.

Schritt 3:Kompilieren und Hochladen

Nachdem wir nun die Fuse-Bits unseres Mikrocontrollers geändert haben, müssen wir auch der Arduino-Software und dem Compiler die von uns vorgenommenen Änderungen mitteilen, damit wir den Code innerhalb der Arduino-IDE richtig kompilieren können. Dazu fügen wir eine benutzerdefinierte Board-Definition in der "boards.txt" hinzu Datei, die sich im Arduino-Installationsverzeichnis befindet, das sich normalerweise unter /Arduino/hardware/arduino/avr/boards.txt befindet" auf Windows-Systemen. Dies kann je nach Betriebssystem oder IDE-Version für Sie unterschiedlich sein. Ich verwende die IDE-Version 1.8.5

Sobald wir die Datei board.txt gefunden haben, müssen Sie eine benutzerdefinierte Definition eines neuen Arduino Pro Mini . hinzufügen Gremium. Um die Linie 655 herum werden die bestehenden Pro Mini-Board-Definitionen beginnen. Es wird viele Versionen der Boards geben. Also müssen wir eine neue Variante hinzufügen. Fügen Sie die folgende Definition hinzu und speichern Sie.

## Arduino Pro oder Pro Mini (3.3V, 1 MHz) mit 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.zamenu.cpu.1MH .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.menu.cpu.1MHzatcu .menu.cpu.1MHzatmega168.build.f_cpu=1000000L  

Und hier ist ein Screenshot.

Sie müssen die board.txt bearbeiten, während das Arduino nicht läuft. Sobald Sie die neue Datei board.txt speichern und Arduino IDE neu starten, sehen Sie das neue Board, das wir gerade in der Liste hinzugefügt haben. Sehen Sie sich die Screenshots unten an.

Jetzt sind wir bereit, Arduino-Codes für unser neues Board zu kompilieren. Da wir den Arduino Bootloader (BL) nicht verwenden , müssen wir eine Hex-Datei des Programms erstellen und USBasp und ProgISP verwenden, um den Mikrocontroller zu flashen. Wir können dies mit "Kompilierte Binärdatei exportieren" Option aus dem Sketch-Menü der IDE oder drücken Sie Strg + Alt + S . Wenn wir das tun, werden zwei Hex-Dateien (Intel-Format) wird im selben Verzeichnis erstellt, in dem sich unsere Skizze befindet. Eine Hex-Datei ist mit BL und die andere ist ohne BL.

Sobald wir die Hex-Datei haben, wählen Sie im ProgISP Flash laden Option zum Laden der Hex-Datei, mit der wir die MCU flashen möchten, und klicken Sie dann auf Auto Taste. Wenn das Hochladen erfolgreich war, wird es auf der Konsole des ProgISP gedruckt.

Schritt 4:Intersil ISL1208 I2C RTC

Der Intersil ISL1208 ist ein Low-Power-RTC-Chip mit I2C-Schnittstelle. Es verwendet einen externen 32,768 KHz Quarz, um die Zeit zu verfolgen. Hat Monat-Datum-Stunde-Minute-Sek Alarmregister. Es verbraucht nur etwa 400 nA bei VBAT-Betrieb und maximal 1,2 µA bei VDD. Die Betriebsspannung beträgt 1,8 V bis 5,5 V. Was ihn zu einem guten Kandidaten macht, sind der Stromverbrauch und die Monat-Datums-Alarmfunktion. Normale RTCs wie DS1307 haben keine Monatseinstellung im Alarmregister, ohne die wir nicht jedes Jahr einen Geburtstagsalarm generieren können. Es hat einen Interrupt-Ausgangspin, der 250 mS . erzeugt aktives LOW-Signal, wenn die aktuelle Uhrzeit mit Datum und Uhrzeit des Alarms übereinstimmt. Wir verwenden dies, um die MCU aus dem Schlafmodus aufzuwecken, was ich weiter unten erläutern werde.

Funktionen von ISL1208

  • Echtzeituhr/Kalender
  • -Zeigt die Zeit in Stunden, Minuten und Sekunden an
  • - Wochentag, Tag, Monat und Jahr
  • 15 wählbare Frequenzausgänge
  • Einzelalarm
  • - Einstellbar auf Sekunde, Minute, Stunde, Wochentag, Tag oder Monat
  • - Einzelereignis- oder Pulsunterbrechungsmodus
  • Automatische Sicherung auf Batterie oder Superkondensator
  • Stromausfallerkennung
  • On-Chip-Oszillatorkompensation
  • 2 Bytes batteriegepufferter Benutzer-SRAM
  • I2C-Schnittstelle
  • - 400 kHz Datenübertragungsrate
  • 400 nA Batterieversorgungsstrom
  • Gleiche Pinbelegung wie bei ST M41Txx- und Maxim DS13xx-Geräten

Da ich eine SMD-Version des ISL1208 hatte, musste ich ein Breakout-Board machen, um es auf mein Mainboard zu stecken. Unten ist, was ich gemacht habe.

Schritt 5:CR2450N Knopfzelle

Spezifikationen

  • Chemisches System - Li / MnO2 (gemäß IEC 60086)
  • Nennspannung - 3 V
  • Nennkapazität - 540 mAh
  • Standard-Entladestrom - 0,8 mA
  • Max. Forts. Entladestrom - 3,0 mA
  • Durchschnittsgewicht - 5,9 g
  • Betriebstemperatur* - -40 - +85 °C
  • Selbstentladung bei 23°C - <1% / Jahr
  • Haltbarkeit - bis zu 10 Jahre

Schritt 6:Schema

Verwenden Sie das obige Schema, um die Module auf einem Perfboard zu löten. Die beiden 4,7K-Widerstände sind die I2C-Pull-ups . Die Werte können von 3,3K bis über 5,6K reichen. R2 und R3 sind Pull-Ups für die Interrupt-Pins. Arduino Nano hat zwei Hardware-Interrupt-Pins - Digital-Pin 3 und 2. Digital-Pin 2 wird für den Alarm-Weck-Interrupt von der RTC verwendet und digitaler Pin 3 wird verwendet, um die MCU aufzuwecken, wenn Sie die Zeit einstellen müssen. Unten ist der CP2102 USB-to-Serial-Modul, das ich verwendet habe.

Das USB-to-Serial-Modul wird verwendet, um über den seriellen Monitor zu kommunizieren. Die RX- und TX-Pins von CP2102 sind jeweils mit RX- und TX-Pins von Nano verbunden. Beachten Sie, dass Sie die +5V vom USB nicht an die VCC-Hauptspannung anschließen sollten.

Schritt 7:Wie funktioniert es?

Die Funktionsweise des Gerätes ist eigentlich recht einfach. Sehen wir uns an, wie der Hauptalgorithmus funktioniert,

  • Stellen Sie die aktuelle Uhrzeit der Echtzeituhr über den seriellen Monitor ein.
  • Stellen Sie die Uhrzeit und das Datum des Weckalarms auf der Echtzeituhr ein.
  • Die MCU geht in den Schlafmodus, nachdem die Zeit und der Alarm eingestellt wurden, indem die internen Peripheriegeräte einschließlich Timer und ADC deaktiviert werden.
  • Wenn die aktuelle Zeit mit Datum und Uhrzeit des Alarms übereinstimmt (MM, DD, hh, mm, ss, p), generiert und unterbricht die RTC die MCU und weckt sie aus dem Ruhezustand auf.
  • Nach dem Aufwachen aktiviert die MCU die erforderlichen internen Peripheriegeräte und druckt eine Geburtstagsnachricht auf dem seriellen Monitor aus. Außerdem blinkt die LED in der Kuppel in einem bestimmten Muster.
  • Nachdem wir Ihnen alles Gute zum Geburtstag gewünscht haben, wechselt die MCU wieder in den Schlafmodus und wacht erst an Ihrem Geburtstag im nächsten Jahr auf.
  • Aber Sie können die Uhrzeit sehen und bei Bedarf aktualisieren, indem Sie den Zeitaktualisierungsschalter betätigen EIN.

Beim ersten Einschalten sind alle RTC-Register Null und es wird nicht inkrementiert, bis wir zum ersten Mal in eines von ihnen schreiben. Um die Uhrzeit der Echtzeituhr einzustellen,

  • Schalten Sie den Zeitaktualisierungsschalter auf ON (verbinden Sie den digitalen Pin 3 mit GND). Wir können keine Zeit einstellen, ohne den Pin 3 LOW zu ziehen.
  • Schließen Sie das Gerät zuerst mit einem USB-Kabel an Ihren Computer an. Auf Ihrem PC wird ein COM-Port eingerichtet, um zu kommunizieren.
  • Suchen Sie den COM-Port des Geräts im Gerätemanager.
  • Öffnen Sie eine beliebige serielle Monitorsoftware oder einen seriellen Arduino-Monitor mit dem COM-Port des Geräts.

Die MCU druckt die folgende Nachricht auf dem seriellen Monitor aus.

Seriell eingerichtet.Bereit zum Aktualisieren der Zeit. 
  • Sende "t" Befehl druckt die aktuelle Uhrzeit, "a" druckt Datum und Uhrzeit des Alarms und "c" bricht die Zeiteinstellung ab und versetzt die MCU nach 6 Sekunden in den Schlafmodus.
  • Sie müssen die aktuelle Uhrzeit im unten gezeigten Format senden,
TYYMMDDhhmmssp# 

Wo:

  • T =zeigt Zeitinformationen an
  • JJ =niedrigstwertige Ziffern eines Jahres (z. B. 18 für 2018, Bereich von 00 bis 99)
  • MM =Monat (z. B. 01 für Januar, Bereich ist 01 bis 12)
  • DD =Datum (zB 24, Bereich ist 01 bis 31)
  • hh =Stunden (z. B. 06, Bereich ist 01 bis 12 für das 12-Stunden-Format)
  • mm =Minuten (z. B. 55, Bereich ist 00 bis 59)
  • ss =Sekunden (z. B. 30, Bereich ist 00 bis 59)
  • p =Tageszeit für das 12-Stunden-Format (0 =AM, 1 =PM)
  • # =Trennzeichen

Um beispielsweise Uhrzeit und Datum "08:35:12 AM, 05-01-2018" einzustellen, sollten wir Folgendes senden:

T1801050835120# 

Zum Gerät, wo:

  • T =zeigt Zeitinformationen an
  • 18 =das Jahr 2018
  • 01 =Monat Januar
  • 05 =Datum
  • 08 =Stunden
  • 35 =Minuten
  • 12 =Sekunden
  • 0 =AM
  • # =Trennzeichen

Wenn der Vorgang erfolgreich ist, druckt die MCU die empfangene Zeit an die Konsole als:

Zeitaktualisierung empfangen =T1801050835120 Datum und Uhrzeit ist 8:35:12, 5-1-18 

Wenn die von Ihnen eingegebene Zeitzeichenfolge ungültig ist, wird die folgende Nachricht gedruckt:

Ungültige Zeiteingabe - ,  

Sobald Sie die Zeit erfolgreich eingestellt haben, wird die RTC sie so lange verfolgen, wie ihr Strom zur Verfügung steht. Sie können die gerade eingestellte Zeit überprüfen, indem Sie das "t" . senden Befehl. Das Einstellen des Alarms ist ähnlich, außer dass das Datenformat anders ist. Um den Alarm einzustellen, müssen Sie ihn senden als:

AMMDDhhmmssp# 

Wo:

  • A =zeigt Alarminformationen an
  • MM =Monat
  • DD =Datum
  • hh =Stunden
  • mm =Minuten
  • ss =Sekunden
  • p =Zeitraum (0 =AM, 1 =PM)
  • # =Trennzeichen

Beachten Sie, dass die Alarmzeichenfolge keine Jahresangabe enthält, da wir sie offensichtlich nicht benötigen. Um beispielsweise meinen Geburtstag "08:00:00 AM, 28-08" festzulegen, muss ich Folgendes senden:

A08240800000# 

Sie können die Weckzeit jederzeit mit dem Befehl "a" überprüfen . Sobald die Weckzeit und das Datum eingestellt sind, ist es an der Zeit, die MCU in den Ruhezustand zu versetzen. Das Gerät druckt also die folgende Nachricht:

Alles ist vorbereitet. Bitte deaktivieren Sie jetzt den Zeiteinstellungs-Pin. 

Jetzt müssen Sie den Zeiteinstellschalter ausschalten, dh den digitalen Pin 3 HIGH ziehen (der 10K-Pull-up erledigt das). Das System wird nicht schlafen, bis Sie dies tun. Wenn der Zeiteinstellschalter ausgeschaltet ist, wechselt das Gerät nach 6 Sekunden in den Schlafmodus und druckt die folgende Nachricht davor.

Gut gemacht! Schlafen in 6 Sekunden.. 

So stellen Sie die Uhrzeit und den Wecker ein. Wann immer Sie die Uhrzeit überprüfen oder aktualisieren müssen, können Sie den Timer-Einstellschalter einschalten und das System wird aufwachen, eine serielle Kommunikation aufbauen und Sie auffordern, die Uhrzeit zu senden. Beim Aufwachen wird die folgende Nachricht gedruckt:

Seriell eingerichtet.Zeitaktualisierung Aufwachen.Bereit zum Aktualisieren der Zeit. 

Wenn Sie nur überprüfen möchten, ob die Uhrzeit korrekt ist, und nichts ändern möchten, senden Sie "c" Befehl, um den Vorgang abzubrechen und das System wieder in den Ruhezustand zu versetzen. Sie müssen an dieser Stelle auch den Zeiteinstellungsschalter deaktivieren.

Wenn die aktuelle Uhrzeit mit der Weckzeit übereinstimmt, z. an Ihrem Geburtstag erzeugt die RTC ein 250-mS-Interrupt-Signal an den digitalen Pin 2 des Nano. Dieses Signal weckt das System auf. Beim Aufwachen weiß das Gerät, dass Sie Geburtstag haben und stellt eine serielle Kommunikation her (nur wenn Sie den USB angeschlossen haben) und druckt die folgende Nachricht:

Tada! Es ist dein Geburtstag! Happy B'Day  :) Bis zu Ihrem nächsten Geburtstag! TC. Tschüss! Einschlafen in 6 Sekunden.. 

Und es blinkt auch die LED, die mit dem digitalen Pin 13 verbunden ist. Hier ist ein Screenshot des seriellen Arduino-Monitors, während ich das System testete.

So bedienen Sie dieses Gerät. Um dies auf Codeebene zu verstehen, lesen Sie den nächsten Abschnitt.

Schritt 8:Code

Dieses Projekt ist komplett Open Source und daher habe ich den Quellcode für die Firmware auf meinem GitHub unter https://github.com/vishnumaiea/Birthday-Alarm/ unter MIT-Lizenz veröffentlicht. Sie können ohne Einschränkungen anpassen, modifizieren und weitergeben. Wenn Sie diesem Projekt einen Backlink von Ihrem modifizierten hinzufügen würden, wäre das willkommen. Ich habe den Code gründlich kommentiert und, wo immer möglich, geradlinig gemacht.

Wir haben insgesamt 13 Funktionen/Prozeduren im Code. Sie sind:

1. void setup() 

Dies ist die Setup-Funktion des Arduino, die alles initialisiert und die Konfigurationsregister des ISl1208 RTC setzt.

2. Leere Schleife() 

Die Hauptschleifenfunktion.

3. void sleepNow() 

Diese Funktion beendet alle Kommunikationen, deaktiviert die internen Peripheriegeräte der MCU, verbindet die Interrupts mit den digitalen Pins 3 und 2 und versetzt das System in den Tiefschlafmodus. Bei jedem Interrupt wird die Programmausführung ab der Zeile nach sleep_mode() . fortgesetzt . Beachten Sie, dass die MCU die Interrupt-Service-Routinen abgeschlossen hat, die den Interrupt-Pins zugeordnet sind, die alarmInterrupt() . sind, bevor diese normale Programmausführung wieder aufgenommen wird und timeUpdateInterrupt()

4. void alarmInterrupt() 

Der mit dem INT0 . verknüpfte ISR Interrupt auf digitalem Pin 2.

5. void timeUpdateInterrupt() 

Der mit dem INT1 . verknüpfte ISR Interrupt an digitalem Pin 3.

6. void fetchTime() 

fetchTime() liest die Zeitregister der RTC und gibt die aktuelle Uhrzeit an die Konsole aus.

7. void blinkLED() 

Blinkt die LEDs deutlich.

8. bool EstablishSerial() 

Stellt eine serielle Kommunikation mit Hilfe des USB-to-Serial-Moduls her.

9. bool endSerial() 

Beendet die serielle Kommunikation.

10. Byte bcdToDec(Byte) 

Akzeptiert ein BCD (Binary Coded Digits) Wert und übersetzen Sie ihn in den entsprechenden Dezimalwert. Wir brauchen dies, weil die RTC nur BCD-Werte speichert und akzeptiert. Daher müssen wir gelegentlich zu und von BCD konvertieren.

11. byte decToBcd(byte) 

Akzeptiert einen Dezimalwert und übersetzt ihn in den entsprechenden BCD-Wert.

12. void printTime() 

Liest die RTC-Zeitregister und druckt die aktuelle Uhrzeit an die Konsole, wenn "t" Befehl wird empfangen.

13. void printAlarmTime() 

Liest die RTC-Alarmregister und druckt die Alarmzeit und das Alarmdatum an die Konsole, wenn das "a" Befehl wird empfangen.

Schritt 9:Testen

Dies wäre der interessanteste Teil dieses Projekts, in dem Sie erfahren werden, wie ich dazu gekommen bin, ein Gerät zu bauen, das 50 Jahre lang auf einer Knopfzelle läuft! Ich habe zuerst die gesamte Schaltung auf einem Steckbrett protypisiert und das Design fertiggestellt. Ich habe zu Testzwecken eine Li-Ion-Batterie (3,6 V) verwendet, um meine brandneuen Knopfzellen zu retten. Ich habe mein Fluke 87 True RMS verwendet Multimeter für die aktuellen Messungen. Es hat einen 0,1 uA Präzision für den Mikroamperebereich.

Mal sehen, wie wir den Atmega168P in den Tiefschlafmodus versetzen und den Stromverbrauch drastisch reduzieren können.

noInterrupts(); // Interrupts vorübergehend deaktivieren set_sleep_mode (SLEEP_MODE_PWR_DOWN); // Wählen Sie unseren bevorzugten Schlafmodus:sleep_enable(); // Schlaffreigabe-Bit (SE) setzen:ADCSRA =0; // ADC deaktivieren power_all_disable (); // deaktiviert alle Module digitalWrite (LED_PIN, LOW); // LED ausschalten, um Schlafunterbrechungen anzuzeigen (); // Interrupts wieder aktivieren sleep_mode (); // geht schlafen  

Wie ich bereits sagte, habe ich zum ersten Mal Schlafmodi in einem Mikrocontroller (MCU) verwendet, da ich ihn noch nie zuvor benötigt habe. Die meisten Informationen zu den AVR-Schlafmodi finden Sie in diesem Forenthread und in der Dokumentation zur AVR-Bibliothek.

ATmega168P has five sleep modes.

  • SLEEP_MODE_IDLE – least power savings
  • 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 Strom. 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

Schaltpläne

Schematic of Arduino clone.

Herstellungsprozess

  1. Industrie 4.0 und das IoT:Markttrends für die nächsten Jahre
  2. 10 Faktoren, um den perfekten Schalter für Ihre Anwendung zu finden
  3. NVIDIA:CUDA-X-KI-Computer, auf dem alle KI-Modelle ausgeführt werden
  4. Kontron:40-Gigabit-Ethernet-Switch für den Einsatz in rauen Umgebungen
  5. Treffen Sie dieses Lager nicht! Die richtige Anleitung für die Kaltmontage
  6. Für Cyberkriminelle ist COVID das Geschenk, das uns immer wieder gibt
  7. 7 Anzeichen dafür, dass es Zeit für ein Generator-Upgrade ist
  8. 3 Zeichen, die darauf hinweisen, dass es Zeit für das Zurückspulen des Motors ist
  9. Praktiken, die für eine fehlerfreie Leiterplattenmontage sorgen
  10. Dafür gibt es einen Roboter!