XIAIOにCCS881とDHT11とRTCとOLEDディスプレイをつけてつかってみた。
はじめに
前回投稿した二酸化炭素測定プログラムの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
に
編集
をしました。
-
Makato-kan
さんが
2021/12/07
に
編集
をしました。
ログインしてコメントを投稿する