SD카드에 온도와 습도를 20분 단위로 기록
/*
DHT sensor library by Adafruit - DHT22 온습도 라이브러리 설치
LiquidCrystal I2C by Frank de Brabander - LCD I2C용 라이브러리 설치
SD 메모리 카드는 내장 라이브러리 사용
온습도 기록은 최초 연결할 때 기록하고, 이후 20분 단위로 기록
*/
//---------------------------------------------------------------------------------------------------------
#include <Wire.h> // I2C 모듈 통신용 라이브러리 호출
#include <DHT.h> // DHT 온습도 라이브러리 호출
#define DHTPIN 2 // 온습도센서 2번핀에 연결
#define DHTTYPE DHT22 // 온습도센서 모델지정 DHT22
DHT dht(DHTPIN, DHTTYPE); // DHT 설정(2,DHT22)
#include <LiquidCrystal_I2C.h> // I2C LCD사용위해 라이브러리 호출
LiquidCrystal_I2C lcd(0x27,16,2); //LCD 설정 (I2C주소는 LCD의 종류에 따라 다르기때문에 LCD가 0x3F, 0x27인지 확인하세요)
#include <SPI.h> // SD카드를 사용하기 위한 통신 라이브러리
#include <SD.h> // SD카드를 사용하기 위한 통신 라이브러리
const int sd_CS = 10; // CS핀을 10번에 할당
File myFile;
// SD모듈의 MOSI-pin11, MISO-pin12, CLK(SCK)-pin13에 연결(고정값), CS-pin10-환경따라 이것만 변경하여 연결
// 센서쉴드v5.0 핀배열 순서는 +, -, D11, D10, D13, D12 순이므로 센서에 맞게 연결
extern volatile unsigned long timer0_millis; // 타이머 변수-아두이노 시작 초기 후 흐른 시간
long readTime; // 아두이노 시작 후 총 경과 시간을 담을 변수
long pastTime;
//------------------------------------------------------------------
void setup() {
Serial.begin(9600); // 통신속도 9600bps로 시리얼 통신 시작
Wire.begin();
dht.begin(); // 온습도 센서 시작
delay (2000); // 온습도 측정을 위해 2초 지연. DHT22 센서는 첫 측정을 위해 2초의 시간이 필요
float temp = dht.readTemperature(); //온도값을 temp에 저장
float humi = dht.readHumidity(); //습도값을 humi에 저장
readTime = millis()/1000; // 시간설정
pastTime = readTime;
// SD카드 기록 시작
SD.begin(sd_CS); // SD카드 준비
myFile = SD.open("aws-data.txt", FILE_WRITE); // 파일에 아래 데이터 항목 제목 기록 후 닫기
myFile.println(F("시간, 온도, 습도, 열지수, 불쾌지수"));
myFile.close();
// LCD 시작
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.backlight();
lcd.clear();
}
//----------------------------------------------------------------
void loop() {
// 온도-습도 값 측정
float temp = dht.readTemperature(); //온도값을 temp에 저장
float humi = dht.readHumidity(); //습도값을 humi에 저장
float hic = dht.computeHeatIndex(temp, humi, false); // 열지수-체감온도 계산
float DI = ((9/5)*temp)-((0.55*(1-(humi/100))*(((9/5)*temp)-26)))+32; // 불쾌지수 계산
// if(isnan(humi) || isnan(temp)) { // 온도 습도 값을 읽지 못했을때 재시도
// Serial.println("Fail. Try again");
// lcd.print("Fail. Try again...");
// delay(2000);
// return;
// }
//*************** 시리얼과 LCD에 출력****************
// 온도, 습도, 기압, 미세먼지 LCD 출력
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.setCursor(7, 0);
lcd.print(temp,1);
lcd.setCursor(0, 1);
lcd.print("Humi: ");
lcd.setCursor(7, 1);
lcd.print(humi,0);
delay(4000); // 4초간 유지
lcd.clear(); // 화면지우기
delay(1000); // 1초간 유지
// 온도, 습도 시리얼 출력
Serial.print(F("온도: "));
Serial.print(temp,1); //온도값 출력
Serial.print(" °C \t");
Serial.print(F("습도: "));
Serial.print(humi,0); //습도값 출력
Serial.println((" % \t"));
// SD 카드에 데이타 저장
readTime = millis()/1000; //경과시간 계산에 활용
if(millis()>=86400000){ //24시간 경과 후 시간 초기화
timer0_millis = 0;
}
if (readTime - pastTime < 8) { // 최초 가동할때 8초 이내에서 온도 습도 기록
myFile = SD.open("aws-data.txt", FILE_WRITE); // 파일명 설정
myFile.print(readTime/60); myFile.print("분 경과, "); // 최초기록 시간 분 단위로 표시
myFile.print(temp,1); myFile.print(", "); myFile.print(humi,0); myFile.print(", ");
myFile.print(hic,0); myFile.print(", "); myFile.println(DI,0);
myFile.close(); // 기록하고 파일을 닫는다.
}
if (readTime - pastTime >= 1200 ) { // 가동이후 20분 주기로 온습도 기록
pastTime = readTime;
myFile = SD.open("aws-data.txt", FILE_WRITE); // 파일명 설정
myFile.print(readTime/60); myFile.print("분 경과, "); // 시간기록 분 단위로 표시
myFile.print(temp,1); myFile.print(", "); myFile.print(humi,0); myFile.print(", ");
myFile.print(hic,0); myFile.print(", "); myFile.println(DI,0);
myFile.close(); // 기록하고 파일을 닫는다.
}
}