お礼 いただいたM5StickCを使って二酸化炭素濃度測定
はじめに:
ハードウェア作品投稿キャンペーンでM5StickC他をいただきました。
せっかくいただいたM5StickCを使ってみようと道具箱みたら、なぜかSGP-30 のセンサーがあったので二酸化炭素濃度測定を作りました、
プログラムはネットで検索して見つけたものを組み合わせました。
ArduinoIDEを使っております。
設定:
ボードマネージャーはM5StickC
ライブラリは Adafruit_SGP30をインストールしています
接続:
SGP-30を購入するとケーブルも付いてきますんで、あとはM5StickCと接続するだけです。
プログラム:
#include <M5StickC.h>
#include <Wire.h>
#include "Adafruit_SGP30.h"
#define DISP_BRIGHTNESS_MIN 9
uint8_t disp_brightness = DISP_BRIGHTNESS_MIN;
Adafruit_SGP30 sgp;
/* return absolute humidity [mg/m^3] with approximation formula
* @param temperature [°C]
* @param humidity [%RH]
*/
uint32_t getAbsoluteHumidity(float temperature, float humidity) {
// approximation formula from Sensirion SGP30 Driver Integration chapter 3.15
const float absoluteHumidity = 216.7f * ((humidity / 100.0f) * 6.112f * exp((17.62f * temperature) / (243.12f + temperature)) / (273.15f + temperature)); // [g/m^3]
const uint32_t absoluteHumidityScaled = static_cast<uint32_t>(1000.0f * absoluteHumidity); // [mg/m^3]
return absoluteHumidityScaled;
}
void setup() {
M5.Axp.ScreenBreath(disp_brightness);
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.setTextFont(4);
M5.Lcd.setTextColor(TFT_WHITE,TFT_BLACK);
M5.Lcd.fillScreen(BLACK);
Serial.begin(115200);
while (!Serial) { delay(10); } // Wait for serial console to open!
Serial.println("SGP30 test");
// Wire.begin(0, 26);
Wire.begin(32, 33);
if (! sgp.begin()){
Serial.println("Sensor not found :(");
while (1);
}
Serial.print("Found SGP30 serial #");
Serial.print(sgp.serialnumber[0], HEX);
Serial.print(sgp.serialnumber[1], HEX);
Serial.println(sgp.serialnumber[2], HEX);
// If you have a baseline measurement from before you can assign it to start, to 'self-calibrate'
//sgp.setIAQBaseline(0x8E68, 0x8F41); // Will vary for each sensor!
M5.Lcd.fillScreen(WHITE);
delay(500);
M5.Lcd.fillScreen(RED);
delay(500);
M5.Lcd.fillScreen(GREEN);
delay(500);
M5.Lcd.fillScreen(BLUE);
delay(500);
M5.Lcd.fillScreen(BLACK);
delay(500);
// text print
M5.Axp.ScreenBreath(disp_brightness);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0, 10);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(1);
M5.Lcd.printf("Display Test!");
delay(1000);
}
int counter = 0;
void loop() {
// If you have a temperature / humidity sensor, you can set the absolute humidity to enable the humditiy compensation for the air quality signals
//float temperature = 22.1; // [°C]
//float humidity = 45.2; // [%RH]
//sgp.setHumidity(getAbsoluteHumidity(temperature, humidity));
if (! sgp.IAQmeasure()) {
Serial.println("Measurement failed");
return;
}
Serial.print("TVOC "); Serial.print(sgp.TVOC); Serial.print(" ppb\t");
Serial.print("eCO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm");
if (! sgp.IAQmeasureRaw()) {
Serial.println("Raw Measurement failed");
return;
}
// Serial.print("Raw H2 "); Serial.print(sgp.rawH2); Serial.print(" \t");
// Serial.print("Raw Ethanol "); Serial.print(sgp.rawEthanol); Serial.println("");
delay(1000);
counter++;
if (counter == 30) {
counter = 0;
uint16_t TVOC_base, eCO2_base;
if (! sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) {
Serial.println("Failed to get baseline readings");
return;
}
Serial.print("****Baseline values: eCO2: 0x"); Serial.print(eCO2_base, HEX);
Serial.print(" & TVOC: 0x"); Serial.println(TVOC_base, HEX);
}
//Add M5stick OLED
M5.Lcd.fillScreen(BLACK);
String str = " " + (String)sgp.TVOC + "[ppb]";
M5.Lcd.drawRightString(str,256,8,4);
M5.Lcd.setCursor(0, 0, 2);
M5.Lcd.println("TVOC");
str = " " + (String)sgp.eCO2 + "[ppm]";
M5.Lcd.drawRightString(str,256,32+16,4);
M5.Lcd.setCursor(0, 32, 2);
M5.Lcd.println("eCO2");
delay(3000);
}
プログラムについて:
最後のdelay(3000);を変更すれば表示更新のタイミングが変わります
M5.Lcd.fillScreen(BLACK); は計測した値が重ね書きされてしまうので入れています。
もっと美しいやり方あると思います。
使ったもの:
M5StickC いただいたものです
SGP-30 マルツで買いました。
謝辞:
インターネットでM5StickC ディスプレーと M5StickC SGP-30で検索したら見つかった皆様ありがとうございます。
投稿者の人気記事
-
Makato-kan
さんが
2021/04/22
に
編集
をしました。
(メッセージ: 初版)
-
Makato-kan
さんが
2021/05/29
に
編集
をしました。
-
Makato-kan
さんが
2021/06/02
に
編集
をしました。
-
Makato-kan
さんが
2021/12/07
に
編集
をしました。
ログインしてコメントを投稿する