工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

50年間続く誕生日のリマインダー

コンポーネントと消耗品

>
Arduino Nano R3
ATmega168P-AUを使用したNanoまたはMiniの中国のクローン
× 1
Intersil ISL1208 RTC
× 1
RenataCR2450Nコイン電池
× 1
CP2102USBからシリアルモジュール
× 1
USBaspプログラマー
× 1
32.768KHzクリスタル
× 1
SPSTスイッチ
× 1
SMD LED
× 1
クリアLEDドーム
× 1
4 "x4"スイッチボックス
または、エンクロージャーを3Dプリントすることもできます。
× 1
Perfboard
× 1
Bergコネクタ(MとFの両方)
× 1
抵抗4.75kオーム
× 3
抵抗10kオーム
× 2

必要なツールとマシン

Dremel
はんだごて(汎用)

アプリとオンラインサービス

ProgISP
ヒューズとフラッシュをプログラムします。
Arduino IDE

このプロジェクトについて

<図>

<図>

<図>

はい、あなたはタイトルを正しく読みました。あなたはあなたの誕生日を忘れたことがありますか、あなたはそれについてあなたに思い出させるために誰か他の人が必要だと思いますか?または、愛する人にギフトを贈ることができるとしたら、誕生日に 50回その人にプレゼントを贈ることができます。 ?このシンプルな Arduino搭載のバースデーアラーム 単一のCR2450コイン電池で動作します バッテリーがなくなる前に、あなたの愛する人(またはあなた自身)に50年間お誕生日おめでとうを願うことができます。

似たようなプロジェクトを探してみたが何も見つからなかったので、こんな誕生日アラームを出すのは初めてだと思います。このプロジェクトは、私の個人的なプロジェクトのWebサイト(https://www.vishnumaiea.in/projects/hardware/birthday-reminder-device-that-will-run-for-50-years-on-a-coin-)でも入手できます。セル

私はこれをHackadayCoin CellChallengeの一部として作成しました。この誕生日の警告が頭に浮かんだので、私はコイン電池で何かを実行できる時間を調べ始めました。これまで、マイクロコントローラーのスリープモードを使用したことはありません。そのため、MCUをめちゃくちゃ低い電流で実行し、セルからすべてのエネルギーを節約する方法についてすべてを学ぶ必要がありました。本当にチャレンジでした!マイクロコントローラーとしてATmega168Pを使用し(実際には、電圧レギュレーター、USBブリッジなどの不要なコンポーネントをすべて削除して、ATmega168Pを搭載したArduino Nanoを変更しました)、ArduinoIDEを使用してファームウェアを開発しました。

時刻と誕生日は、USB経由のシリアルモニターを介してプログラムできます。時間とアラームが設定されると、MCUはスリープモードになります。現在のRTC時刻が毎年あなたの誕生日と一致すると、LEDが1分間点滅し、お誕生日おめでとうメッセージをシリアルモニターに出力します。平均消費電流は約1.2uAh(自己放電を含む)であり、CR2450(540mAh)リチウムコイン電池で50年以上動作させることができます。

機能

  • 1.22 uAh あたり セルの自己放電を含む平均消費電流( 608 nA セルCR2450Nでの電流計による自己放電を考慮せずに)
  • さまざまな種類のリチウムコイン電池の実際の動作時間は次のとおりです:> 29 CR2023(225 mAh)での年数、> 50 CR2450N(540 mAh)での年数、および> 64 CR2477N(950mAh)で何年も。 [実際の動作時間は、期間中のバッテリーの物理的および化学的状態によって異なります]
  • 誕生日は、簡単なコマンドでUSB経由の任意のシリアルモニターソフトウェアを介して設定および更新できます。
  • 専用の時間設定スイッチを使用すると、いつでも時間を設定、表示、更新できます。
  • 時間のソフトウェア設定とは、コンピューターで実行されているアプリでかなり正確に設定できることを意味します(処理に基づく時間設定/同期ソフトウェアは開発中です)
  • オープンソース-すべての設計ファイルとソフトウェアコードは、詳細なドキュメントと高解像度の画像とともにダウンロードできます。

次に、これを作成する方法について説明し、実際の消費電流テストを示します。

ステップ1:ArduinoNanoを変更する

このプロジェクトでは、ベアマイクロコントローラーを使用するか、 Arduino Nano を使用できます またはミニ ボード。必要なのは、内部発振器(1MHz)を使用し、1.8〜5Vの全動作範囲で実行する必要があることだけです。 CR2450 または同様のリチウム電池の公称電圧は3Vであるため、電圧レギュレーターを使用せずにMCUを実行できます。中国のクローンやNanoとMiniは非常に安いので、チップの価格で購入できます。 CH340G のようなNanoクローンを使用しました USBからシリアルへのブリッジとして。以下は私が使用したものです。

<図>

<図>

ATmega168と328の両方のバージョンがありました。数年前に誤って168バージョンを購入しました(今ではその用途を見つけました)。この特定のボードでは、削除する必要があります

  • ここではCH340GであるUSBからシリアルへのブリッジIC。
  • USB5Vに接続されているShchottkyダイオード。
  • CH340GのTXピンとRXピンに接続された2つの1K抵抗。
  • RX、TX、およびPWR LED(SMD)
  • AMS11175V電圧レギュレータ。

ピン13のLEDをデバッグ用とメインフラッシャーとして使用したので、取り外しませんでした。コンデンサはノイズを減衰させるのに役立つため、取り外す必要はありません。レギュレーターを取り外したら、画像に示すように、電圧レギュレーターのパッドを短絡する必要があります。これは、PCB設計で使用されているルーティングによるものです。ヒューズビットを変更するために必要になるため、MCUの水晶発振器はまだ取り外さないでください。 MCUには、デフォルトのArduinoブートローダーとヒューズ設定があり、外部の16MHzクリスタルで動作します。内部OSCを使用するようにヒューズを設定する前に水晶を取り外すと、ISPプログラマーでチップをプログラムすることができなくなります。以下は、ArduinoNanoの修正バージョンです。

<図>

<図>

ステップ2:ATmega168Pのヒューズビットを変更する

通常、Arduinoボードのチップには、Arduinoブートローダーとヒューズビットが付属しています。低電力モードでMCUを実行するには、これを変更する必要があります。これを達成するには、次のことを行う必要があります。

  • MCUを1MHzで実行します。内部発振器と「8分周」ビットを有効にして、8MHzから1MHzのクロックを生成することができます。クロック速度が低いほど、消費電力は少なくなります。ここでは数値を計算することはないので、1MHzで十分です。
  • 電圧低下検出(BOD)モジュールを無効にします。
  • ADC、タイマーなどのすべての内部モジュールを無効にします。これはソフトウェアで行います。
  • ウォッチドッグタイマー(WDT)を無効にします。
  • ピン13、2、3を除くすべてのIOピンを入力してLOWにします。
<図>

上記はATmega168Pのヒューズ設定です。 ATmegaチップにはピコパワー機能があるため、「P」バージョンが必要であることに注意してください。通常のバージョン(P以外)は、これらの追加の省電力モードをサポートしていません。したがって、必ずPバージョンを入手してください。なぜ328ではなく168を使用しているのか不思議に思うかもしれません。これは、回路をテストしたときに、328が同じコードで約30uAを消費し、168で使用した設定が約2uAしか消費しなかったためです。なぜなのかわかりません。前にも言ったように、ディープスリープなどの省電力モードをいじるのはこれが初めてです。だから私は何かが足りないかもしれません。それについて何か知っているなら、コメントで知らせてください。

ヒューズビットを変更するには、ISPプログラマーが必要です。多くのISPプログラマーと互換性のあるソフトウェアがあります。 USBasp を使用しました プログラマーおよび ProgISP として プログラミングソフトウェアとして。私が使用したATega168P-AUのチップIDまたは署名は 1E940B です。 。これは、使用しているバージョンによって変わる可能性があります。ヒューズビットを変更するには:

  • USBaspをNanoに接続します。通常、USBaspには10ピンのコネクタがありますが、Nanoには6ピンのISPヘッダーがあります。そこで、簡単な10ピンから6ピンのアダプターを作成しました。似たようなものを作るか、ケーブルを探す必要があるかもしれません。
  • リストからMCUモデルを選択し、 RD で署名を確認します ボタン。
  • 下の画像に示すようにチェックボックスとヒューズビットを設定し、自動を使用します ボタンまたは書き込み ヒューズ設定ウ​​ィンドウのボタンをクリックして、ヒューズビットを更新します。
<図>

成功すると、メッセージがコンソールに出力されます。これからは、MCUをフラッシュするためにISPが必要になります。以下は私が使用したUSBaspです。

<図>

<図>

ステップ3:コンパイルとアップロード

マイクロコントローラーのヒューズビットを変更したので、Arduino IDE内でコードを適切にコンパイルできるように、変更内容をArduinoソフトウェアとコンパイラーに通知する必要があります。これを行う方法は、 "boards.txt" にカスタムボード定義を追加することです。 通常は <インストール場所> /Arduino/hardware/arduino/avr/boards.txt "にあるArduinoインストールディレクトリにあるファイル Windowsシステムの場合。これは、使用しているOSまたは使用しているIDEのバージョンによって異なる場合があります。 IDEバージョン 1.8.5 を使用しています

boards.txtファイルを見つけたら、新しい Arduino Pro Mini のカスタム定義を追加する必要があります ボード。 655行目あたりは、既存のProMiniボード定義の始まりになります。ボードには多くのバージョンがあります。したがって、新しいバリアントを追加する必要があります。次の定義を追加して保存します。

  ## ArduinoProまたはProMini(3.3V、1 MHz)、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.1MHzatmega168 .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.1MHzatmega168.build.mcu =atmega168 pro .menu.cpu.1MHzatmega168.build.f_cpu =1000000L  

これがスクリーンショットです。

<図>

Arduinoが実行されていないときにboards.txtを編集する必要があります。新しいboards.txtファイルを保存してArduinoIDEを再起動すると、リストに追加したばかりの新しいボードが表示されます。以下のスクリーンショットをご覧ください。

<図>

<図>

これで、新しいボード用にArduinoコードをコンパイルする準備が整いました。 Arduinoブートローダー(BL)を使用していないため 、プログラムのhexファイルを作成し、USBaspとProgISPを使用してマイクロコントローラーをフラッシュする必要があります。これは、「コンパイル済みバイナリのエクスポート」を使用して実行できます。 IDEの[スケッチ]メニューからオプションを選択するか、 Ctrl + Alt + S を押します 。その場合、2つの 16進ファイル (Intel形式)は、スケッチが存在するのと同じディレクトリに作成されます。 1つの16進ファイルはBLありで、もう1つはBLなしです。

<図>

16進ファイルを取得したら、ProgISPで Load Flash を選択します。 MCUをフラッシュする16進ファイルをロードするオプションを選択し、自動を押します。 ボタン。アップロードが成功すると、ProgISPのコンソールに出力されます。

ステップ4:Intersil ISL1208 I2C RTC

<図>

Intersil ISL1208 I2Cインターフェースを備えた低電力RTCチップです。外部の32.768KHz水晶を使用して、時間を追跡します。月-日-時-分-秒のアラームレジスタがあります。 VBAT動作で約400nA、VDDで最大1.2uAしか消費しません。動作電圧は1.8Vから5.5Vです。これを良い候補にしているのは、消費電力と月日アラーム機能です。 DS1307などの通常のRTCでは、アラームレジスタに月の設定がありません。これがないと、毎年誕生日のアラームを生成できません。 250 mS を生成する割り込み出力ピンがあります。 現在の時刻がアラームの日時と一致したときにアクティブなLOW信号。これを使用して、MCUをスリープモードからウェイクアップします。これについては、後で詳しく説明します。

ISL1208の機能

  • リアルタイムクロック/カレンダー
  • -時間を時間、分、秒で追跡します
  • -曜日、日、月、年
  • 15の選択可能な周波数出力
  • シングルアラーム
  • -秒、分、時、曜日、日、または月に設定可能
  • -シングルイベントまたはパルス割り込みモード
  • バッテリーまたはスーパーキャパシターへの自動バックアップ
  • 電源障害の検出
  • オンチップ発振器の補償
  • 2バイトのバッテリバックアップ式ユーザーSRAM
  • I2Cインターフェース
  • -400kHzのデータ転送速度
  • 400nAのバッテリー供給電流
  • STM41TxxおよびMaximDS13xxデバイスと同じピン配置

ISL1208のSMDバージョンを持っていたので、メインボードに接続するためにブレークアウトボードを作成する必要がありました。以下は私が作ったものです。

<図>

<図>

<図>

<図>

ステップ5:CR2450Nコイン電池

<図> <図>

仕様

  • 化学システム-Li / MnO2(IEC 60086に準拠)
  • 公称電圧-3V
  • 定格容量-540mAh
  • 標準放電電流-0.8mA
  • 最大続き放電電流-3.0mA
  • 平均体重-5.9g
  • 動作温度*-40- + 85°C
  • 23°Cでの自己放電-<1%/年
  • 貯蔵寿命-10年まで

ステップ6:回路図

<図>

上記の回路図を使用して、モジュールをパフォーマンスボードにはんだ付けします。 2つの4.7K抵抗は、 I2Cプルアップです。 。値の範囲は3.3Kから5.6K以上です。 R2とR3は、割り込みピンのプルアップです。 Arduino Nanoには2つのハードウェア割り込みピン(デジタルピン3と2)があります。デジタルピン2はRTCからのアラームウェイクアップ割り込みに使用され、デジタルピン3は時間を設定する必要があるときにMCUをウェイクアップするために使用されます。以下は CP2102 です 私が使用したUSB-シリアルモジュール。

<図>

<図>

USB-シリアルモジュールは、シリアルモニターを介した通信に使用されます。 CP2102のRXピンとTXピンは、それぞれNanoのRXピンとTXピンに接続されています。 USBからの+ 5VをメインのVCC電圧に接続しないように注意してください。

ステップ7:どのように機能しますか?

デバイスの動作は実際には静かでシンプルです。メインのアルゴリズムがどのように機能するか見てみましょう

  • シリアルモニターを介してRTCで現在の時刻を設定します。
  • RTCでアラームの日時を設定します。
  • タイマーやADCなどの内部周辺機器を無効にして時間とアラームを設定した後、MCUはスリープモードになります。
  • 現在の時刻がアラームの日時(MM、DD、hh、mm、ss、p)と一致すると、RTCが生成し、MCUを中断してスリープから復帰させます。
  • ウェイクアップすると、MCUは必要な内部周辺機器を有効にし、お誕生日おめでとうメッセージをシリアルモニターに出力します。また、ドーム内のLEDを特定のパターンで点滅させます。
  • お誕生日おめでとうと、MCUは再びスリープモードになり、来年の誕生日にのみウェイクアップします。
  • ただし、時刻更新スイッチを回すと、時刻を確認して必要なときにいつでも更新できます。 オン。

初めて電源を入れると、すべてのRTCレジスタはゼロになり、それらのいずれかに最初に書き込むまでインクリメントされません。 RTCで時刻を設定するには、

  • 時刻更新スイッチをONにします(デジタルピン3をGNDに接続します)。ピン3をLOWに引かないと時間を設定できません。
  • まず、デバイスをUSBケーブルでコンピューターに接続します。通信するために、PCにCOMポートが確立されます。
  • デバイスマネージャからデバイスのCOMポートを見つけます。
  • デバイスのCOMポートを使用してシリアルモニターソフトウェアまたはArduinoシリアルモニターを開きます。

MCUは、以下のメッセージをシリアルモニターに出力します。

 シリアルが確立されました。時刻を更新する準備ができました。 
  • "t" を送信する コマンドは現在の時刻を出力します "a" アラームの日付と時刻を出力し、 "c" 時間設定操作をキャンセルし、6秒後にMCUをスリープモードにします。
  • 現在の時刻を以下の形式で送信する必要があります
  TYYMMDDhhmmssp# 

場所:

  • T =時間情報を示します
  • YY =1年の最下位桁(たとえば、2018年は18桁、範囲は00から99)
  • MM =月(例:1月は01、範囲は01〜12)
  • DD =日付(例:24、範囲は01〜31)
  • hh =時間(例:06、12時間形式の場合の範囲は01〜12)
  • mm =分(例:55、範囲は00〜59)
  • ss =秒(例:30、範囲は00〜59)
  • p =12時間形式の1日の期間(0 =AM、1 =PM)
  • =区切り文字

たとえば、日時を「08:35:12 AM、05-01-2018」に設定するには、次のように送信する必要があります。

  T1801050835120# 

デバイスへ:

  • T =時間情報を示します
  • 18 =2018年
  • 01 =1月
  • 05 =日付
  • 08 =時間
  • 35 =分
  • 12 =秒
  • 0 =午前
  • =区切り文字

操作が成功すると、MCUは受信した時刻を次のようにコンソールに出力します。

 受信した時刻の更新=T1801050835120日時は8:35:12 AM、5-1-18  

入力した時間文字列が無効な場合、以下のメッセージが出力されます。

 無効な時間入力-<元の文字列>、<元の文字列の長さ>  

時刻の設定に成功すると、RTCは、利用可能な電力がある限り、時刻を追跡します。 "t" を送信すると、設定した時刻を確認できます 指図。アラームの設定は、データ形式が異なることを除いて、これと同様です。アラームを設定するには、次のように送信する必要があります:

  AMMDDhhmmssp# 

場所:

  • A =アラーム情報を示します
  • MM =月
  • DD =日付
  • hh =時間
  • mm =分
  • ss =秒
  • p =期間(0 =AM、1 =PM)
  • =区切り文字

明らかに必要ないため、アラーム文字列には年情報がないことに注意してください。 たとえば、誕生日を「08:00:00 AM、28-08」に設定するには、次を送信する必要があります:

  A08240800000# 

コマンド "a" を使用すると、いつでもアラーム時刻を確認できます。 。アラームの日時が設定されたら、MCUをスリープ状態にします。したがって、デバイスは次のメッセージを出力します:

 すべてが設定されています。今すぐタイムセットピンを無効にしてください。 

次に、時間設定スイッチをオフにする必要があります。つまり、デジタルピン3をHIGHにプルします(10Kプルアップがそれを行います)。これを行うまで、システムはスリープしません。時間設定スイッチをOFFにすると、6秒後にスリープモードになり、その前に以下のメッセージが表示されます。

 よくできました! 6秒で眠ります。 

これが、時間とアラームを設定する方法です。これで、時刻を確認または更新する必要があるときはいつでも、タイマー設定スイッチをオンにすると、システムが起動し、シリアル通信を確立して、時刻を送信するように求められます。ウェイクアップ時に次のメッセージが出力されます

 シリアルが確立されました。時刻の更新がウェイクアップします。時刻を更新する準備ができました。 

時間が正しいかどうかを確認しているだけで、何も変更したくない場合は、 "c" を送信します。 操作をキャンセルしてシステムを再びスリープ状態にするコマンド。この時点で、時間設定スイッチも無効にする必要があります。

現在の時刻がアラーム時刻と一致する場合、つまり。あなたの誕生日に、RTCはNanoのデジタルピン2に250mSの割り込み信号を生成します。この信号はシステムをウェイクアップします。目を覚ますと、デバイスは誕生日であることを認識し、シリアル通信を確立し(USBが接続されている場合のみ)、次のメッセージを出力します。

 多田!あなたの誕生日です! Happy B'Day <あなたの名前> :)次の誕生日にお会いしましょう! TC。さようなら!6秒で寝る..  

また、デジタルピン13に接続されたLEDも点滅します。これは、システムのテスト中のArduinoシリアルモニターのスクリーンショットです。

<図>

これが、このデバイスの操作方法です。コードレベルでこれを理解するには、次のセクションをお読みください。

ステップ8:コード

このプロジェクトは完全にオープンソースであるため、MITライセンスの下でhttps://github.com/vishnumaiea/Birthday-Alarm/のGitHubにファームウェアのソースコードを公開しました。制限なしに、自由に適応、変更、再配布できます。変更したプロジェクトからこのプロジェクトにバックリンクを追加する場合は、それをいただければ幸いです。コードに徹底的にコメントを付け、可能な限りわかりやすくしました。

コードには合計13の関数/プロシージャがあります。それらは:

  1。 void setup() 

これは、すべてを初期化し、ISl1208RTCの構成レジスタを設定するArduinoのセットアップ機能です。

  2。 void loop() 

メインループ機能。

  3。 void sleepNow() 

この機能は、すべての通信を終了し、MCUの内部周辺機器を無効にし、割り込みをデジタルピン3および2に接続し、システムをディープスリープモードにします。割り込みが発生すると、プログラムの実行は sleep_mode()の後の行から続行されます。 。この通常のプログラム実行が再開する前に、MCUは alarmInterrupt()である割り込みピンに関連付けられた割り込みサービスルーチンを完了していることに注意してください。 および timeUpdateInterrupt()

  4。 void alarmInterrupt() 

INT0 に関連付けられたISR デジタルピン2で割り込み。

  5。 void timeUpdateInterrupt() 

INT1 に関連付けられたISR デジタルピン3で割り込みます。

  6。 void fetchTime() 

fetchTime() RTCのタイムレジスタを読み取り、現在の時刻をコンソールに出力します。

  7。 void flashLED() 

LEDが明らかに点滅します。

  8。 boolestablishSerial() 

USB-シリアルモジュールを使用してシリアル通信を確立します。

  9。 bool endSerial() 

シリアル通信を終了します。

  10。バイトbcdToDec(バイト) 

BCD を受け入れます (2進コード化された数字)値とそれを対応する10進値に変換します。 RTCレジスタはBCD値のみを格納および受け入れるため、これが必要です。そのため、BCDとの間で時々変換する必要があります。

  11。バイトdecToBcd(バイト) 

10進値を受け入れ、対応するBCD値に変換します。

  12。 void printTime() 

"t" の場合、RTCタイムレジスタを読み取り、現在の時刻をコンソールに出力します コマンドを受信しました。

  13。 void printAlarmTime() 

"a" の場合、RTCアラームレジスタを読み取り、アラームの日時をコンソールに出力します コマンドを受信しました。

ステップ9:テスト

<図>

これは、このプロジェクトの最も興味深い部分であり、私がどのようにしてコイン電池で50年間動作するデバイスを作成したのかを知ることができます! 私は最初に回路全体をブレッドボードでプロタイプし、設計を完成させました。新品のコイン電池を節約するために、テスト目的でリチウムイオン電池(3.6V)を使用しました。 Fluke 87 True RMS を使用しました 現在の測定のためのマルチメータ。 0.1 uA マイクロアンペア範囲の精度。

<図>

Atmega168Pをディープスリープモードにして、消費電流を大幅に削減する方法を見てみましょう。

  noInterrupts(); //割り込みを一時的に無効にしますset_sleep_mode(SLEEP_MODE_PWR_DOWN); //優先スリープモードを選択します:sleep_enable(); //スリープイネーブル(SE)ビットを設定します:ADCSRA =0; // ADCを無効にしますpower_all_disable(); //すべてのモジュールを無効にしますdigitalWrite(LED_PIN、LOW); // LEDをオフにして、スリープ割り込みを示します(); //割り込みを再度有効にしますsleep_mode(); //スリープ状態になります 

前にも言ったように、マイクロコントローラー(MCU)でスリープモードを使用したのはこれが初めてです。これまで必要だったことがないからです。 AVRスリープモードに関連する情報のほとんどは、このフォーラムスレッドとAVRライブラリのドキュメントから見つかりました。

ATmega168Pには5つのスリープモードがあります。

  • 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 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.多田! 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 :)

コード

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

回路図

Schematic of Arduino clone.

製造プロセス

  1. インダストリー4.0とIoT:今後数年間の市場動向
  2. アプリケーションに最適なスイッチを見つけるための10の要素
  3. NVIDIA:すべてのAIモデルを実行するCUDA-X AIコンピューター
  4. Kontron:過酷な環境で使用するための40ギガビットイーサネットスイッチ
  5. そのベアリングを叩かないでください!コールドマウントの適切な手順
  6. 複数色のナノコーティング
  7. サイバー犯罪者にとって、COVIDは与え続ける贈り物です
  8. 発電機のアップグレードの時期を示す7つの兆候
  9. モーターの巻き戻しの時期を示す3つの兆候
  10. 完璧な PCB アセンブリを説明するプラクティス
  11. そのためのロボットがあります!