Arduinoを使って『温湿度計付きデジタル時計』を自作してみるページ。
作ると言っても今の段階では手許にモノがないので作りたい・作る予定レベルですが、Arduino Pro Mini互換機(は、もしかして要らない?というかESP-WROOM-02やESP8266が必要orベター? => 勘違い、Arduinoボードor相当するマイコンのほか必要ならWifiモジュールも併用 => いやいや、ESP8266、内蔵RTCとNTP、WiFi環境でもいける)、後日届く予定のRTC時計モジュールDS3231 AT24C32、Wi-FiモジュールESP8266 UARTを使ってNTPで同期をとり、時計モジュールのアラーム機能ももちろん使い、時計モジュールにも温度検知機能もある模様も、37センサーキットにある温湿度検知センサーモジュールを使って温度と湿度を、何かと必要になるであろうLCDは16x2 HD44780 1602、128x32 0.91インチ SSD1306、128x64 0.96インチ SSD1306、128x160 1.8インチ ST7735R TFTと数種類届く予定なので現物合わせでこれに表示させたいと思っています。
実物を見てみないとなんとも言えませんが、何れにしても液晶は小さいのでシート型のルーペやミラーを使って拡大できるものならした方がよいのか?などとも考えています。
ちなみにレビューを読んでみると時計モジュールのバックアップの二次電池として充電池LIR2032ではなく、普通のCR2032を使えるようにするには、ちょっと手を加える必要があるらしい。
LIR2032ってその辺にも売ってるものなの?と思ったらCR2032などとの混同がないよう配慮がなされているようで通販はともかく、気軽に店頭に吊るしてあるものを買える状況ではなさ気。
検証にはArduino UNO互換機、実装には、Pro Mini互換機を使用、プリント基板ではなく、これも後日届く予定のユニバーサルボードにハンダ付け予定。
激安互換品などの仮構成でコストを計算してみるとPro Miniが265円、時計モジュールDS3231 AT24C32が200円、Wi-FiモジュールESP8266が278円、37センサーキットが2000円だから温湿度センサーは単純割りの上、切り上げて約60円、LCDに128x32 0.91インチ SSD1306を使うとしたら450円、ユニバーサルボードは50mmx70mmx10枚で135円(70mmx90mmx5枚で260円)、1枚まるまる使うにしても約14円(52円)、計1267円(1305円)プラス電池ボックス+電池+筐体になり得るケース代。
電圧がどの程度必要か判然としない為、ボックスと電池は特定できませんが、仮に300円として、筐体のケースもルーペやミラーの必要性の有無にもよりますが、これらが不要で100円ショップのクリアボックス+固定部材や硬質カードケースに穴あけビス+ナット締めして収めるなりして2品216円とすると516円で計1783〜1821円(無線LAN環境はあるとしてその費用、人件費、配線コードやはんだ代は含まないものとする)。
随分昔からCASIO製のデジタル表示の日付曜日、温度・湿度、空気の汚れ、カビ注意、快適度のグラフ付きアナログ時計が1つあるのですが、時計の単3x1とは別電源となっているデジタル表示の電池(単3x4)を久々に入れてみるとSENSORという文字にクエスチョンマークが重なって点滅、グラフ表示がおかしなことになっています。
市販品には温湿度計付き電波時計でもシンプルなものなら、もっと安価なものもいくつかあるようですが、空気の汚れは大気センサーがあれば、カビ注意は湿度から、快適度はこれら何れか、または両方の情報から得られるだろうから、これをグラフ化、表示できれば(の話だが)、十二分に優位性もあるし、そうでなくともArduinoで時計、更に温湿度表示付きにしても定番だと思われ、手始めにもよいかなということと自己満足ということで納得することにして、代替品を作っておいて既存の時計の各種センサーをチェックしてみようかなというのが、今回、製作してみようと思うに至った動機。
思いの外、早く時計モジュールやWifiモジュールが届き、基本的な動作確認もできたので近々作りたいと思います。
とりあえず手始めにAdafruit_SSD1306とAdafruit-GFX-Library、adafruit RTClibをダウンロード(既に動作検証で使用済み)、ssd1306_128x64_spiをベースに編集、日付時刻を表示させてみました。
結構クリアに表示され、見やすいが、0.91インチ128x32や0.96インチ128x64を液晶として使うとしたら、やはり、実用上は、ルーペで拡大した方がよいかな。
これに気を良くして37センサーキットにあった温湿度センサーを接続、動作確認でも使用させて頂いたHow to Set Up the DHT11 Humidity Sensor on an Arduinoのスケッチから先で編集したスケッチにこれ用のコードを追加して温度と湿度も表示させてみました。
ここまで先人たちのおかげで思いの外、あっさりできました。
この湿度がホントなら喉カラカラな変な状態ですが、他の湿度計で見ると40%前後、DHT11単体検証ではここまでの誤差は出ていない、よく見ると温度も他の温度計では20〜21度、単体ではほぼ誤差なしだったし、小数点以下の桁があるのに温湿度共に少数以下00って。。。何かがどうかなっている様子、要チェック。
曜日は3文字表記(配列の定義変えるだけ)でよいし、日付時刻も1桁の時、前に0がつかないから、できればこれも対処したい(if文でシンプルにいけるはず)かな。
って0埋めは、こんな感じか。(一瞬キャストもいるか?なんて思いましたが、直前にif文で10未満だったらdisplay.print(0);とすればいいだけでした。)
というか、もっと大きな液晶じゃないと、できたとしてグラフなんて表示するスペースないのか。。。先日買った1.8インチ128x160ならいけそう?ただ、これまで買ったものほぼ全て機能検証できましたが、その液晶だけは、何をやってみてもバックライトは点くも映像表示されないので販売店であるHiLetgoに問い合わせ中で今は確認できません。
あとは、WifiつなげてNTPと二次電池LIR2032の購入か手を加えてCR2032を使えるようにすることと液晶選定、必要ならルーペで拡大、鏡で投影などの加工と筐体選定、ハンダ付けか。
うわっ、ハンダ付け、ほぼほぼ初めてなのに勢いで時計に試してみようと思ったLCD1602Aのヘッダピンに挑戦、芋ハンダになっちゃったところがあって溶かしつつ簡易吸い取り器をできる限りピッタリくっつけてスポンッとやったらピン穴のランド(銅箔)まで剥がれた。。。ユニバーサル基板ならまだしもモジュールは痛いだろ。。。補修は効くのか。。。?
検索してみるとシールや銅箔テープ、導電インクペン(使用期限6ヶ月とか1年って。。。そんな短期間に使い切れるほど使わないだろ。。。ってこの調子なら使うのか?)なんかはあるみたいですが、これって穴の内側にも銅箔付いてたのかな?だとしても。。。銅箔テープ貼って何か挿してうにうにやればいける?
つか、先日、はんだ付けするより前に、これまた勢いで壊れた扇風機の電子パーツの部品取りをしてみた際、あ、十分、洗浄しなかった?からか、新品のはんだのコテ先が1回の作業で酸化。。。今回、作業を始める前にテストではんだを単に溶かしてみようと思ったら、コテ先から熱が伝わってないのか、先っぽだとはんだが溶けにくく、ツマミを回してコテの温度上げたら、はんだが玉になって飛んだりした為、BB弾かよ!とツッコミつつ、検索してみると酸化に起因するとのことで、修復方法もあるらしく、最もシンプルにヤスリで酸化部分を払い落とす程度に軽く削って、はんだでコーティングしてみたら復活。。。何事もトライ&エラーですね...。
04/28、銅箔テープやはんだ吸い取り紙、その他諸々を発注、当然といえば当然なので別に構いませんが、ヤマト配送問題が響いているようで、発送が分割され、後発に至っては支払い番号もなかなか発行されず、はんだ吸い取り紙を含む先発品は昨日30日にヤマトではなく初の日本郵便プチプチ内装袋で到着。
銅箔テープは後発ということでまだ届かない中、練習がてら銅箔テープなしでLCD1602のはんだ付けをやり直してみることにした4月30日、銅箔がはがれているところは別としてぶっつけ本番の2度めにしては、なかなか上手くいったので配線してみるとバックライトしか点かず、今日になって、いやいや、いけるでしょ?とやってみたら、綺麗に表示できました。
原因はポテンショメータをつながないパターンでV0ピンに何も配線していなかったこと、これをGNDに接続したら見事に表示され、また、Hello Worldなどのスケッチのコメント行にあった抵抗10KをVDD前に入れる勘違いをするも、入れる必要のない、この抵抗を忘れたおかげで表示できた次第。
すぐにLEDアノードに入れるべき抵抗なのかなと思い、10K入れてみるとバックライトが点かない、試しに1Kにしてみると、まぁ確かに抵抗入れないと明るすぎるかも?これくらい抵抗入れてちょうどよいか。。。という印象を持つも写真を撮ろうと思うと抵抗1Kでも入れると暗すぎて写らない状態に。(尤も抵抗を入れないと周囲をある程度暗くしないと反射してしまって写らないのですが。)
そんなこんなで今回、HiLetgoに発注してあるIIC/I2C/SPI変換モジュールが届くのはまだまだ先であり、そのままだとRTC時計モジュールとLCD1602ではピンが足りなくなる為、温湿度計DHT11を試してみると、やはり、ルーペ無しでこのくらいの大きさで表示されないと温度・湿度計付き時計としては実用的じゃないよねという感じ。
LCD 1602Aの動作確認時点でそう思ったので、ちょっと型が古そう?で、バックライトはイエローな模様ながら、この時計用ディスプレイの最有力候補としてどうもデフォルトでIIC/I2C/TWI/SPIシリアル変換モジュールも付いていて半角カタカナも表示できるらしきLCD 20x4も今回、併せて発注済み。
バックライトがブルーにせよ、イエローにせよ、先の抵抗の有無に見たように、周囲の明るさ・暗さによる視認性がどうか、必要なら一度のバックライト調整で終日対応できるのかという実用性の面が、ここにきて若干気になってきました。
昨日の05/09、LCD 2004Aほか発注品が届き、今日、時計に使えるのか、動作確認済みのLiquidCrystal_PCF8574のスケッチをベースに[スケッチ] => [ライブラリを使用]からDHTとRTCライブラリを追加し、dht.h、RTClib.hをinclude、必要な宣言を追加、lcd.printに日付時刻や温度、湿度を設定するなどして即席スケッチで実行。。。
しようと思ったら、RTC時計モジュール、デフォルトでLCD2004Aにハンダ付けされていたI2Cモジュールの2つのモジュール間でSCL/SDAが被ってしまい、UNOのSDA/SCLとA4/A5を使ってみたり、UNOのSDA/SCLからブレッドボード上に配線し、両モジュールで共有してみたりしたものの、これによるのか、日付時刻が2000/01/01。。。あけましておめでとう。。。と言いたくなってしまう状況に。
また、改行の文字化けなのか?、なぜか末尾に4本の横線マークが1つ、2つ入ってしまう。
後者はともかく、前者の件があると、ここで想定する実装は無理かな?LCD2004AからI2Cモジュールを外してフルで配線するとLCD 1602同様、ピンが足りなくなるし、だからと言ってMegaを使うのはコスト高だし、SPIならいける?のか?ってどうやるんだ。。。?SPI.h追加?LCD 2004Aにハンダ付けされた変換モジュールは単品購入もしたIIC/I2C/TWI/SPIシリアルモジュールと見る限り同一だと思いますが、GND/VCC/SDA/SCLピンしかなく、TWIやSPIってどうやったら。。。?サイズ的にはよさ気なんだけどな。
I2Cはアドレス指定が必要とは言え、I2Cにしろ、SPIにしろ、マスタとスレーブ(差別用語断固反対...)による1対多の接続もできるとのこと。。。ということは、SDA/SCLが被っても実装する方法があるってことか。。。
っていうか、実は、複数使えるらしいっていうこと自体は、知ってはいたんだけど、これについて調べてると説明読んでる間に必ず眠くなって完読できず、いつまで経っても覚えられないんですよね。。。
視認性は、写真で見るよりも綺麗で良好ですが、周囲があまりに明るいとやや見えづらい印象もなくもない。。。この辺は1602Aも併せて、コントラストの調整しろが、かなり少ない(微調整がきかない)ので、コントラスト調整で万事解決というものでもなさ気、と言っても許容範囲内だとは思いますが。
ちなみにAmazonやHiLetgoなどに拘らなければ、市場には、前述の16x2同様、20x4でも青のバックライトに文字色が白というバージョンもあるっぽい。
さて、こうなるとRTCモジュールが持つらしき温度センサーを使って湿度表示は諦めるか、0.96インチの小さな液晶を使うか、1.3インチや2.2インチの液晶もありましたが、前者はそれでも小さい、後者はTFT液晶でオーバースペックだし、それだけにちょっとながらコスト高。。。どうしたものか。。。
前述の追記通り、HiLetgoに再支払い方法相談中(後日、相殺再支払い済み)の正常に機能することが判明したKMR-1.8 SPI、SPIで試してみたら、やはり、時計も表示できました。
0埋めのほか、変化があったらクリアして書き直すという処理を入れないと描画がオーバーラップして文字が潰れる点など改良の余地は、まだありますが。
撮影上、時計部分は、白黒(モノクロ)にしたが、TFTカラー液晶なのでカラー表示も可。
sprintfで%02dを指定することで0埋め、値に変化があったらその行領域をtft.fillRectでクリアして書き直すという処理を入れたのがこれです。
サイズ的にも、これなら実用性はあると言えるでしょう。
これでよいとすれば、あとは、Wifi接続してNTPサーバから時刻を取得・調整、RTC時計モジュールの二次電池LIR2032かCR2032のどっちを使うのかを決めること、はんだ付けと筐体か。
当初はそんなことなかったと思いますが、あるときからRTC時計モジュールだけだと9時間とか標準時レベルじゃなくて電源入れる度に同じような時間?だったり、24時間以内とはいえズレてしまうのはなんで?試しにLIR2032じゃなくてCR2032入れてみた時に壊れた?それともそういうもの?
それはそれとしてNTP機能を取り入れるべく、ネットにつなごうと動作検証済みのWi-Fiモジュール ESP8266 UARTを改めて使ってみると、やはり、このESP8266にはマイコンも載っており、サイズ的にも問題ないのか、サンプルスケッチにNTPクライアントもあり、ESP8266に直接スケッチを書き込むことができる為、Pro Miniは不要そうも、そのESP8266に現在夢中(ハマり中)!?
TFT液晶に表示させる時点で何か間違ったようでRTCモジュール自体の精度は高く、シリアルモニタ上は日付時刻は正確でした。。。
というか、RTCがあれば、併せて電池も使えば、もしかしてNTPっていらない?
いやいや、RTCでも多少なりとも誤差は出るだろうからNTPで補正か、手動設定で調整できる機能の何れかは必要か。
後者だとネットにつなぐ必要はなくなりますが、物理ボタンか、液晶をタッチパネルに。。。前者だとネットにつなぐ必要はあるが楽か。。。Wifi次第ですが、前者だな。
一昨日、wifiモジュール他が届き、前回購入品はほぼ故障で間違い無し、今回購入同一品ではサンプルスケッチBlink、NTPClientをアップそれぞれ動作確認できました。
電池もAmazonレビューにあった通り、RTCモジュールの基板上の大きいICの横のガラス管、もしくは、その横のチップ抵抗を外すか、その回路のパターンをカットすることでCR2302を使えるとのことでカッターでカットし、今は常時CR2302を入れてあります。
が、先日、時計を仮置きすることがあって何も計算することなくUnoに接続した時計を単3x2電池式USB充電器で動かしたところ24時間ももたず、ショック。。。
3VをUSB出力5Vに昇圧している点で電池の持続時間が短くなるのは当然にしても1日もたないって。。。AREF使えば、もう少しいけるのかな?それにしたって数日じゃ話にならなくて少なくとも数カ月はもってもらいたいところですが、Arduinoを使う限り無理ってことか。。。
コンセント接続のUSB充電器必須の時計って。。。しかも時計としては消費電力がめっちゃ高い、更には量産品じゃないっていう意味では致し方無しも激安互換機やパーツを使っても市販の安い電波時計よりコストがかかってる。。。となるとコスパも悪く、実用性もなく、作ってみたっていう自己満足でしかなくなってしまう。。。すっかり脱力。。。
それでも力を振り絞って検索してみると売り物らしきESP8266を使った電池式時計で持続時間6ヶ月っていうのがあったけど、それがホントなら、どうやってるんだろ?
そんな方法があるなら脱力してる場合じゃないよね?
これが脱力しなくて済む方法かな?
ここにもスリープは消費電力が極微量なので有効という話があります。
で、NTPのスケッチを書き込んだESP8266からシリアル/パラレル相互変換可能なUARTを使ったシリアル通信でArduinoボード(ここではPro Miniを想定)にNTP日付時刻を転送、Arduino側のスケッチで受信がなければRTC日付時刻、受信があればNTP日付時刻をセットするよう条件分岐すれば良さげ。
5VのArduinoボード(Pro Mini)と3.3VのESP8266で通信する場合、ESP8266側(3.3V)からArduino(5V)側への送信では不要ですが、Arduino(5V)側からESP8266(3.3V)側に送信する際には、5V=>3.3Vレベル変換が必要っと。。。うっかり、見落とすとこでした。
おっと、変な記述発見...。
WiFi機能内蔵のESP8266使うなら、ESP32温湿度計付き時計の通り、Arduinoがなくても時計はできるし、NTPで時刻調整もできる...。