Arduinoマイコンでを使って温湿度計測機能付きの時計の実験をしてみました。これだけあれば、普通の月差数分の時計と、データロガーなどの自動計測装置や各種タイマー、チャイム時計、からくり時計などに使えそうです。
使用部品
- Arduino nano互換ボード
- DS3231リアルタイムクロックモジュール
- LIR2032リチウムイオン電池(充電式)
- MAX7219表示モジュール
- DHT11/DHT22温湿度センサー
プログラム
// 以下は必要なライブラリーを取り込む
#include <Arduino.h> // Arduinoライブラリーを取り込む
#include <Wire.h> // 2線通信ライブラリーを取り込む
#include "DHT.h" // DHT温湿度センサー・ライブラリーを取り込む
#include "LedControl.h" // 7セグメントLEDライブラリーを取り込む
#include <DS3231.h> // 温湿度センサーICライブラリーを取り込む
// 温湿度センサーのピンを定義する
#define DHTPIN 2 // 温湿度センサーが接続されるピン
// 温湿度センサーの機種の前の//を1つだけ消す
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// 温湿度センサーDHTのピン1 (左端) を+5Vに接続
// ※Arduino Dueなどの3.3V動作の場合はピン1を3.3Vに接続
// 温湿度センサーのピン2をDHTPINで設定したデジタル入出力に接続
// 温湿度センサーのピン4 (右端) をGNDに接続
// 10kΩの抵抗をセンサーのピン2(データ)とピン1(電源)に接続
// DHT温湿度センサーの初期化
DHT dht(DHTPIN, DHTTYPE);
DS3231 rtc(SDA, SCL);
// 7セグメントLEDモジュールの初期化
LedControl lc=LedControl(12,11,10,1); // 12 DataIn, 11 CLK, 10 CS(LOAD)
// 変数の定義
Time t; // 日時構造体tを定義
unsigned char p_sec=99; // 8ビット符号なし変数p_secを定義して99に設定
// 初回のみ実行されるプログラム
void setup() {
dht.begin(); // DHT温湿度センサーを開始
Serial.begin(115200); // シリアルを115,200ビット毎秒で開始
lc.shutdown(0,false); // 7セグメントLEDのシャットダウン設定
lc.setIntensity(0,6); // 7セグメントLEDの輝度を6に設定
lc.clearDisplay(0); // 7セグメントLEDの表示を消す
rtc.begin(); // リアルタイム時計を開始
}
// 繰り返し実行されるプログラム
void loop() {
float Temp = dht.readTemperature(); // 温度を読む
float Hum = dht.readHumidity(); // 湿度を読む
t=rtc.getTime(); // 日時を取得
if(p_sec != t.sec) { // 時刻が変わった時だけ処理する
p_sec = t.sec;
if(t.date>9) { // 日が9より大きい場合は2桁表示
lc.setChar(0,7,(String(t.date).charAt(0)),false);
lc.setChar(0,6,(String(t.date).charAt(1)),true);
} else {
lc.setChar(0,7,'0',false);
lc.setChar(0,6,(String(t.date).charAt(0)),true);
}
if(t.hour>9) { // 時が9より大きい場合は2桁表示
lc.setChar(0,5,(String(t.hour).charAt(0)),false);
lc.setChar(0,4,(String(t.hour).charAt(1)),true);
} else {
lc.setChar(0,5,'0',false);
lc.setChar(0,4,(String(t.hour).charAt(0)),true);
}
if(t.min>9) { // 分が9より大きい場合は2桁表示
lc.setChar(0,3,(String(t.min).charAt(0)),false);
lc.setChar(0,2,(String(t.min).charAt(1)),true);
} else {
lc.setChar(0,3,'0',false);
lc.setChar(0,2,(String(t.min).charAt(0)),true);
}
if(t.sec>9) { // 秒が9より大きい場合は2桁表示
lc.setChar(0,1,(String(t.sec).charAt(0)),false);
lc.setChar(0,0,(String(t.sec).charAt(1)),true);
} else {
lc.setChar(0,1,'0',false);
lc.setChar(0,0,(String(t.sec).charAt(0)),true);
}
// 曜日をシリアル(パソコンに)送信
Serial.print(rtc.getDOWStr());
Serial.print(" ");
// 年月日をシリアル(パソコンに)送信
Serial.print(rtc.getDateStr());
Serial.print(" ");
// 時刻をシリアル(パソコンに)送信
Serial.print(rtc.getTimeStr());
Serial.print(" Temp = "); Serial.print(Temp);
Serial.print(" Hum = "); Serial.println(Hum);
}
}
といっても、2wireライブラリ、displayライブラリ、DHTライブラリを組み合わせただけですけど。世界中の先人たちに感謝します。
コメント