はじめての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の内容です。

前へ

はじめてのMKR ZERO (4) SDメモリ

次へ

ESP32入門 通信機能が標準搭載されたマイコン・ボード (9) 測定した温度をWebに表示①