Arduinoと液晶ディスプレイLCD1602を使ってPower-downモードによるスリープ、ウォッチドックタイマー(WDT)による復帰、物理的な液晶表示のON/OFF、バックライトのON/OFFスイッチ付きデジタル時計を自作してみるページ。
画面表示ON/バックライトOFF。
画面表示OFF/バックライトOFF。
画面表示OFF/バックライトON。
画面表示ON/バックライトON...見えない...
これもピンぼけしてますが、画面表示ON/バックライトONの場合、実際はこんな感じです...。
バックライト点けた場合、どうやったら、うまく撮影できるんでしょうか...。
で、併せてArduinoで最もDeepなSleep、SLEEP_MODE_PWR_DOWNもしている、と。
Arduinoボードは、Uno系なら何を使っても同じ方法でいけますし、miniUSBケーブルは100均にもあり、RTCモジュールはDS1307やDS3231/3232などでも、というか3択なら、ボタン電池CR2302を使う場合、パターンカットなど対処を要すものの、アラーム機能付きなど高機能で完成度が高くバグのないDS3231が推奨っぽい、スイッチは、ロッカスイッチでもトグルスイッチでも他でも可です。
スリープ機能が働くのは、ICチップであってArduinoのような開発ボードは、他に電力を消費するものが搭載されているため、電力消費を激減させたい場合には、5V版ではなく、3.3V版、もっと言えば開発ボードではなく、ATMega328PなどのIC単体での実装が効果的です。
検証回路としては、ザッとAmazon/Amazonマーケットプレイス相場でArduino Nano 300円前後、LCD1602+I2Cモジュールは、300円前後、DS1302は今や高めで300円前後(DS1307の方が150円前後と割安っぽく、最も推奨されるDS3231も300円前後)、ロッカスイッチは100円前後、ミニブレッドボードも100円前後、ジャンパワイヤ適量20円、ワニグチクリップケーブル20円x4=80円と仮定、CR2302は100均一で単価54円(2個108円)、USBケーブルは100均一で108円とすると1300円前後、Aliexpressでこの6〜8割程度といったところでしょうか。
LCD1602/LCD2004などのキャラクタ液晶は、個別に買ってはんだ付けでも構いませんが、何れにしても配線4本で済むI2Cモジュール付きがなんと言っても楽で嵩張らず簡単です。
Arduino | LCD1602 I2C | DS1302 | 液晶SW | Backlight SW | 備考 |
---|---|---|---|---|---|
SDA(A4) | SDA | - | - | - | |
SCL(A5) | SCL | - | - | ||
4 | - | - | ○ | - | 他極はGNDへ |
5 | - | - | - | ○ | |
6 | - | CLK | - | - | |
7 | DAT | ||||
8 | RST | ||||
5V | VCC | ||||
GND |
表のスペース節約を図った結果、スイッチをSW、バックライトをBacklightと表記しました。
スイッチの接続は少し悩んだ結果○印にしました。
尚、表示とバックライトのON/OFFスイッチありきで考えたため、後述のスケッチのウォッチドックタイマー4秒との兼ね合いで切り替えから、若干タイムラグが生じます。
むしろ、タイムラグはありますが、スリープ・復帰とこれらのON/OFFスイッチを併用できます、というか、そうしたくて結果、こうなりました。
電源は、ArduinoボードをUSB接続するか、電池なら+/-をVIN/GNDに接続します。
電池の場合、GNDは他とは別のピンからとります。
ライブラリには、次のものを使わせて頂きました。
スケッチのスリープと復帰部分に関しては、ArduinoのCPUをスリープさせて消費電流を減らす関数 delayWDT2をそのまま使わせて頂きました。
秒表示はしない前提で1分ごとに時計を更新表示させるべく、ウォッチドックタイマーの時間は、計算しやすい4秒としました。
尚、delay()は使わなかったものの、ズレが生じる可能性は無視しました。
2つのスイッチON/OFF状態用にsw_trig()、時計表示用にclockDisp()関数を作り、前者をloop()先頭、後者を初期表示の為、setup()に、また、WDT復帰時、かつ、1分ごとに表示のため、loop()内で実行させています。
1分ごとの(4秒で復帰のウォッチドックタイマーを15回カウント)チェックをloop()内で行なうことで4秒ごとながら常時、スイッチ操作が効くという算段です。
もちろん、操作を4秒にピタッと合わせる必要はなく、切り替え後のタイムラグとして現れます。
MyRealTimeClockライブラリの場合、画面表示のONには、display()、OFFには、noDisplay()が、バックライトのON/OFFには、setBacklight(HIGH)/setBacklight(LOW)が用意されています。
ちなみにsetBacklight()の引数には、0-255の値を入れることを想定しているようで255/0でも良いのですが、途中の値には、あまり意味がなさそうなのでHIGH/LOWで良いかと。
ところでRTCモジュールにボタン電池を入れ、日付時刻を設定後、アップロード、更に日付時刻設定行をコメントアウト後、改めてアップロードしておかないと電源を入れるたび、スケッチ上の設定時の日付時刻から開始されてしまうので要注意です。
2019/04/09 21:30〜 使用済み単3アルカリ電池x4(電圧5.55V)、液晶表示・バックライト共にONで使用開始。
2019/04/14 21:30 使用済み単3アルカリ電池x4(電圧4.15V)、バックライトは明るいものの、液晶表示は、微かになり始めたので終了。
5日とは、意外なほど短かったですね...ただ、電池電圧4.54V、LCD、DS1307、スイッチ部で残電圧3.1〜3.3V程度、もっといけそうなもんですし、鳥よけは電池残圧2V程度までで1ヶ月ほど持つんですが...、なぜ...。
鳥よけは外部割り込み、この時計は4秒毎のWDTという違いによるのか、そもそも電池電圧4V台で随所で3V前半まで電圧降下、バックライトはともかく、そもそもLCDの入力電圧は5Vなんでしょうし、それだと不足ということなんでしょうね...。
となるとICチップATMega328Pで実装してみるか、USB充電器で運用ですかね...。
ウォッチドックタイマーは最大8秒まで対応で8秒設定が最も省電力、今回は4秒なので最大の効果は発揮できないのでしょうが、どれくらいのものなんでしょう...。
電流も0.01A以上を計測できるUSB電圧電流計だと比較どころか、常時、バックライトOFFで0.00A、ONで0.01Aという結果しか得ることができませんでした。
ちなみにDS1302に使ったボタン電池も使用済みで残電圧2.8Vだったものを使っていますが、時刻保持もしてくれますし、機能はしており、検証でもこれを入れたままにしてあります。
単3エネループx4本で丸5日でした。
ユニバーサル基板にはんだ付け、表示、バックライトのON/OFFには、トグルスイッチを使い、100均セリアのトレカケースに入れてみました。
LCDの配線が微妙に短いこともあり、ボルト止めするか否かは、思案中...。
今更ながら、[Time:]なんて要らないですし、37センサーキットに温湿度計DHT11の他に3つも入っていて余ってる温度計モジュールを入れるのもありか...収まらないか...、モジュールだと。
配線は、盛りはんだしたり、新品もありますが、今回は、結構たまってる芯抜けしたりしたジャンパワイヤなどを使いました。
今回使ったArduino Nanoボードは、ユニバーサル基板にメスのピンヘッダをハンダ付けして挿しました。
尚、ユニバーサル基板は、そのままでは入らなかったので一辺だけ端っこをカッターで筋を入れてからラジオペンチで折り(割り)ました。
ちなみに電子工作を初めて2年ちょい、ブレッドボード版を以て完成としたものは、そこそこありますが、ユニバーサル基板は、数カ月前、自作スマートスピーカー用にラズパイboot/reboot/shutdownボタンで使ったのが初めて、これが2つめです。
ケースの底、内側には、基板のクッション代わりというか、配線外れ防止、底面密着回避の為にグルーガンで要所にグルーを盛るかしておくのも良いかなと。
何度か電源を入れ直したりすると曜日が飛び、再アップしないと表示されなくなったりするのは、DS1307のご愛嬌(バグ)ってことでしょうか、Arduino公式サイトにも書いてあった通り、DS1302/DS1307ではなく、やっぱり、DS3231にしておく方が賢明そうです。
まだ残っている37センサーキットのセンサーを実用品に使い切ってみようかと手始めにESP32/TFT液晶 温湿度計付き時計でBME280と差し替えてから最終的にどこにやったのか覚えていない(壊したかもしれない)DHT11を除く各種温度センサー3種の何れかを実用品に使ってみようと思うに至り、結果、サーミスタと半固定抵抗が載ったデジタル温度計を、この時計に組み込むことにしました...が、これは温度計としては使えない模様...。
既存配線済みのユニバーサルボードに追加でArduinoのA0-温度計モジュールのA0-カーボン抵抗10kΩ-VCCライン、温度計モジュールのVCC、GNDを、基板上のVCC、GNDラインにそれぞれに配線、ハンダ付け、温度計モジュール搭載のポテンショメータ(半固定抵抗)で温度を合わせるべく、良き位置に設定。
サーミスタ部だけ露出しようかとも思いますが、とりあえず、温度センサーごと外出しにしています。
LCDの固定については、あれからすぐ手持ちの銅製組ネジ・ナットセットで固定したのですが、出っ張り過ぎてしまって、ちょっと不恰好だったこともあり、先日、六角ボルト&ナットセットを買ったのでM3のボルトとナットに変更したら、それっぽくなりました。
また、視認性を上げるべく、ケースに傾斜を付けるため、汚れず、傷つかず、何度でも練って使えるブルタックでデスク奥の端に斜めに固定、2ヶ月ほどは経っており、今回の作業の為に一度とりましたが、その体勢に変化はなく、ばっちりくっついてました。
改めてブルタックで固定、写真ではわかりにくいものの、効果抜群で椅子に座った状態で視線をやると、とても鮮明に、よく見えます。
ちなみに温度センサーもケース表面にブルタックでペタッとくっつけてます。
スケッチは、37センサーの各種温度計のところにあるリンク先から拝借したものを取り入れさせて頂き、結果、こんな風にしました。
あれ?24℃以上にならない...。
え?まさか、37センサーのサーミスタの載った4ピン温度センサーモジュールの半固定抵抗は、Max温度指定?それって何のため!?
でも、そうだとするとデジタルピンが、その設定値に達したらON...というのは、辻褄が合いますけど...。
もしかして、これって温度計じゃないの!?温度管理センサ!?あんまり情報がないみたいですが、どうもそうみたい。
付け替えないと...。
実は、2つ代替となるセンサーはあったのですが、その37センサーのサーミスタの載った3ピン温度センサーモジュール、DS18B20(DALLAS 18B20)の温度センサモジュール共になぜか、50度ほど高く表示されるようになり、なにかに使えるかもと思うものを集めた破損品ケース行きにした結果、妥当なセンサーが手元になく、放置していました。
が、誤差が一定なら、その分、調整すればよいかと思い直し、例のなんと温度計としては使えなさ気な4ピンと同じアナログ信号をとればよい37センサーのサーミスタの載った3ピン温度センサーモジュールを復帰させ、使うことに。
特定の温度計の精度にはなってしまうものの、他の温度計と比べて調整、電源投入直後は、50度程度高くなるのですが、これまた、なぜか、分単位で動かしている関係で表示が更新される1分後には、更に3度下げて上げてちょうどくらいになる...、というわけで5347度マイナスした値を表示させています。
が、37センサーのサーミスタの載った3ピン温度センサーモジュールは、温度計用途に使うものではない模様。