2018年1月23日火曜日

ArduinoでSD記録ロガーを作ってみよう

井戸ポンプ用制御回路をArduinoで作りましたが動作状況は次のように確認できます。
1.本体のLED
2.Bluetoothで測定温度と10秒間平均値をモニター
リアルタイムでの確認の他にはBluetooth経由でタブレットに記録を残すことはできます。

一日の動作状況を確認したいのでSDメモリーにログが残るようにしたいと思います。
今使用しているArduino_pro_minのプログラムメモリーは十分な記憶容量が残っているので、機能を追加する事にします。

Arduinoにはタイマー機能がないので外部RTCと記録用のSDアダプタをamazonで手に入れました。
(ブレッドボードで試作し動作確認を行っています)
右から、Arduino_Nano、RTC(DS3231)、SD、真ん中手前がレベル変換器
電源はPCのUSBから供給しています。


後はArduino_IDEのライブラリーからRTCとSDのスケッチを参考にして作成するだけ。
(合体するだけです。ははは・・)

RTC用スケッチの改造点はRTCの年~秒のデータをシリアルポートに垂れ流しているのを一つの文字列に合体してからシリアルポートに出力することです。
SD用のスケッチからライブラリーとファイルオープン・クローズ関係の記述をRTC用スケッチに移植します。SDへの記録データは先に作った文字列をそのまま使用しました。
実験なので途中で電源を切ってもデータが確実に残るよう、データ1個毎にファイルのオープン・クローズを行っています。
delayを1000mSとしているのでファイル処理の時間分の遅れが蓄積し7~8秒に1回取りこぼしが発生しています。


参考にさせていただいたのは↓です。ありがとうございました。
   https://ht-deko.com/arduino/rtc_ds3231.html
   https://qiita.com/hikoalpha/items/c7812a34182db07036ef

メモ
#include <DS3231.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
File myFile;
DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;
int temperature;
int das[10];
char* dat[]={"-","-"," ",":",":"," "," "};
void setup() {
Wire.begin();
Serial.begin(9600);
   while (!Serial) {
    ;
   }
   Serial.print("Initializing SD card...");
   if (!SD.begin(4)) {
     Serial.println("initialization failed!");
     return;
     }
   Serial.println("initialization done.");
}
void ReadDS3231()
{
  das[5]=Clock.getSecond();
  das[4]=Clock.getMinute();
  das[3]=Clock.getHour(h12, PM);
  das[2]=Clock.getDate();
  das[1]=Clock.getMonth(Century);
  das[0]=Clock.getYear();
  das[6]=Clock.getTemperature();
}
void loop() {
  myFile = SD.open("test.txt", FILE_WRITE);
  ReadDS3231();
  String tes="20";
  for (int i=0;i<=6;i++){
  if (das[i]<10){tes.concat("0");}
  tes.concat(das[i]); tes.concat(dat[i]);
  }
  Serial.println(tes);
  myFile.println(tes);
  delay(1000);
  myFile.close();
}


0 件のコメント:

コメントを投稿