前回から続き液晶モジュールとRTCモジュールの接続
前回はArduino UNOにキャラクター液晶モジュールを接続。
アルファベットや数字だけでなく、登録されてあるカナを表示した。
今回はRTCモジュール(リアルタイムクロック)を接続する。
時間を変更するのにPCに接続する事なく、Wifi機能もなiいArduino UNO単独でできるようにします。
サンプル例のみでは現場で使う時にケースなどに収納すると、PCを現地に持って行き、中身を取り出して時刻書込みって現実的ではない。
とはいうものの、プログラミングはど素人なので今回はこちらの記事を参考にしました。
ラジオペンチ様のブログサイト。とても参考になり大変感謝しています。
スケッチを借用させていただきます。
かなり前にも参考にさせていただき、3G通信のモジュールをAtmega328pと組み合わせてSMSを送るという作例で同じ部分を参考にした。同じ理屈でSMSの電話番号を登録するものである。
この時は時計の時刻変更の部分はほとんど判らず、LCDでカーソルの桁と数値を変更して電話番号を登録するので精一杯だった。(今でもあまり変わんないけど)
こうして昔の自分の記事を読むと自分ってなにも成長していないことに愕然とする。
仕事を長期で休職している今じゃないと。仕事のついでにこんな事できない。
今回はラジオペンチ様の作例とは液晶モジュールもRTCモジュールも違うので、知らないなりに知っている事を使ってゴリ押ししてスケッチを書いてみました。
スマートさのかけらもないが、同じ初心者の参考になればと思います。
一応自己責任で使用という事でお願いしておきます。
DS3231 RTCモジュール
今回はSDカードロギングシールドにくっついているDS3231を使用しているが、下のように単独のブレイクアウト基盤もある。
余りレビューは良くない。
充電式のボタン電池なら充電できるらしいが、8年前に普通のCR2032電池が入った状態で入荷して、まだ3.17Vある。
このブレイクアウト基盤はEEPROMがついているので、何か外部的に記憶させたい時に利用できる。容量は判らない。
EEPROMって商業的に使用していると寿命があるっていうけど、ホビーユースなら十分だと思う。
このモジュールはデータのやり取りがI2Cなので液晶もモジュールと同じで
液晶モジュール Arduino UNO
GND → GND
VCC → 5V
SCA → A4
SCL → A5
この接続で良い。
他のピンは無視してよい。
しかし、後の事が有るので今回はSDカードロガーに搭載されているRTCモジュールを利用する。
RTCモジュールに現在の時刻を書き込み
ライブラリはDS3232の物を使う。随分後でこのモジュールってDS3231では無いかと気付く。使えるので結果オーライ。
ライブラリマネージャで検索してダウンロードしておく。
なにも書き込まないと確か1970年1月1日0時0分からカウントスタートだったと思うので、現在の時間を書き込む。
時刻書込みスケッチ
#include <DS3232RTC.h>
DS3232RTC RTC;
void setup() {
RTC.begin();//i2cなどの初期設定
setTime(22, 35, 0, 5, 3, 2023);//時、分、秒、日、月、年の順番に入力
RTC.set(now());
}
void loop() {
}
ここの5行目で2023年3月5日22時35分を書き込む
これで書き込んだ後は、ちゃんと書き込めているか確認。
まだ液晶モジュールには接続しない。
スケッチ例のTimeRTCでモジュールでカウントされている時刻を呼び出して、Arduino IDEのシリアルモニターに出力する。
#include <DS3232RTC.h> // https://github.com/JChristensen/DS3232RTC
DS3232RTC myRTC;
void setup()
{
Serial.begin(115200);
myRTC.begin();
setSyncProvider(myRTC.get); // the function to get the time from the RTC
if(timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
}
void loop()
{
digitalClockDisplay();
delay(1000);
}
void digitalClockDisplay()
{
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(' ');
Serial.print(day());
Serial.print(' ');
Serial.print(month());
Serial.print(' ');
Serial.print(year());
Serial.println();
}
void printDigits(int digits)
{
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(':');
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
このスケッチを書き込んだら、シリアルモニターを開く。
アプリの右上の虫眼鏡マークをクリックする。
スケッチの7行目でSerial.begin(115200);
と記述されている。
これはシリアル通信の速度のレートであるので、シリアルモニター側で合わせてやらないといけない。
シリアルモニターの右下のメニューで115200bpsに合わせると上図のように時刻が表示される。
このレートが合っていないと文字化けしたり、何も表示が無かったりする。
スイッチ(タクトボタン)の取り付け
時刻設定用の操作ボタンをブレッドボード上にセットする。
白いタクトボタンがselectボタン、青いのがenteボタンとする。
別にタクトボタンでなくてもA接点だったら何でもよい。
接続は片側はそれぞれ0番ピンと1番ピン。
反対側は両方ともGNDに接続。
このスケッチでどちらのボタンが押されているかシリアルモニター表示される。
通信速度のレートに注意。
int enterButton = 1; // EnterボタンのピンNo.
int selectButton = 0; // SelectボタンのピンNo.
void setup(){
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(enterButton, INPUT);
pinMode(selectButton, INPUT);
digitalWrite(enterButton, HIGH); // プルアップ
digitalWrite(selectButton, HIGH); // プルアップ
}
void loop(){
int valueselect;
int valueenter;
valueselect = digitalRead(selectButton);
valueenter = digitalRead(enterButton);
Serial.print("selectbutton = ");
Serial.println(valueselect);
Serial.print("enterbutton = ");
Serial.println(valueenter);
delay(500);
}
18行目19行目で押しボタンの状態を拾う。
押していれば1そうでないと0を返してくる。
それを0.5秒休んで延々繰り返している。
今回はここまで。次回は液晶モジュールとRTCモジュールとボタンをセットにする。
おまけ
糖尿病がこんなにきついとは思わなかった。
もう抗がん剤の副作用か糖尿病の症状かさっぱりわからん。
間違いないのは低血糖で頭が働かなくて自分のしたいことが進まない事。
病気の治療の様子はこちら。