一覧へ 前へ<< >>次へ
Arduino + RTC + Temp.Measurement (2017年09月25日更新)
RTCのプログラムと、温度測定を合体させました。 |
最初のコンパイル+転送、では、時間の表示がおかしくなっていました。 理由は不明。。。
再度、RTCだけの表示でもエラー、つなぎ直してOK、再度、下記のプログラムを動かすとうまくいきました。
|
シリアルモニタでの表示プログラム |
//SDカードへのカキコミと温度計測プログラム用の初期設定
#include <SPI.h> #include <SD.h> const int chipSelect = 4; int analogPin = 0; // A0の抵抗 int val = 0; float Vt; float Rt; float T0; float R0; float B; float Temp;
//RTC(クロック)用の初期設定
#include #include "RTClib.h" RTC_DS1307 RTC;
void setup () { Serial.begin(9600); //RTC(クロック)の使用準備 Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } }
void loop () {
//温度計測のプログラム val = analogRead(analogPin); Vt = val * 5 / 1023.0; Rt = Vt * 5000 / ( 5.0 - Vt); T0 = 25; R0 = 10000; B = 3380; //温度センサーの値を摂氏度℃に変換 Temp = 1/(log(Rt / R0) / B + 1/(273+T0))-273 ;
String dataString = ""; dataString += String(Temp); dataString += ","; //時計表示の準備 DateTime now = RTC.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.print(' '); Serial.print(dataString); Serial.println();
delay(5000);
}
|
時刻、温度をSDカードに記録 |
一定時間ごとに記録をする必要があるので、1分毎に、秒が0になったら、記録するようにプログラムを組み直しました。(とてもベタですが・・・)
10分毎や1時間毎にするには更に変更が必要です。
また、1時間ごとにファイル名を変更して保存するようにしています。 9月24日の10時であれば、DL092410.TXTという感じ。 1時間ごとで60のデータずつとなるなので、1日置きに変えても良いかも知れません。
4桁の西暦をファイル名に含めるとエラーが発生し、西暦は除外しました。 ファイル名の文字数に制限があるのかも知れません。
■■■■ここからコピペください■■■■■
//SDカードへのカキコミと温度計測プログラム用の初期設定
#include <SPI.h> #include <SD.h> const int chipSelect = 4; int val = 0; float Vt; float Rt; float T0; float R0; float B; float Temp1; float Temp2;
//RTC(クロック)用の初期設定 #include #include "RTClib.h" RTC_DS1307 RTC;
void setup () { Serial.begin(9600); //SDカードへのカキコミの準備 Serial.print("Initializing SD card..."); pinMode(4, OUTPUT); if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); return; } Serial.println("card initialized.");
//RTC(クロック)の使用準備 Wire.begin(); RTC.begin();
// following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!");
} }
void loop () {
DateTime now = RTC.now();
if( String(now.second()) == "0" ) { //温度計測のプログラム val = analogRead(A0); Vt = val * 5 / 1023.0; Rt = Vt * 5000 / ( 5.0 - Vt); T0 = 25; R0 = 10000; B = 3380; //温度センサーの値を摂氏度℃に変換 Temp1 = 1/(log(Rt / R0) / B + 1/(273+T0))-273 ;
val = analogRead(A1); Vt = val * 5 / 1023.0; Rt = Vt * 5000 / ( 5.0 - Vt); T0 = 25; R0 = 10000; B = 3380; //温度センサーの値を摂氏度℃に変換 Temp2 = 1/(log(Rt / R0) / B + 1/(273+T0))-273 ; //カキコミの準備 String dataString = "";
dataString += String(now.year(), DEC); dataString += "/";
if (now.month() < 10) { dataString += "0"; dataString += String(now.month(), DEC); } else { dataString += String(now.month(), DEC); }
dataString += "/"; if (now.day() < 10) { dataString += "0"; dataString += String(now.day(), DEC); } else { dataString += String(now.day(), DEC); }
dataString += " ";
if (now.hour() < 10) { dataString += "0"; dataString += String(now.hour(), DEC); } else { dataString += String(now.hour(), DEC); } dataString += ":";
if (now.minute() < 10) { dataString += "0"; dataString += String(now.minute(), DEC); } else { dataString += String(now.minute(), DEC); }
dataString += ":"; if (now.second() < 10) { dataString += "0"; dataString += String(now.second(), DEC); } else { dataString += String(now.second(), DEC); } dataString += ","; dataString += String(Temp1); dataString += ","; dataString += String(Temp2);
String strFileNme = ""; strFileNme = "DL"; //strFileNme += String(now.year(), DEC); if (now.month() < 10) { strFileNme += "0"; strFileNme += String(now.month(), DEC); } else { strFileNme += String(now.month(), DEC); } if (now.day() < 10) { strFileNme += "0"; strFileNme += String(now.day(), DEC); } else { strFileNme += String(now.day(), DEC); }
if (now.hour() < 10) { strFileNme += "0"; strFileNme += String(now.hour(), DEC); } else { strFileNme += String(now.hour(), DEC); } strFileNme += ".TXT"; //Serial.println(strFileNme); File dataFile = SD.open(strFileNme, FILE_WRITE); //ファイル名 if (dataFile) { //SDカードのファイルが無事開けたら(ない場合は新規作成) dataFile.println(dataString); //dataStringに入っている内容を書き込み dataFile.close(); //書き込み後ファイルを閉じる Serial.println(dataString); } else { Serial.println("error opening datalog.txt"); } }
delay(1000);
} |
|

|
時刻 温度の測定結果 |
開始後、センサー部を指で握ってみましが、ちゃんと、SDカードに記録されていました。v(^^)/
2017/9/10 12:28:26 Temp: 28.66 2017/9/10 12:28:31 Temp: 28.66 2017/9/10 12:28:36 Temp: 30.36 2017/9/10 12:28:41 Temp: 32.39 2017/9/10 12:28:46 Temp: 33.41 2017/9/10 12:28:51 Temp: 32.51 2017/9/10 12:28:56 Temp: 31.72 2017/9/10 12:29:1 Temp: 31.04 2017/9/10 12:29:6 Temp: 30.59
|
センサーを庭に置き、測ってみた |
センサーを囲っているチューブが黒いので、温度が高くなりすぎていますが、記録を取ることができました。
データは1分か、10分置きで十分ですね。
今日、奥さんに「百葉箱を作りたい」と言うと、「小さいのならいいよ」と許可が下りました。
来週以降、考えてみたいと思います。 |
|