はじめてのMKR ZERO (5) RTC
前回、温湿度センサの測定データをSDメモリに保存しました。時刻も同時に保存したいので、RTCボードをつなぎます。
入手性の良いのがDS1392(写真左)とDS3231(写真右)です。最初はI2CインターフェースをもつDS3231を利用します。裏側にはCR2032の電池が取り付けられます。
●DS3231のおもなスペック
- 動作電圧 3.3V
- 秒、分、時間、日、月、曜日、および年をカウント(2100年までうるう年を補正)
- 確度 ±2ppm(0~+40℃)
●接続
I2Cバスにつなぎます。
RTC | MKRZERO |
---|---|
GND | GND |
Vcc | Vcc |
SDA | SDA |
SCL | SCL |
●スレーブ・アドレス
いままでに、
- MKRZERO内部のデバイス 0x03、0x70
- LCD 0x3e
- バックライトRGB 0x62
がつながっていました。
I2CScannerを実行します。0x68がRTCです。
●ライブラリのインストール
ライブラリマネージャの検索でDS3231を入れるとたくさん見つかります。ここでは、ds3231FSを入れました。
サンプルのsimple_printを実行します。正常に動いているようです。
●MKRZERO内蔵のRTCを利用
ライブラリマネージャでRTCを検索します。MKRシリーズの多くで利用できるRTCZeroをインストールします。
サンプルのRTCZero-SimpleRTCを読み込み、日付けと時刻を現在の値に修正し、コンパイル、実行します。
実行結果です。
このRTCライブラリの詳細はこのページに書かれています。電源を入れるたびに日付けと時刻は初期化されます。バックアップ電池をつないでおけば、メインの電源を落としてもRTCは継続して動作しているようです。
●温湿度のSDメモリへの記録に時刻を追加
前回のスケッチに、内蔵RTCから読み出した時刻を追加しました。
// Written by ladyada, public domain
#include <Wire.h>
#include "rgb_lcd.h"
rgb_lcd lcd;
const int colorR = 200;
const int colorG = 200;
const int colorB = 200;
#include "DHT.h"
#define DHTPIN 2 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
#include <SPI.h>
#include <SD.h>
const int chipSelect = SDCARD_SS_PIN;
#include <RTCZero.h>
RTCZero rtc;
void setup() {
Serial.begin(9600);
Serial.println("DHT11 start");
lcd.begin(16, 2);
lcd.setRGB(colorR, colorG, colorB);
dht.begin();
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
while (1);
}
Serial.println("card initialized.");
rtc.begin();
}
void loop() {
String dataString = "";
delay(2000);
lcd.setCursor(0, 0);
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: "); Serial.print(h);
Serial.print("% Temperature: "); Serial.print(t); Serial.print("°C ");
Serial.print("Heat index: "); Serial.print(hic); Serial.println("°C ");
String dates = "19/04/10";
dates = String(rtc.getYear()) + "/" + String(rtc.getMonth()) + "/" + String(rtc.getDay());
// Serial.println("20" + dates);
String times = "20:04:00";
times = String(rtc.getHours()) + ":" + String(rtc.getMinutes()) + ":" + String(rtc.getSeconds());
// Serial.println(times);
lcd.setCursor(0, 0); lcd.print("Temp:"); lcd.print(t,1);lcd.print(" Hum:"); lcd.print(h,0);
lcd.setCursor(0, 1); lcd.print(dates);lcd.print(" "); lcd.print(times);
dataString = "20" + dates + "," + times + "," + String(t,1) + "," + String(h,0);
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// print to the serial port too:
Serial.println(dataString);
}
}
実行している様子です。
SDメモリの保存したDATALOG.txtの内容です。