Makato-kan が 2021年02月18日21時18分38秒 に編集
コメント無し
タグの変更
COM
SSD
OLEDディスプレイ
本文の変更
![キャプションを入力できます](https://camo.elchika.com/a82ae3ab9378b18e6d82acf3e0a8fc9e4409c142/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f30636437633664622d383633372d343263372d616236372d363165396463613865323761/) ## 目的: 室内で石油ファンヒーター使います。冬になると部屋にいるだけで眠くなるので、多分そうだろうと思っていますが二酸化炭素濃度を測定してみたかったんです。 ## 部品表: - **Seeeduino XIAO** 小さなマイコンです。 - **Aosong DHT11** 格安の温度湿度センサーです - **CCS811** ガスセンサーです色々な基板があるようです。 - **0.96インチOLED** 表示器ですコントローラーにSSD1306使っているとあれば多分大丈夫 - **ブレッドボード** - **10kΩ抵抗** DHT11プルアップ用抵抗です - **モバイルバッテリー** 5v出力 できればスリープしないバッテリーが良いです。 - **接続用ワイヤ** いっぱい ## 概要 CCS811を使ってeCO2 温度 湿度を測定し、OLEDに表示します。 USBをパソコンに接続して シリアルモニターすればCSV形式で測定結果を受信できます CCS811は起動後安定するまで20分かかるのでカウントダウン表示も付いています。 DHT 11は 温度 湿度測定と CCS811の補正用に使用しています。 XIAOにarduinoIDEを使ってプログラム送信します。 ## 接続:
OLED、CCS811はI2C 接続する CCS811のnINT を1番 nWAKEを2番に接続する DHT11のデータを3番に接続する 10kΩは DHT11のプルアップ用なのでDHT11のデータとVCCに接続します
1,OLED、CCS811はI2C 接続する 2,CCS811のnINT を1番 nWAKEを2番に接続する 3,DHT11のデータを3番に接続する 4,10kΩは DHT11のプルアップ用なのでDHT11のデータとVCCに接続します
※CCS811、DHT11、OLEDの電源はXAIOの3.3vからとりました。 ※I2Cのプルアップ抵抗をつけておりませんが、使われるセンサーによってはプルアップ抵抗が必要な場合あります、自分の場合はつけなくても動作したので結果オーライとしています。(多分いずれかのセンサー基板にプルアップ抵抗ついていたのでしょう) ## 注意: 消費電流は0.05A程度なのでスリープ機能のあるモバイルバッテリーでは 電源が入らないまたは途中で電源OFFしてしまう事あります。 CCS811 DHT11いずれも 早いタイミングで読み取り苦手なセンサーみたいなので 5秒に一回読むようにしています。 DHT11の測定誤差は、高額のセンサーよりは多めです CCS811のライブラリとしてSparkFunのものを使用しました。 CCS811のアドレスは0x5Aを使っていますが、使用される基板によっては0x5Bの場合もあるようです。 プログラムの作法を全く勉強した事がないので色々変な部分あると思いますが コンパイルエラーが出なかったので良しとしています、もしも改善提案などございました 連絡ください。 ## 謝辞: GoogleでCCS811と検索して表示された皆様 arduinoIDEの設定: XIAOは環境設定から 追加するボードマネージャに "https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json"を追加して ArduinoIDEを再起動してから ツール→ボード→ボードマネージャを起動して XIAOと検索して"Seeed SAMD Boards"Ver1.8.1をインストールします。 以下の部品はツールからライブラリを管理を選びライブラリマネージャを起動し CCS811は CCS811で検索して" Spark_Fun CCS811 Arduino Library"Ver2.0.1 DHT 11は DHT11で検索して"DHT sensor library" 1.4.1 byAdafrult OLEDは SSD1306で検索して"ACROBOTIC SSD1306"Ver1.0.1 をそれぞれインストールします。 ``` #include "DHT.h" #include <Wire.h> #include <ACROBOTIC_SSD1306.h> #include "SparkFunCCS811.h" #define nINT 1 //CCS811 nINT #define nWAKE 2 //CCS811 nWAKE #define DHTPIN 3 #define DHTTYPE DHT11 #define CCS811_ADDR 0x5A DHT dht(DHTPIN, DHTTYPE); CCS811 myCCS811(CCS811_ADDR); int base=1; int down=1; int countdown=20; void setup() { Serial.begin(1200); Serial.print(""); Serial.println("CCS811 Basic Example"); pinMode(nWAKE,OUTPUT); Wire.begin(); oled.init(); // Initialze SSD1306 OLED display oled.clearDisplay(); // Clear screen oled.setTextXY(3,3); // Set cursor position, start of line 0 oled.putString("Hello, World"); delay(1000); dht.begin(); oled.clearDisplay(); oled.setTextXY(0,0); oled.putString("Temp"); oled.setTextXY(0,11); oled.putString("xxxxC"); oled.setTextXY(2,0); oled.putString("Humi"); oled.setTextXY(2,13); oled.putString("xx%"); //CCS811 CO2 status oled.setTextXY(4,0); oled.putString("CO2"); oled.setTextXY(4,9); oled.putString("xxxxppm"); oled.setTextXY(6,0); oled.putString("Heat Index"); oled.setTextXY(6,14); oled.putString("xx"); delay(4000); digitalWrite(nWAKE,LOW); delay(1000); //This begins the CCS811 sensor and prints error status of .beginWithStatus() CCS811Core::CCS811_Status_e returnCode = myCCS811.beginWithStatus(); //myCCS811.setDriveMode(1); Serial.print("CCS811 begin exited with: "); Serial.println(myCCS811.statusString(returnCode)); digitalWrite(nWAKE,HIGH); unsigned char brightness = 5; oled.setBrightness((unsigned char)brightness); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); float f = dht.readTemperature(true); if (isnan(h) || isnan(t) || isnan(f)) { oled.setTextXY(7,0); oled.putString("Status : NG"); return; }else { //Counter check and countdown 20min base=base+1; if(base>12) { base=1; } else { down=base/12; countdown=countdown-down; if(countdown<1){ oled.setTextXY(7,0); oled.putString(" "); }else{ oled.setTextXY(7,0); oled.putString("Wait"); oled.setTextXY(7,6); char strMIN[2]; sprintf(strMIN,"%2d",int(countdown)); delay(10); oled.putString(String(strMIN)); oled.setTextXY(7,8); oled.putString("min"); } } } float hic = dht.computeHeatIndex(t, h, false); //Display Temp oled.setTextXY(0,10); oled.putString(" "); delay(10); oled.setTextXY(0,10); oled.putFloat(float(t)); //Display Hume oled.setTextXY(2,11); oled.putString(" "); delay(10); oled.putNumber(int(h)); //Display Heat Index oled.setTextXY(6,14); char strHIC[2]; sprintf(strHIC,"%2d",int(hic)); delay(10); oled.putString(String(strHIC)); delay(10); //CSS811 data check and Humi Temp data set if(digitalRead(nINT) == LOW) { digitalWrite(nWAKE, LOW); delay(10); myCCS811.setEnvironmentalData(h,t); delay(10); // if (myCCS811.dataAvailable()) // { myCCS811.readAlgorithmResults(); //SerialOUT Temp Hume CO2 TVOC Serial.print(float(t)); Serial.print(","); Serial.print(int(h)); Serial.print(","); //Returns calculated CO2 reading Serial.print(myCCS811.getCO2()); Serial.print(","); //Returns calculated TVOC reading Serial.print(myCCS811.getTVOC()); Serial.println(""); //Display CO2 oled.setTextXY(4,9); oled.putString(" "); delay(10); oled.setTextXY(4,9); char strCO2[4]; sprintf(strCO2,"%4d",myCCS811.getCO2());**** delay(10); oled.putString(String(strCO2)); oled.setTextXY(4,13); delay(10); oled.putString("ppm"); digitalWrite(nWAKE,HIGH); delay(5000); } ``` ## プログラムの説明: setup迄の過程で ライブラリの読み込み ピンの設定 輝度の設定をしています loopで 温度湿度の読み取り OLEDに表示 CCS811に温度湿度補正値を送り 計測値の取り出し OLEDへの表示をしています。 最後に5秒スリープして 繰り返しします バージョンアップ: そのうちやりたい事 二酸化炭素濃度が1000ppm超えたら リレー接点をONにしたい。 ESP- WROOM-02を使って MQTTで測定結果をPCに送りたい。 ## 追記 SparkFunではなくAdafrultのライブラリにしたプログラムも作成しました。 そのうち公開します。 回路図は Fritzingの使い方まだわかっていないのでちょっとお待ちください。 ## 改善提案募集中 この投稿をみた皆様へ恐れ入ります、もっと良い方法ございましたら教えていただけると助かります