2021年5月14日金曜日

DHT22 and BMP280 温度ロガー…その7

Arduino Weather Station DHT22 and BMP280 
BMP280を使ったロガーですが…懲りずにまだやっています。



当初の目的の温度・湿度・気圧が液晶画面に表示できて、SDカードに保存できるようになったのでした。ベニヤ板の台を作ったのですが…斜めにカットして見やすくしています。



DHT22の湿度データをもらうことでBMP280でも何とかなると思います。RTCモジュールでも温度データーが取得出来るようですが…少し高めに表示されます


やる気が無かったSDカードのデーターもエクセルで読めるようになりました。

上手く保存できなかった原因は改行の使い方を理解していないからですが…(^^ゞコツが解れば何でもないことで悩んでいたのでした。

/****************************************************
  2021/05/14
  BMP280_Logger
  BMx280Library使用
****************************************************/
//CdS定義
const int CdS = 1;  //青リード線はA1pinに設定
int val = 0;        //A0から読み込んだ値を格納する変数

//LM35温度センサ定義
float A_inPin = 0;  //緑リード線ははA0pinに設定
float v = 5;        //電圧
float LMC = 0;
float value1 = 0;
int sum = 0;
int data = 0;

//RTCモジュール・ライブラリー読み込み・定義
#include <RTClib.h>
RTC_DS3231 rtc;

//DHT センサー・ライブラリー読み込み・定義
#include <DHT.h>
#define DHTPIN 2  //白リード線はD2につなぐ
//#define DHTTYPE DHT11  // DHT 11
#define DHTTYPE DHT22  // DHT 22に変更
// DHT センサーのイニシャライズ(初期化)
DHT dht(DHTPIN, DHTTYPE);

//LCDシールド・ライブラリー読み込み・定義
#include <ShiftedLCD.h>
LiquidCrystal lcd(10);
int LCD_BL = 6;
#include <SPI.h>  //SPI通信 SD・LCD

//BMP280・ライブラリー読み込み・定義
#include <Wire.h>  //I2C通信 BMP280 DS3231
#include <BMx280I2C.h>
#define I2C_ADDRESS 0x76
BMx280I2C bmx280(I2C_ADDRESS);

// SDカード・ライブラリー読み込み・定義
// Arduino Ethernet shield and modules: pin 4
// Data loggin SD shields and modules: pin 10
#include <SD.h> // SDカードライブラリー
const int chipSelect = 4;
File myFile; 
//--
void setup() {
  {
    //DHT sensor
    dht.begin();

    //LCDのクリア
    lcd.begin(16, 2); /* LCD設定(16文字2行) */
    lcd.clear();      /* LCDのクリア */
    //I2C通信
    Wire.begin();

    // シリアル通信
    Serial.begin(9600);
    Serial.println("Arduino Weather Logger");  //タイトル表示

    //気圧センサー判別
    if (bmx280.isBME280())
      Serial.println("sensor is a BME280");
    else
      Serial.println("sensor is a BMP280");
    //begin() checks the Interface, reads the sensor ID (to differentiate between BMP280 and BME280)
    //and reads compensation parameters.
    if (!bmx280.begin()) {
      Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
      while (1)
        ;  //繰り返し
    }

    //初期パラメーターにリセット
    bmx280.resetToDefaults();

    //オーバーサンプリング設定
    //oversampling setting.
    //set an oversampling setting for pressure and temperature measurements.
    bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
    bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);
  }
  // RTCのセットアップ
  while(!Serial); // for Leonardo/Micro/Zero
    if(! rtc.begin()) {
      Serial.println("Couldn't find RTC");
      while (1);
    }
    else {
      // following line sets the RTC to the date & time this sketch was compiled
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    }
 //SDカードのセットアップ
  Serial.print("Initializing SD card...");

  if(!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  //open file
  myFile=SD.open("DATA.txt", FILE_WRITE);
 if (myFile) {
Serial.println("File opened ok");
    
// print the headings for our data  
myFile.println("Date,Time,hp,ºC,ºC,RH,LM35,Cds,RTC");
}
myFile.close();
}

//--
void loggingTime() {
  DateTime now = rtc.now();
  myFile = SD.open("DATA.txt", FILE_WRITE);
  if (myFile) {
    myFile.print(now.year(), DEC);
    myFile.print('/');
    myFile.print(now.month(), DEC);
    myFile.print('/');
    myFile.print(now.day(), DEC);
    myFile.print(',');
    myFile.print(now.hour(), DEC);
    myFile.print(':');
    myFile.print(now.minute(), DEC);
    myFile.print(':');
    myFile.print(now.second(), DEC);
    myFile.print(",");
  }
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print("  ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.println(now.second(), DEC);
  myFile.close();
  delay(1000);
}
void loggingTemperature() {
bmx280.getPressure();
bmx280.getPressure();
float t = dht.readTemperature();
float p = dht.readHumidity();
  
//LM35センサーの値を100回読み取り平均化する
  sum = 0;
  for (int i = 0; i < 100; i++) {
    data = analogRead(A_inPin);
    sum = sum + data;
    delay(5);
  } 
  value1 = sum / 100;
  //読み取った値を温度に換算
  LMC = ((v / 1024) * value1) * 100 ;
   //Cds値
  val = analogRead(CdS);//
  //
  // Check if any reads failed and exit early (to try again).
  if  (isnan(t) /*|| isnan(f)*/) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  //各センサーの値を出力
  Serial.print("Pressure: ");Serial.print(bmx280.getPressure() / 100);Serial.println("hP");
  Serial.print("Temperature: ");Serial.print(bmx280.getTemperature());Serial.println(" *C");
  Serial.print("Temp:");Serial.print(t);Serial.println(" *C");
  Serial.print("RH  :");Serial.print(p);Serial.println(" *%");
  Serial.print("LM35:");Serial.print( LMC );Serial.println(" *C");
  Serial.print("CdS :");Serial.print(val);Serial.println("  "); 
  Serial.print("RTC温度: ");Serial.print(rtc.getTemperature());Serial.println(" *C"); 
  Serial.println(" ");  
  //
  myFile = SD.open("DATA.txt", FILE_WRITE);
  if (myFile) {
   myFile.print(bmx280.getPressure() / 100);myFile.print(",");
   myFile.print(bmx280.getTemperature());myFile.print(",");
   myFile.print(t);myFile.print(",");
   myFile.print(p);myFile.print(",");
   myFile.print(LMC);myFile.print(",");
   myFile.print(val);myFile.print(",");
   myFile.print(rtc.getTemperature());myFile.println(",");
   
  }
  myFile.close();
}

void loop() {
  loggingTime();
  loggingTemperature();

  //LM35センサーの値を100回読み取り平均化する
  sum = 0;
  for (int i = 0; i < 100; i++) {
    data = analogRead(A_inPin);
    sum = sum + data;
    delay(5);
  }
  value1 = sum / 100;
  //読み取った値を温度に換算
  LMC = ((v / 1024) * value1) * 100;

  val = analogRead(CdS);  //
  //
 
  if (!bmx280.measure()) {
    Serial.println("could not start measurement, is a measurement already running?");
    return;
  }

  //wait for the measurement to finish
  do {
    delay(100);
  } while (!bmx280.hasValue());

  //LCD表示1
  lcd.setCursor(0, 0);
  lcd.print("Prs :" + String(bmx280.getPressure() / 100) + " hP         ");
  lcd.setCursor(0, 1);
  lcd.print("Temp:" + String(bmx280.getTemperature()) + " c         ");
  delay(5000);

  //LCD表示2
  float h = dht.readHumidity();
  
  lcd.setCursor(0, 1);
  lcd.print("RH  :" + String(h) + " %          ");
  delay(5000);
}