1.はじめに
一通りOSの載ったラズパイで実現している、BME280を使った温湿データの保存をArduinoでやってみた。ラズパイだとSDカードに保存することも時間の取得もスル〜と実現し、中心は「温湿データをどう取得するか」という点に集中することになるが、ArduinoだとOSがないので、温湿データの取得に加え、時間データを取得すること、SDカードにそれらを書き込むことすべてが課題となってくる。
これがOSのやっていることだと思うと、OSのありがたみを非常に感じました。
目指したのは、DHT11で取得した温湿データをDS1307で取得した測定時刻とともに、DS1307で取得した「年月日ファイル.csv」の形でSDカードに保存すること。
2.接続例
DHT11 | Arduino | DS1307 | SDcard |
3.3V | 3V3 | ||
+ | 5V | VCC | |
4 | CS | ||
S | 7 | ||
11 | MOSI | ||
12 | MISO | ||
13 | CLK | ||
– | GND | GND | GND |
A4 | SDA | ||
A5 | SCL |
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
コメント