Makato-kanのアイコン画像

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

Makato-kan 2021年03月14日に作成  (2021年03月27日に更新)

はじめに
前回投稿した二酸化炭素測定プログラムのCCS811センサーライブラリをAdafrultにして、さらにエプソンのRTCを接続して シリアル出力はCSV形式で日付入りにしたものです。
日付はプログラムの中に埋め込んでいるので電源OFFすると毎回その時間になってしまいます。

ブレッドボード回路図
キャプションを入力できます

部品表
Seeeeduino XIAO
DHT11
RTC-8025 秋月電子で売っていた,エプソンのRTCです
OLED 0.96inch
CCS811
DHT11プルアップ用抵抗10kΩ

プログラムについて
RTCをバッテリーバックアップした場合、プログラムの中にある 電源投入時クリアと
日付設定部分をはずしてRTCの保持している時間をクリアしないようにすれば良いと思います。

特徴
 CCS811は アイドルタイム20分必要とのことで 大体20分のカウントダウン表示を組み込みました。
 シリアル出力はCSV形式になっているのでホストコンピュータ側でログファイル化すれば、解析が便利という事です。
 プログラム中 EEPROMの記述ちょっとありますが EEPROMにログデータ保存は 諦めています。

プログラム

#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);
}
Makato-kan さんが 2021/03/14 に 編集 をしました。 (メッセージ: 初版)
Makato-kan さんが 2021/03/23 に 編集 をしました。
Makato-kan さんが 2021/03/23 に 編集 をしました。
Makato-kan さんが 2021/03/27 に 編集 をしました。
Makato-kan さんが 2021/03/27 に 編集 をしました。
ログインしてコメントを投稿する