電子工作

【Arduino】センサーのログをSDカードに書き込む

はじめに

前回の記事では、BMP180と、Arduinoに標準搭載されているシリアルプロッタを用いて気圧の変化を測定しました。

しかし、シリアルプロッタでは気圧が変化していることは分かりますがグラフとしては非常に見にくいものです。折角値が取れているのですから、気圧値をエクセル等でグラフとして清書したいですよね?

今回はArduino+センサで取得した値をSDカードに記録していく方法について解説します。

コード

まずは今回使用したコードから。

#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;
const int CS = 4;

void setup() {
    bmp.begin(); //気圧センサ読み込み
    Serial.begin(9600); //シリアル通信開始
    Serial.println("Initializing SD.....");
    pinMode(10, OUTPUT);

    if (!SD.begin(CS)) {
        Serial.println("not found SD");
    } else {
        Serial.println("SD OK");
    }
}

void loop() {
    String dataStr = ""; //String型の宣言
    dataStr += String(double(bmp.readPressure()) / 100); //センサの値を文字列として結合

    File dataFile = SD.open("log.txt", FILE_WRITE);
    
    if (dataFile) {
        Serial.println(dataStr); //シリアルコンソールに値を表示
        dataFile.println(dataStr); //SDに文字列を書き込み
        dataFile.close();
    } else {
        Serial.println("File write error!");
    }
    delay(60000);
}

このコードを実行すると、log.txtというファイルをSDカード上に作成し、気圧(hpa)を1分間隔で書き込んでいきます。

インクルードするライブラリ

#include~となっている部分についての説明です。

ArduinoからSDカードへのデータの読み書きを行うための「SD.h」というライブラリがあります。加えて、SDカードの書き込みにはSPI通信を利用しているので、SPI通信を行うための「SPI.h」というライブラリをインクルードする必要があります。

ライブラリ名説明
SD.hSDの読み書きを行う
SPI.hSPI通信を行う
Wire.hI2C通信を行う(センサー用)
Adafruit_BMP085.h気圧センサのライブラリ

Setup関数

ここでは気圧センサの読み込み、シリアル通信の開始、SDカードと通信できる状態かどうかの確認を行っています。

SD.begin(CS)が失敗した場合はSDカードが見つかりませんとエラーを吐くようになっています。

Loop関数

ここは繰り返し処理される部分になります。

データを文字列として格納する”dataStr”という変数を宣言し、これにbmp180で取得したセンサーの値を追記して上書きしています。(23~24行目)

26行目は書き込みモードでSDカード内にlog.txtというファイルを作る命令です。

28~32行の処理で先程作った “dataStr” の中身を書き込んでいます。

35行目で一定時間待つ指示をしています。delay関数の引数の単位はmsec(ミリ秒)です。例題のプログラムでは1分間待つ指示になっていますが、実際の用途では10分間隔ぐらいにすると良いと思います。