※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

今までのセンサーの値をまとめて表示


2019年 06月 24日

ここ3回で以下の記事を書いてきた。

今回は、これをまとめて、二酸化炭素、温度、湿度、気圧をまとめて表示できるようにしてみた。

今までは、次図の左のブレッドボードを使い、ジャンパー線で結んでいた。
プロトタイプではよくやる方法だが、どうしてもジャンパー線は外れやすい。

20190616165424198_0001-600.jpg

それで、今回は、中央のArduino用の拡張ボードを用いた。Arduinoのピン位置に合わせて穴が空いているので、これを用いると二階建て構造にして、ブレッドボードの代わりにこの拡張ボードに部品を取り付けることができるようになる。

ということで、ハンダ付けが必要になるのだが、ハンダ付けの個所もできるだけ減らしたい。とくに、配線は最小限にしたい。

それで用いたのが、右端の超薄型ユニバーサル基板である。よく見ると、ブレッドボードとプリントパターンがよく似ていることが分かるであろう。
とても薄く、カッターで簡単に切り分けることができ、穴を合わせてユニバーサル基板の上に置いて配線すると、とても便利であった。

3つの部品の配線であるが、電源系は当然共通になる。
それ以外の部品とArduinoを結ぶ信号線などは、異なるピンになるように最初から話を進めてきたので、そのまま3つの回路を拡張基板上に実現すれば動く。

DSCN4684−600.JPG  DSCN4679−600.JPG

そして組み立てて動かすと、こんな感じになった。

1行目に気温と湿度、2行目に二酸化炭素濃度と気圧を表示している。

DSCN4693-600.JPG   DSCN4687−600.JPG

Arduino, 拡張基板、センサーとディスプレイの3階建てになってしまった。

ディスプレイはとても見やすいのだが、ディスプレイの幅が拡張基板と同じだけあり、このディスプレイは大き過ぎた気がする。でも、安かったから我慢しよう。

さて、プログラムである。

プログラムも、いままで3回で示したものを寄せ集めただけのものなので、リストだけ載せ、説明は省略する。

// Room Environment
// CO2-MH-Z19
// Temperature, Humidity, Pressure
//
#include <LiquidCrystal.h>
#include <Wire.h>
#include <cactus_io_BME280_I2C.h>
#define pwmPin 7

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int prevVal = LOW;
long th, tl, h, l, ppm;

BME280_I2C bme(0x76); // I2C using address 0x76

void setup() {
Serial.begin(115200);
pinMode(pwmPin, INPUT);

lcd.begin(16, 2);

if (!bme.begin()) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}

bme.setTempCal(-1);// Temp was reading high so subtract 1 degree
Serial.println("setup() end");
}

void loop() {
int ppm = readCO2(pwmPin);
bme.readSensor();
int mb = bme.getPressure_MB();
float tmp = bme.getTemperature_C();
float hum = bme.getHumidity();

Serial.print(convf(tmp)); Serial.print(" C  ");
Serial.print(convf(hum)); Serial.print(" %  ");
if( ppm < 1000 )
Serial.print(" ");
Serial.print(ppm);Serial.print("ppm  ");
if( mb < 1000 )
Serial.print(" ");
Serial.print(mb); Serial.println("mb");


lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.print(convf(tmp)); lcd.print(" C  ");
lcd.print(convf(hum)); lcd.print(" %");
lcd.setCursor(0, 1);
if( ppm < 1000 )
lcd.print(" ");
lcd.print(ppm); lcd.print("ppm  ");
if( mb < 1000 )
lcd.print(" ");
lcd.print(mb); lcd.println("mb ");

// Add a 2 second delay.
delay(5000); //just here to slow down the output.
}

int readCO2(int pin) {
waituntil(pin,LOW);
waituntil(pin,HIGH);
long t0 = millis();
waituntil(pin,LOW);
long t1 = millis();
waituntil(pin,HIGH);
long t2 = millis();

long th = t1 - t0;
long tl = t2 - t1;
Serial.println(t0);
Serial.println(t1);
Serial.println(t2);

return (int)(5000 * (th - 2) / (th + tl - 4));
}

void waituntil( int pin, int hl ) {
while( digitalRead(pwmPin) != hl )
;
}

String convf( float val ) {
String str = String(val);

return str.substring(0,str.length()-1);
}