Arduinoを使って、CO2センサーから取った数値をLCDに表示するプログラムを作りたいと思います。
CO2センサーとLCD(液晶ディスプレイ)はI2C通信で接続をします。
I2C通信はマイコンに対して複数の機器を同時に接続できる利点があり、組み込み機器を開発する時にとてもよく使われています。
Arduinoを使うと簡単に実現することができます。
部屋の空気のきれいさを見えるようにでき、I2Cも勉強できるのがうれしいですね。
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
●ジャンパーワイヤー
LCDディスプレイやセンサーは端子がオスになっているので、各種ワイヤーを揃えておくと便利です。
Arduinoと部品の接続
Arduinoと部品は以下のように接続します。
Arduinoは「SDA」ピンと「A4」ピン、「SCL」ピンと「A5」ピンが繋がっているので、今回は「A4」ピンと「A5」ピンを使用しています。
I2Cの通信線である「SDA」「SCL」をLCDとCO2センサーが共有しているのがわかります。
I2C部品のアドレス
I2C通信は、複数の部品が同じ通信線を共有しています。
Arduinoが誰と通信しているかわかるように、部品1つ1つにアドレスが設定されています。
今回使用するLCDディスプレイとCO2センサーのアドレスは以下の通りです。
部品 | アドレス |
---|---|
LCDディスプレイ | 0x27 |
CO2センサー | 0x5A |
部品のアドレスはデータシートや公式HPを見れば調べることができますが、
「I2C_Scanner」というスケッチを使うと、ArduinoにつながっているI2Cデバイスのアドレスをシリアルモニターに表示してくれるので、簡単に調べることができます。
ライブラリの準備
LCDディスプレイ ライブラリ
I2CのLCDディスプレイをArduinoで使うときは、公開されているライブラリを活用すると簡単に動作させることができます。
Arduno IDEで「ライブラリマネージャー」を開き、「LiquidCrystal_I2C」で検索をするとヒットします。
私は以下の画像にあるライブラリをインストールしました。
CO2センサー ライブラリ
上でご紹介した公式HPから専用のライブラリをダウンロードして、Arduinoのライブラリフォルダへ保存することで、簡単にCO2センサーから計測値を取得することができます。
まず、HPにアクセスして「Resource」の下にあるリンクに飛びます。
次に、CCS881のパスまで移動してダウンロードを押下します。
ダウンロードしたファイルをArduinoのライブラリフォルダへ保存します。
私の環境ではライブラリフォルダは以下のパスにありました。
C:\Users\ユーザー名\AppData\Local\Arduino15\libraries
ライブラリのインクルード
上記の方法でインストールしたライブラリは、ArduinoIDEでインクルードすることで使えるようになります。
「スケッチ」タブの「ライブラリのインクルード」の中に、「LiquidCrystal I2C」と「CCS811」が表示されていたら正常にライブラリをインストールできています。
それぞれを選択すると、自動でソースコード内にライブラリファイルがインクルードされます。
ソースコード全文
Arduinoのスケッチ全文は以下の通りです。
#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;
void setup() {
Serial.begin(115200);
// initialize the lcd
lcd.init();
lcd.backlight();
// 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);
}
void loop() {
delay(1000);
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");
}
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);
}
以下で内容を簡単にご紹介します。
I2Cアドレスの設定
// 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;
まずLCDディスプレイのコンストラクタでI2Cアドレス(0x27)と文字数、行数を設定しています。
次にCO2センサーのCCS811クラスのインスタンス(sensor)を宣言していますが、こちらもコンストラクターでI2Cアドレスをデフォルトの「0x5A」に設定しています。
初期設定
void setup() {
Serial.begin(115200);
// initialize the lcd
lcd.init();
lcd.backlight();
// 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);
}
シリアル通信、LCDディスプレイ、CO2センサーの初期設定をしています。
CO2センサーは初期設定に失敗すると、パソコンのシリアルモニタにエラーメッセージを表示します。
メイン処理
void loop() {
delay(1000);
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");
}
else{
Serial.println("Data is not ready!");
}
メインループの中で、センサーから計測値の取得に成功すれば、LCDに取得した値を表示します。
delayを入れないと、LCDが高速で点滅して人間の目では読むことができなくなります。
実行結果
上記のスケッチを実行した結果です。
無事にCO2センサーから取得したデータをLCDディスプレイに表示することができました。
CO2センサーに向かって息を吹きかけるとCO2の数値が上昇するので、正しくCO2を計測できていることがわかります。
まとめ
Arduinoを使ってCO2の数値をLCDディスプレイに表示しました。
I2C通信は、組み込み開発をする上で知っておいて損のない知識です。
実際に手を動かしてイメージを膨らませてみることをオススメします!
コメント