Arduino Nano互換品でRTC(DS3231)の時刻合わせをする

2020年12月3日

etc_0074.jpg

以前のブログ内容では、リアルタイムクロックモジュールの時刻設定はラズベリーパイで設定しましたが、
Arduino Nano互換品のみで自分なりに調整できるようになったので、参考に公開します。

1.考え方
Arduino Nano互換品のリセットボタンをを時刻セット用スイッチとして使用します。
スケッチ内に設定したい日時を決め打ちで書き込み、スイッチを押したタイミングでその時刻を書き込みます。
その為、設定後は一旦RTC(DS3231)を回路から取り外して、Arduino Nano互換品に適当な別のスケッチを書き込んで下さい。
プログラムの考え方が気になる方はRTC(DS3231)のデータシートにデータ書き込み先等の考え方が載っていますので読んでみましょう。こちらの11ページ目です。
https://cdn-shop.adafruit.com/product-files/3013/DS3231.pdf

2.組み立て

5V→VCC
GND→GND
A4→SDA
A5→SCL
このようにブレッドボード等で仮接続して下さい。
Arduino Nano互換品とRTC(DS3231)をI2Cで繋ぐだけでOKです。

3.スケッチ(プログラム)作成
ネット上の先人達をものすごく参考にして、下記のスケッチ(プログラム)を作成しました。
書き込む日時は’19/03/14 23:46:00(Sun)を例にして記載していますので、
設定したい日時に適宜修正してください。
アマチュアが作成しておりますので、プログラム記載方法は多めに見て下さい。

これをArduino Nano互換品に書き込み、狙ったタイミングでリセットボタンを押すと設定できます。
設定後はシリアルモニタ(9600bps)で現在の時刻が表示されるようにしてます。
通電するたびに時刻を上書きしてしまいますので、狙った時刻を書き込む事ができたら回路からRTCを取り外して下さい。

—————————————————————————-

#include <Wire.h>
#define RTC_addr 0x68
#define ASCII_ZERO 48
const char *Week[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

//例)'19/03/14 23:46:00(Sun)
int a = 1;
int b = 9;
int c = 0;
int d = 3;
int e = 1;
int f = 4;
int g = 2;
int h = 3;
int i = 4;
int j = 6;
int k = 0;
int l = 0;
int m = 1;
//m入力ルール "Sun"→1, "Mon"→2, "Tue"→3, "Wed"→4, "Thu"→5, "Fri"→6, "Sat"→7

//RTCデータ書き込み
void RTC_set(void) {
byte sec = byte(k * 16 + l);
byte mini = byte(i * 16 + j);
byte hour = byte(g * 16 + h);
byte day = m;
byte date = byte(e * 16 + f);
byte month = byte(c * 16 + d);
byte year = byte(a * 16 + b);
delay(10);
Wire.beginTransmission(RTC_addr);
Wire.write(0x00);
Wire.write(sec);
Wire.write(mini);
Wire.write(hour);
Wire.write(day);
Wire.write(date);
Wire.write(month);
Wire.write(year);
Wire.endTransmission();
delay(10);
}

//日時を取得
void RTC_read(void) {
char* pchDate = "1990/01/01";
char* pchTime = "00:00:00";
byte sec = 0;
byte mini = 0;
byte hour = 0;
byte day = 0;
byte date = 0;
byte month = 0;
byte year = 0;
Wire.beginTransmission(RTC_addr);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(RTC_addr, 7);
if (Wire.available() >= 7)
{
sec = Wire.read();
mini = Wire.read();
hour = Wire.read();
day = Wire.read();
date = Wire.read();
month = Wire.read();
year = Wire.read();

pchTime[0] = bitRead(hour, 5) * 2 + bitRead(hour, 4) + ASCII_ZERO;
pchTime[1] = (hour & B00001111) + ASCII_ZERO;
pchTime[3] = (mini >> 4) + ASCII_ZERO;
pchTime[4] = (mini & B00001111) + ASCII_ZERO;
pchTime[6] = (sec >> 4) + ASCII_ZERO;
pchTime[7] = (sec & B00001111) + ASCII_ZERO;

pchDate[0] = '2';
pchDate[1] = '0';
pchDate[2] = (year >> 4) + ASCII_ZERO;
pchDate[3] = (year & B00001111) + ASCII_ZERO;
pchDate[5] = bitRead(month, 4) + ASCII_ZERO;
pchDate[6] = (month & B00001111) + ASCII_ZERO;
pchDate[8] = (date >> 4) + ASCII_ZERO;
pchDate[9] = (date & B00001111) + ASCII_ZERO;
Serial.print(pchDate);
Serial.print(",");
Serial.print(pchTime);
Serial.print("(");
Serial.print(Week[day]);
Serial.println(")");
}
}

void setup() {
Serial.begin(9600);
Wire.begin();
RTC_set();
}

void loop() {
RTC_read();
delay(1000);
}

—————————————————————————-

スポンサードリンク
 

電子工作

Posted by gonzy