以前から部屋の二酸化炭素濃度はどうなっているんだろう?と気になっていて、CO2モニターを作ろうと材料は用意していたのですが・・・
一年越しの作成です。
コロナウイルスの件で、改めて換気の重要性が数値化できるのではないかと思い、やっとやる気が出ました(^^;)
材料は
・マイコン:Arduino UNO
・表示器:LCD Shield
・台:100均のスマホスタンドを使ってみました(いい感じです)
センサーとマイコンはUARTで接続できます。ソフトウエアシリアルで接続しました。
ハードのほうでLogを取ったりするのもよいと思います。
センサーから0~5000ppmまでの値が出力されます。
Arduinoのライブラリも公開されていて簡単に作成できました。
温度も一応表示しましたが、ライブラリのコメントにもあるように精度は良くないですが参考になります。
CO2モニターを目の前に置き、作業をしているとみるみる数値が上がっていきます。
ちなみに、室内のCO2濃度が1000ppmになると、思考力、集中力が減少 するとか・・
ちなみに、室内のCO2濃度が1000ppmになると、思考力、集中力が減少 するとか・・
だから冬、ファンヒーターたいて作業してるとすぐ眠くなるのか...な?
下の表はここから引用
空気中のCO2濃度 | 有害ガスが人体に作用する時間 |
250-350ppm | 大気中における通常濃度 |
250-1000ppm | 換気が十分実施されている屋内の通常数値 |
2000-5000ppm | 換気の悪い部屋 頭痛、眠気、倦怠感、注意力散漫、心拍数の増加、吐き気の発生 |
5,000ppm以上 | 作業場所としての限界値(8時間-TWA) |
>40,000ppm以上 | 酸素障害誘発、脳へのダメージによる昏睡、最悪死に至る |
作ったCO2モニターで観察してみると、外では440ppmくらい。
室内の換気は結構こまめに行う必要があることがわかりました。
呼気も顔周辺にこもるようです。暖房や冷房を使ってなくてもサーキュレーターは効果があるかもしれません。
植物を部屋に置くことも良いかもしれません。
以前聞いた話ですが「室内で野菜を栽培しようとして光合成に必要な二酸化炭素量は足りているのか?と測定してみたところ思いのほか二酸化炭素量が少なかった」とのことでした。
センサーの校正は必要かもしれませんが相対量としては参考になると思います。
(絶対値としてみてもそんなに悪い気はしませんが...知識不足でわかりません(^^;))
密になりそうな部屋にモニターを置いて換気を促すきっかけにするのもよいと思いました。
ーーーーー Arduino スケッチ -----
/* CO2モニタ
* LCDモニターにCO2濃度(ppm)を表示)
* CO2センサー(MH-Z19B)
* 接続 センサー Arduino
* 赤 → 5V
* 黒 → GND
* 緑 → A0
* 青 → A1
*/
// include the library code:
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include<Wire.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial MHZ19Serial(A0, A1);//sensor green→A0 blue→A1
byte Request[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
struct Response {
word header;
byte vh;
byte vl;
byte temp;
byte tails[4];
} __attribute__((packed));;
void setup() {
MHZ19Serial.begin(9600);
Serial.begin(9600);
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
}
void loop() {
struct Response response;
MHZ19Serial.write(Request, sizeof Request);
MHZ19Serial.readBytes((char *)&response, 9);
if (response.header != 0x86ff) {
return;
}
word ppm = (response.vh << 8) + response.vl;
byte temp = response.temp - 41;
Serial.print(ppm);
Serial.print(" ");
// Serial.println(temp);
Serial.print(temp); // XL232Logger にデータを転送する場合は改行しない
Serial.print(" ");
// set the cursor to (0,0):
lcd.setCursor(0, 0);
lcd.print("CO2 ");
lcd.print(ppm);
lcd.print("ppm");
lcd.setCursor(12, 0);
// lcd.print("Temp ");
lcd.print("T");
lcd.print(temp);
lcd.print("\xdf");
// lcd.print("C");
if (ppm>3000){ //3000ppを超えると危険を表示およびLEDを長めに点灯
lcd.setCursor(0,1);
lcd.print(" ");
for (int i=0; i <=3; i++){
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
// delay(5); // wait for a second
// digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
lcd.setCursor(0,1);
lcd.print("Danger!");
delay(500);
lcd.setCursor(0,1);
lcd.print(" ");
delay(500);
lcd.setCursor(0,1);
lcd.print("Danger!!");
delay(500);
lcd.setCursor(0,1);
lcd.print(" ");
delay(500); // wait for a second
}
}else if (ppm>2000){ //2000ppmを超えると警告LED点滅
lcd.setCursor(0,1);
lcd.print(" ");
for (int i=0; i <=3; i++){
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(5); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
lcd.setCursor(0,1);
lcd.print("Caution!");
delay(900);
lcd.setCursor(0,1);
lcd.print(" ");
delay(100);
lcd.setCursor(0,1);
lcd.print("Caution!!");
delay(900);
lcd.setCursor(0,1);
lcd.print(" ");
delay(100); // wait for a second
}
}else if (ppm>1000){ //1000ppmを超えると換気を促す
lcd.setCursor(0,1);
lcd.print(" ");
for (int i=0; i <=3; i++){
lcd.setCursor(0,1);
lcd.print("Ventilate now!");
delay(1500);
lcd.setCursor(0,1);
lcd.print(" ");
delay(500);
}
}else{
lcd.setCursor(0,1);
lcd.print("It's safe. (^^)");
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(6015);
}
// clear screen for the next loop:
lcd.clear();
}
* LCDモニターにCO2濃度(ppm)を表示)
* CO2センサー(MH-Z19B)
* 接続 センサー Arduino
* 赤 → 5V
* 黒 → GND
* 緑 → A0
* 青 → A1
*/
// include the library code:
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include<Wire.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial MHZ19Serial(A0, A1);//sensor green→A0 blue→A1
byte Request[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
struct Response {
word header;
byte vh;
byte vl;
byte temp;
byte tails[4];
} __attribute__((packed));;
void setup() {
MHZ19Serial.begin(9600);
Serial.begin(9600);
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
}
void loop() {
struct Response response;
MHZ19Serial.write(Request, sizeof Request);
MHZ19Serial.readBytes((char *)&response, 9);
if (response.header != 0x86ff) {
return;
}
word ppm = (response.vh << 8) + response.vl;
byte temp = response.temp - 41;
Serial.print(ppm);
Serial.print(" ");
// Serial.println(temp);
Serial.print(temp); // XL232Logger にデータを転送する場合は改行しない
Serial.print(" ");
// set the cursor to (0,0):
lcd.setCursor(0, 0);
lcd.print("CO2 ");
lcd.print(ppm);
lcd.print("ppm");
lcd.setCursor(12, 0);
// lcd.print("Temp ");
lcd.print("T");
lcd.print(temp);
lcd.print("\xdf");
// lcd.print("C");
if (ppm>3000){ //3000ppを超えると危険を表示およびLEDを長めに点灯
lcd.setCursor(0,1);
lcd.print(" ");
for (int i=0; i <=3; i++){
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
// delay(5); // wait for a second
// digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
lcd.setCursor(0,1);
lcd.print("Danger!");
delay(500);
lcd.setCursor(0,1);
lcd.print(" ");
delay(500);
lcd.setCursor(0,1);
lcd.print("Danger!!");
delay(500);
lcd.setCursor(0,1);
lcd.print(" ");
delay(500); // wait for a second
}
}else if (ppm>2000){ //2000ppmを超えると警告LED点滅
lcd.setCursor(0,1);
lcd.print(" ");
for (int i=0; i <=3; i++){
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(5); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
lcd.setCursor(0,1);
lcd.print("Caution!");
delay(900);
lcd.setCursor(0,1);
lcd.print(" ");
delay(100);
lcd.setCursor(0,1);
lcd.print("Caution!!");
delay(900);
lcd.setCursor(0,1);
lcd.print(" ");
delay(100); // wait for a second
}
}else if (ppm>1000){ //1000ppmを超えると換気を促す
lcd.setCursor(0,1);
lcd.print(" ");
for (int i=0; i <=3; i++){
lcd.setCursor(0,1);
lcd.print("Ventilate now!");
delay(1500);
lcd.setCursor(0,1);
lcd.print(" ");
delay(500);
}
}else{
lcd.setCursor(0,1);
lcd.print("It's safe. (^^)");
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(6015);
}
// clear screen for the next loop:
lcd.clear();
}