(Arduino)DHT11とDS1307のデータをSDカードに保存する(その1)

1.はじめに

一通りOSの載ったラズパイで実現している、BME280を使った温湿データの保存をArduinoでやってみた。ラズパイだとSDカードに保存することも時間の取得もスル〜と実現し、中心は「温湿データをどう取得するか」という点に集中することになるが、ArduinoだとOSがないので、温湿データの取得に加え、時間データを取得すること、SDカードにそれらを書き込むことすべてが課題となってくる。

これがOSのやっていることだと思うと、OSのありがたみを非常に感じました。

目指したのは、DHT11で取得した温湿データをDS1307で取得した測定時刻とともに、DS1307で取得した「年月日ファイル.csv」の形でSDカードに保存すること。

2.接続例

DHT11ArduinoDS1307SDcard
3.3V3V3
+5VVCC
4CS
S7
11MOSI
12MISO
13CLK
GNDGNDGND
A4SDA
A5SCL

3.完成したコード

#include <SPI.h>
#include <SD.h>
#include <SimpleDHT.h>
#include <Wire.h>
#define RTC_address 0x68

int pinDHT11= 7;
SimpleDHT11 dht11(pinDHT11);
char *week[] = {"日","月","火","水","木","金","土"};
uint8_t REG_table[7];
File myFile;

void setup() {
  // Open serial communications and wait for port to open:
  Wire.begin();
  Serial.begin(115200);
  //RTCにデータを書き込む
  Wire.beginTransmission(RTC_address);
  Wire.write(0x00);//Register 先頭アドレス
  Wire.write(0x30);//second
  Wire.write(0x59);//minute
  Wire.write(0x12);//hour
  Wire.write(0x04);//week
  Wire.write(0x03);//day
  Wire.write(0x06);//month 
  Wire.write(0x21);//year
  Wire.endTransmission();
}

void loop() {
  Serial.println("=================================");
    // put your main code here, to run repeatedly:
  Wire.beginTransmission(RTC_address);
  Wire.write(0x00);//Register 先頭アドレス
  Wire.endTransmission();

  //RTCデータの読み込み
  Wire.requestFrom(RTC_address,7);
  for(int i=0;i<=7;i++){
  REG_table[i]=Wire.read();
  }
  
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
   
   Serial.println("initialization done.");
  // start working...
  // read without samples.
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;

  
 if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.print(SimpleDHTErrCode(err));
    Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000);
    return;
  }
  

//  Serial.print("Sample OK: ");
   Serial.print(REG_table[2],HEX);//hour
   Serial.print(":");
   Serial.print(REG_table[1],HEX);//minute
   Serial.print(",");
   Serial.print(temperature); Serial.print(" C, ");
   Serial.print(humidity); Serial.println(" %");

 // if the file opened okay, write to it:
myFile=SD.open(String(REG_table[6],HEX)+String(REG_table[5],HEX)+String(REG_table[4],HEX)+".csv",FILE_WRITE);  //filename:xxyyzz,csv read&write mode
  if (myFile){
    //write contents: time temperature,humidity
    myFile.print(REG_table[2],HEX); //hour
    myFile.print(":");
    myFile.print(REG_table[1],HEX); //minute
    myFile.print(",");
    myFile.print(temperature);
    myFile.print(",");
    myFile.println(humidity); 
    // close the file:
    myFile.close();
    Serial.println("sdcard write done.");
    } else {
    // if the file didn't open, print an error:
    Serial.println("error opening file");
    Serial.print(temperature); Serial.print(" C, "); 
    Serial.print(humidity); Serial.println(" %");
    Serial.println("file write failed!");
    }
 
// re-open the file for reading:
myFile=SD.open(String(REG_table[6],HEX)+String(REG_table[5],HEX)+String(REG_table[4],HEX)+".csv");
  if (myFile) {
      Serial.println("read file:");

   // read from the file until there's nothing else in it:
        while (myFile.available()) {
          Serial.write(myFile.read());
        }
    // close the file:
        myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening file");
  }
  // DHT11 sampling rate is 1HZ.
  delay(300000UL); // per 5 minutes
}

4.実行結果

シリアル通信の出力結果

5.SDカードへの保存状況

$ ls -al /mnt

total 20
-rwxr-xr-x 1 root root 874 Jan 1 2000 2295.CSV
-rwxr-xr-x 1 root root 876 Jan 1 2000 2296.CSV

(省略)

$ cat /mnt/2296.csv

0:0,24,81
0:5,24,81
0:10,24,81
0:15,24,81
0:20,23,81
0:25,23,81
0:30,23,81
0:35,23,81
0:40,23,82
0:45,23,81
0:50,23,81
0:55,23,82
1:0,23,82

(省略)

時刻とファイル名の桁が異なっており、これも統一したいな〜!

6.参考

DHT11 関係・・スケッチ例のSimpleDHT

SDcard関係・・・

https://101010.fun/iot/arduino-micro-sd.html

https://ameblo.jp/geotechlab-workshop/entry-12566563241.html

DS1307関係・・・

https://blog.goo.ne.jp/jh7ubc/e/5c90fc7c5600c8581ae90b9c9f9f5f83

http://jh7ubc.web.fc2.com/arduino/Arduino_RTC_DS1307.html

コメント

タイトルとURLをコピーしました