- Home
- 移動オフィス実証実験
- 仕事に最適な車環境を実現するため、モニタリングを実施したい。というわけで、車内環境センサーを開発した
仕事に最適な車環境を実現するため、モニタリングを実施したい。というわけで、車内環境センサーを開発した
- 2020/5/18
- 移動オフィス実証実験
- 5 comments
発端
自家用車をオフィスとして活用すると決めた際、真っ先に気になったのが、高低温・高湿のような車内環境の悪化にどれだけ耐えられるのだろうか、ということだった。
春や秋などの過ごしやすい季節はまだしも、高温多湿な夏場、低温となる冬場などに対策無しで挑むと、下手をすれば死ぬことになりかねない。
また、そもそもの発端である「タバコを吸いながら仕事をしたい!」という要件について、それがどれだけ車内の空気を悪化させるのかについても調査を行う必要がある。
できれば、環境センサーのモニタリング結果に応じ自動的に排気ファンが回ったり除湿器が動いたり、女の子の声で「空気が汚れていますよ。タバコの吸いすぎには注意してくださいね!」とか言われたい。
というわけで、車内の環境を調査するためのセンサーを開発することにした。
車内環境センサー・プロトタイプの開発
要件
- 今後のシステム拡張を鑑み、出来合いのものではなく、独自センサーを開発しておく
- まずは最低限の要件として温度・湿度・煙の状態をモニターする
- データロギング、トリガーの設定などは、現段階では行わない
- モニター結果は随時ディスプレイで確認可能とする
プロトタイプ
オフィスに転がっているArduino互換機・センサー・LCDディスプレイを使用することとした。こういう「とりあえずやってみよう」みたいなことを実行する際には、Arduinoは非常に取り回しが良い。
使用した部品は以下の通り。
- Arduino micro互換機
- 温湿度計センサー DTH11
- ガスセンサー MQ-2
- LCDディスプレイ 1602A
- LCDディスプレイI2C接続用基板 LCM1602IIC
ソースコード
Arduinoのライブラリからサンプルコードを探し、それを適当に切り貼りして作成した。一応動くが、あまり参考にしないでいただきたい。追加開発の際に見直す予定だ。
//DHT11 温湿度センサモジュールを使い温度、湿度を測定
//MQ2 煙センサーを使い煙の量を測定
//1602A LCDディスプレイに結果を表示
//宣言 DHT11部
#include “DHT.h” //ライブラリインクルード
#define DHT_Pin 8 //DHT11のDATAピンを定義
#define DHT_Type DHT11 //センサの型番定義 DHT11
DHT dht(DHT_Pin, DHT_Type); //センサ初期化
//宣言 MQ2部
#define Analog_Pin 2 //MQ2のAnalogピンを定義
//宣言 1602A部
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
/* 計測値設定 */
float humidity = 0.0f; //湿度
float tempC = 0.0f; //摂氏温度
float discomfortIndex = 0.0f; //不快指数
// 計測値 煙センサー
int smokeV; //煙センサーのアナログアウト値
void setup() {
Serial.begin(9600); //シリアル通信のデータ転送レートを9600bpsで指定。bpsはビット/秒。
dht.begin(); //温湿度センサー開始
// LCD開始
lcd.init();
lcd.backlight();
}
void loop() {
delay(1000); //1秒待つ データの読み出し周期1秒以上必要。
humidity = dht.readHumidity(); //湿度の読み出し
tempC = dht.readTemperature(); //温度の読み出し 摂氏
delay(1000); //1秒待つ
smokeV = analogRead(Analog_Pin); //煙センサーの読み出し
/* 読み取れたかどうかのチェック */
if (isnan(humidity) || isnan(tempC)) {
Serial.println(“Read failure!”);
return;
}
/* 不快指数計算 */
discomfortIndex = 0.81f * tempC + 0.01f * humidity * (0.99f * tempC – 14.3f) + 46.3f;
/* 以下読み取り値の表示 */
Serial.print(“HU: “);
Serial.println(humidity,1);
Serial.print(“TE: “);
Serial.println(tempC,1);
Serial.print(“DI: “);
Serial.println(discomfortIndex,1);
Serial.print(“SM: “);
Serial.println(smokeV,1);
/* LCD表示 */
String sx = zeroPad(3,smokeV
);
lcd.setCursor(0, 0);
lcd.print(“HUM”);
lcd.println(humidity,1);
lcd.setCursor(7,0);
lcd.print(” “);
lcd.setCursor(8,0);
lcd.print(“TEM”);
lcd.println(tempC,1);
lcd.setCursor(15,0);
lcd.println(” “);
lcd.setCursor(0, 1);
lcd.print(“DIS”);
lcd.println(discomfortIndex,1);
lcd.setCursor(7,1);
lcd.print(” “);
lcd.setCursor(8, 1);
lcd.print(“SMO “);
lcd.println(sx);
lcd.setCursor(15,1);
lcd.println(” “);
}
String zeroPad(int numLength, int num) {
/* numをnumLength桁になるようにゼロ埋めしたString型の変数で返す関数
*/
byte minus = 0;
if (num < 0) {
num = abs(num);
minus = 1;
}
String NUM = String(num);
String ZERO = “0”;
if (num == 0) {
for (int i = 2; i <= numLength; i++) {
ZERO.concat(NUM);
NUM = ZERO;
ZERO = “0”;
}
} else {
for (int i = 1; i <= numLength – minus; i++) {
if (0 < num && num < pow(10, i – 1)) {
ZERO.concat(NUM);
NUM = ZERO;
ZERO = “0”;
}
}
}
if (minus == 1) {
String MINUS = “-“;
MINUS.concat(NUM);
NUM = MINUS;
num = -num;
}
return (NUM);
}
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。