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

Makato-kan が 2021年03月14日12時07分51秒 に編集

初版

タイトルの変更

+

XIAIOにCCS881とDHT11とRTCとOLEDディスプレイをつけてつかってみた。

タグの変更

+

XIAO

+

DHT11

+

OLEDディスプレイ

+

RTC

本文の変更

+

**はじめに** プログラムのみですが前回投稿した[二酸化炭素測定プログラム](https://elchika.com/article/97dc4b94-1934-4ee1-acbf-6fa1503b83f6/)のCCS811センサーライブラリをAdafrultにして、さらにエプソンのRTCを接続して シリアル出力は日付入りにしたものです。 日付はプログラムの中に埋め込んでいるので電源OFFすると毎回その時間になってしまいます。 **部品表** Seeeeduino XIAO DHT11 RTC-8025 秋月電子で売っていた エプソンのRTCです OLED 0.96inch CCS811 DHT11プルアップ用抵抗10kΩ **接続** 追加したRTCはI2C接続なので VCC3.3V GNDと SCL,SDAを各々接続すれば 出来上がりです。 **プログラムについて** RTCをバッテリーバックアップした場合、プログラムの中にある 電源投入時クリアと 日付設定部分をはずしてRTCの保持している時間をクリアしないようにすれば良いと思います。 **特徴** ブレッドボードで手軽に組み立てられます。 プログラムは年月日をOLED表示とシリアル出力に使っています。 シリアル出力はCSV形式にしてホストコンピュータ側でログファイル化すれば、解析が便利という事です。 **プログラム** ``` #include "DHT.h" #include <Wire.h> #include <ACROBOTIC_SSD1306.h> #include "Adafruit_CCS811.h" #define CCS811_WAKE 2 #define DHTPIN 3 #define DHTTYPE DHT11 #define RTC_ADRS 0x32 //I2C RX8025RTC_ADDR 0x32 //I2C SSD1306_ADDR 0x3D //I2C JamEEPROM_ADDR 0x50 //I2C CCS811_ADDR 0x5A uint8_t PROM_DEVICE_ADDRESS = 0x50; DHT dht(DHTPIN, DHTTYPE); Adafruit_CCS811 ccs; int base=1; int down=1; int countdown=20; void setup() { Serial.begin(9600); delay(500); Serial.print(""); delay(700); Serial.println("CCS811 Basic Example"); pinMode(CCS811_WAKE, OUTPUT); delay(500); digitalWrite(CCS811_WAKE, LOW); // turn Sensor on Wire.begin(); //RX8025 RTC Wire.beginTransmission(RTC_ADRS); Wire.write(0xE0); Wire.write(0x20); //24hourMode Wire.write(0x00); // PON Clear delay(100); Wire.endTransmission(); delay(100); Wire.beginTransmission(RTC_ADRS); Wire.write(0x00); delay(10); Wire.write(0x00); //sec delay(10); Wire.write(0x00); //min delay(10); Wire.write(0x23); //hour delay(10); Wire.write(0x00); //week delay(10); Wire.write(0x10); //day delay(10); Wire.write(0x10); //month delay(10); Wire.write(0x21); //year delay(100); Wire.endTransmission(); delay(50); //RX8025 RTC 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(1500); //DHT11 Temp Humi status dht.begin(); oled.clearDisplay(); oled.setTextXY(1,0); oled.putString("Temp"); oled.setTextXY(1,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"); if(!ccs.begin()){ Serial.println("Failed to start sensor! Please check your wiring."); while(1); } delay(4500); digitalWrite(CCS811_WAKE, HIGH); // turn Sensor off //SSD1306 brightness set unsigned char brightness = 5; oled.setBrightness((unsigned char)brightness); } void loop() { //RX8025 byte seconds,minutes,hours,days,months,years; Wire.requestFrom(RTC_ADRS,8); Wire.read(); seconds = Wire.read(); minutes = Wire.read(); hours = Wire.read(); Wire.read(); days = Wire.read(); months = Wire.read(); years = Wire.read(); //RX8025 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){ //change DATE oled.setTextXY(7,0); char strDATE[13]; int ma1 =(minutes&0x0F); int ma2 =(minutes>>4)& 0x0F; int Mnum =ma2 *10+ma1; sprintf(strDATE,"%13d",int(Mnum)); delay(10); oled.putString(String(strDATE)); //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(1,10); oled.putString(" "); delay(10); oled.setTextXY(1,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 digitalWrite(CCS811_WAKE, LOW); // turn Sensor on delay(500); ccs.setEnvironmentalData(h,t); delay(500); if(ccs.available()){ if(!ccs.readData()){ //SerialOUT CO2 TVOC Serial.print(ccs.geteCO2()); Serial.print(","); Serial.print(ccs.getTVOC()); Serial.print(","); } else{ Serial.println("ERROR!"); while(1); } } //SerialOUT Temp Hume Serial.print(float(t)); Serial.print(","); // Serial.println(int(h)); Serial.print(int(h)); Serial.print(",20"); //Year int Ya1 =(years&0x0F); int Ya2 =(years>>4)& 0x0F; int Ynum =Ya2 *10+Ya1; Serial.print(Ynum); Serial.print("-"); //Month int Mona1 =(months&0x0F); int Mona2 =(months>>4)& 0x0F; int Monnum =Mona2 *10+Mona1; Serial.print(Monnum); Serial.print("-"); //Day int Daya1 =(days&0x0F); int Daya2 =(days>>4)& 0x0F; int Daynum =Daya2 *10+Daya1; Serial.print(Daynum); Serial.print(",\""); //Hour int Ha1 =(hours&0x0F); int Ha2 =(hours>>4)& 0x0F; int Hnum =Ha2 *10+Ha1; Serial.print(Hnum); Serial.print(":"); // minutes int ma1 =(minutes&0x0F); int ma2 =(minutes>>4)& 0x0F; int Mnum =ma2 *10+ma1; Serial.print(Mnum); Serial.println("\""); //Display CO2 oled.setTextXY(4,9); oled.putString(" "); delay(10); oled.setTextXY(4,9); char strCO2[4]; sprintf(strCO2,"%4d",ccs.geteCO2()); delay(10); oled.putString(String(strCO2)); oled.setTextXY(4,13); delay(10); oled.putString("ppm"); digitalWrite(CCS811_WAKE, HIGH); // turn Sensor off //EEPROMへの書き込み // Wire.beginTransmission(DEVICE_ADDRESS); delay(4000); } #define LED_PIN 13 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); } ```