BMP280を使ったロガーですが…懲りずにまだやっています。
/****************************************************
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);
}