編集履歴一覧に戻る
Makato-kanのアイコン画像

Makato-kan が 2021年06月02日20時24分06秒 に編集

コメント無し

本文の変更

![キャプションを入力できます](https://camo.elchika.com/4f3493d1d21ef69b6534b471fd8464b1e7886f21/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f31333430396531362d313839622d346137342d386436352d386132393334376362313230/)

-

**はじめに**

+

## はじめに:

ハードウェア作品投稿キャンペーンでM5StickC他をいただきました。

-

せっかくいただいたM5StickCを使ってみようと道具箱みたら、 なぜかSGP-30 のセンサーがあったので二酸化炭素濃度測定を作りました、 プログラムはネットで検索して見つけたものを組み合わせました。 ArduinoIDEを使っております。 **設定** ボードマネージャーはM5StickC ライブラリは Adafruit_SGP30をインストールしています

+

せっかくいただいた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で検索したら見つかった皆様 ありがとうございます。

+

## 謝辞: インターネットでM5StickC ディスプレーと M5StickC SGP-30で検索したら見つかった皆様ありがとうございます。