ArduinoでCO2センサーの値をSDカードに保存する

アイキャッチ画像 Arduino
スポンサーリンク

この記事は、前回ご紹介したArduinoでCO2センサーから取得した数値をLCDへ表示するスケッチの続きとなります。

ArduinoでCO2センサーの値をLCDに表示する
Arduinoを使って、CO2センサーから取った数値をLCDに表示するプログラムを作りたいと思います。 CO2センサーとLCD(液晶ディスプレイ)はI2C通信で接続をします。I2C通信はマイコンに対して複数の機器を同時に接続できる利点があり...

今回は上記のシステムにSDカードを追加して、CO2センサーで取得した数値を同時にSDカードへ保存していくスケッチを作りたいと思います。

ArduinoとSDカードはSPI通信で接続します。

SPI通信はI2Cと同じで、マイコンに対して複数の機器を同時に接続することができます。
組み込み機器を開発するときにとてもよく使われています。

こんな人にオススメ
  • ArduinoとSDカードを組み合わせてデータを保存したい
  • SPI通信について勉強したい

準備するもの

この記事では、以下の物を使います。

●Arduino Uno

amazonのスイッチサイエンスから購入する純正のArduinoは、永久保証を受けることができます。
ブレッドボードや電子部品が付いてくるので、すぐに工作を始めることができます。

●LCDディスプレイ

16文字×2行を表示することができるLCDディスプレイです。
本来LCDディスプレイはパラレル信号を入力しないといけませんが、この商品はパラレル通信⇔I2C通信を変換してくれる回路が元から付いているので、I2C通信によるやりとりが可能です。

●CO2センサー

I2C通信で接続することができるCO2センサーです。
精度はそれほど信用できるものではありませんが、手軽にArduinoでCO2を計測することができます。

詳細な使い方は以下の公式HPで紹介されています。
https://wiki.keyestudio.com/KS0457_keyestudio_CCS811_Carbon_Dioxide_Air_Quality_Sensor

●マイクロSDカード シールド

SPI通信で接続することができるマイクロSDカードシールドです。
手軽にArduinoでSDカードとの連携をすることができます。

SDカードは3.3Vで動作しますがArduinoの電源は5Vなので、本来はそのまま接続するとSDカードが壊れてしまいます。
ですがこのシールドは5Vを3.3Vに変換するチップが付いているので、そのままArduinoと接続しても問題ありません。

●マイクロSDカード

一般的なマイクロSDカードです。

●ジャンパーワイヤー

LCDディスプレイやセンサーは端子がオスになっているので、各種ワイヤーを揃えておくと便利です。

Arduinoと部品の接続

Arduinoと部品は以下のように接続します。

ArduinoとSDカードシールドのつなぎ方

ソースコード全文

/*
  The circuit:
   SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 */
#include <SD.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <CCS811.h>

// set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27,16,2);
// CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);
CCS811 sensor;
// 今回追加
//SD:CS 10
const int chipSelect = 4;

void setup() {

  Serial.begin(115200);

  // LCDの初期化
  // initialize the lcd 
  lcd.init();
  lcd.backlight();
  
  // CO2センサーの初期化
  // Wait for the chip to be initialized completely, and then exit
  while(sensor.begin() != 0){
    Serial.println("failed to init chip, please check if the chip connection is fine");
    delay(1000);
  }
  // @brief Set measurement cycle
  sensor.setMeasCycle(sensor.eCycle_250ms);

  // SDカードの初期化
  lcd.setCursor(0,0);
  lcd.print("Initializing SD");
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Card failed,");
    lcd.setCursor(0,1);
    lcd.print("or not present");
    // don't do anything more:
    while (1);
  }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("card initialized.");
  delay(1000);
  SD.remove("datalog.txt");
}

void loop() {
  delay(1000);
  
  // make a string for assembling the data to log:
  String dataString = "";

  if(sensor.checkDataReady() == true){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("CO2: ");
    lcd.print(sensor.getCO2PPM());
    lcd.print("ppm");
    lcd.setCursor(0,1);
    lcd.print("TVOC: ");
    lcd.print(sensor.getTVOCPPB());
    lcd.print("ppb");

    // append to the string
    dataString += String(sensor.getCO2PPM());
    dataString += ",";

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
  }
  }
  else{
    Serial.println("Data is not ready!");
  }

  /*!
   * @brief Set baseline
   * @param get from getBaseline.ino
   */
  sensor.writeBaseLine(0x847B);
  //delay cannot be less than measurement cycle
  //delay(1000);
}

以下で内容を簡単にご紹介します。

SDカードのスケッチ例

SDカードを使用するスケッチはArduino IDEのスケッチ例「ファイル>スケッチ例>SD>Datalogger」に準備されています。
今回はこのスケッチ例と、前回ご紹介したCO2センサーとLCDのスケッチを合体させます。

このスケッチ例を開くと、以下の説明分とライブラリがインクルードされています。

/*
  The circuit:
   SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 */
#include <SD.h>
#include <SPI.h>

SDカードを操作するための信号「MOSI」「MISO」「CLK」「CS」はそれぞれArduinoの「pin11」「pin12」「pin13」「pin4」に接続する必要があるようです。

SDカードの初期化

以下でSDカードを初期化しています。

  // SDカードの初期化
  lcd.setCursor(0,0);
  lcd.print("Initializing SD");
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Card failed,");
    lcd.setCursor(0,1);
    lcd.print("or not present");
    // don't do anything more:
    while (1);
  }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("card initialized.");
  delay(1000);
  SD.remove("datalog.txt");

SDカードが挿さっていなければエラーメッセージをLCDに表示して、SDカードが挿さっていていて初期化に成功すれば成功したメッセージをLCDに表示します。

毎回新しいデータを作成するため、最後にSDカード内の「datalog.txt」ファイルを削除します。

SDカードへデータの書き込み

以下で、データを作成してSDカードへ書き込みしています。

  // make a string for assembling the data to log:
  String dataString = "";
    // append to the string
    dataString += String(sensor.getCO2PPM());
    dataString += ",";

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
  }

「dataString」を空の文字列で初期化して、センサから取得したデータとカンマ(,)を入れます。
毎回この文字列をSDカードへ書きこむことでCSVファイルを作ることができます。
CSVファイルは、のちほどExcelなどを使ってグラフ化するときに便利ですね。

「datalog.txt」のファイルを開いて(なければ作成して開いて)「dataString」の文字列を書き込み、ファイルを閉じて1回のルーティンが終わりです。
これを何度も繰り返します。

実行結果

上記のスケッチを実行した結果です。
LCDにはCO2センサから取得したデータを表示することができています。

ArduinoとSDカードを接続した結果

肝心のSDカードの中身を見てみます。
「DATALOG.TXT」のファイルが作成されています。

SDカードのデータ

ファイルの中身はCSVデータになっています。

CSVデータの中身

CO2濃度をグラフにすることができました。
最初、部屋で作業していた時は徐々に濃度が上がっていますが、そのあと部屋を出て放置していたので徐々に下がっています。

CO2濃度のグラフ

まとめ

Arduinoを使ってCO2センサーの値をLCDに表示すると同時に、SDカードに保存しました。
SDカードのデータを使うとグラフ化なども簡単にできて、よりCO2を管理しやすくなりました。

SPI通信についてもI2Cとはまた違った特徴があり、状況に応じて使い分けていく必要がありそうですね。

みなさんも、是非、部屋のCO2濃度を見える化してみてください!

Arduino
スポンサーリンク
tsubablog

メーカーで組み込みプログラマーとして勤務しているサラリーマンです。
プログラミングの楽しさについて発信しています。

業務で扱っている言語はC、C++です。

tsubablogをフォローする
つばブログ

コメント

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