この記事は、前回ご紹介したArduinoでCO2センサーから取得した数値をLCDへ表示するスケッチの続きとなります。
今回は上記のシステムにSDカードを追加して、CO2センサーで取得した数値を同時にSDカードへ保存していくスケッチを作りたいと思います。
ArduinoとSDカードはSPI通信で接続します。
SPI通信はI2Cと同じで、マイコンに対して複数の機器を同時に接続することができます。
組み込み機器を開発するときにとてもよく使われています。
準備するもの
この記事では、以下の物を使います。
●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と部品は以下のように接続します。
ソースコード全文
/*
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センサから取得したデータを表示することができています。
肝心のSDカードの中身を見てみます。
「DATALOG.TXT」のファイルが作成されています。
ファイルの中身はCSVデータになっています。
CO2濃度をグラフにすることができました。
最初、部屋で作業していた時は徐々に濃度が上がっていますが、そのあと部屋を出て放置していたので徐々に下がっています。
まとめ
Arduinoを使ってCO2センサーの値をLCDに表示すると同時に、SDカードに保存しました。
SDカードのデータを使うとグラフ化なども簡単にできて、よりCO2を管理しやすくなりました。
SPI通信についてもI2Cとはまた違った特徴があり、状況に応じて使い分けていく必要がありそうですね。
みなさんも、是非、部屋のCO2濃度を見える化してみてください!
コメント