一覧へ   前へ<<  >>次へ


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分置きで十分ですね。

今日、奥さんに「百葉箱を作りたい」と言うと、「小さいのならいいよ」と許可が下りました。

来週以降、考えてみたいと思います。