미세먼지 센서가 시리얼 통신을 하는데 기존 사용0, 1번은 컴퓨터와 통신하므로 소프트웨어시리얼로 통신 구성
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <DHT.h>
// I2C LCD 주소와 디스플레이 크기 설정
LiquidCrystal_I2C lcd(0x27, 16, 2);
// PMS7003 센서와의 시리얼 통신 설정
SoftwareSerial pmsSerial(2, 3); // RX, TX
// PMS7003 명령 및 데이터 포맷 정의
const unsigned char pmsCmd[7] = {0x42, 0x4d, 0xe2, 0x00, 0x00, 0x01, 0x71};
unsigned char pmsData[32];
// DHT11 센서 설정
#define DHTPIN 4 // DHT11 데이터 핀 연결
#define DHTTYPE DHT11 // DHT11 센서 타입
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600); // 아두이노 시리얼 모니터를 위한 시리얼 통신
pmsSerial.begin(9600); // PMS7003 센서와의 시리얼 통신
// LCD 초기화
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
// DHT11 초기화
dht.begin();
// 센서 초기화
pmsSerial.write(pmsCmd, sizeof(pmsCmd));
// 디버깅 메시지
Serial.println("Setup complete.");
}
void loop() {
// 온습도 측정
float humi = dht.readHumidity();
float temp = dht.readTemperature();
// 시리얼 버퍼를 비움
while (pmsSerial.available() > 0) {
pmsSerial.read();
}
// 데이터 수신을 위한 대기
delay(1000);
if (pmsSerial.available() >= 32) {
// 데이터 수신
pmsSerial.readBytes(pmsData, 32);
// 데이터 유효성 검사
if (pmsData[0] == 0x42 && pmsData[1] == 0x4d) {
unsigned int pm1_0 = (pmsData[10] << 8) + pmsData[11];
unsigned int pm2_5 = (pmsData[12] << 8) + pmsData[13];
unsigned int pm10 = (pmsData[14] << 8) + pmsData[15];
// 데이터 출력 (시리얼 모니터)
Serial.print("PM1.0: ");
Serial.print(pm1_0);
Serial.print(" ");
Serial.print("PM2.5: ");
Serial.print(pm2_5);
Serial.print(" ");
Serial.print("PM10: ");
Serial.print(pm10);
Serial.print(" ");
Serial.print("Temp: ");
Serial.print(temp,1);
Serial.print(" ");
Serial.print("Humi: ");
Serial.println(humi,0);
// 온습도 데이터 유효성 검사
if (isnan(humi) || isnan(temp)) {
Serial.println("Failed to read from DHT sensor!");
lcd.setCursor(0, 1);
lcd.print("DHT Error");
} else {
// 데이터 출력 (LCD)
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PM1.0/");
lcd.setCursor(1, 1);
lcd.print(pm1_0);
lcd.setCursor(6, 0);
lcd.print("PM2.5/ ");
lcd.setCursor(7, 1);
lcd.print(pm2_5);
lcd.setCursor(12, 0);
lcd.print("PM10");
lcd.setCursor(13, 1);
lcd.print(pm10);
delay(5000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp,1);
lcd.setCursor(12, 0);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humi: ");
lcd.print(humi,0);
lcd.setCursor(12, 1);
lcd.print("%");
delay(5000);
//lcd.clear();
}
} else {
// 디버깅 메시지
Serial.println("Invalid data received from PMS7003");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Invalid data...");
}
} else {
// 디버깅 메시지
Serial.println("Waiting for data from PMS7003");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Waiting for data");
}
// delay(2000); // 2초 간격으로 데이터 측정
}