본문 바로가기

아두이노

소나기(Sonagi) 미세 먼지 공기청정기 전체 소스코드

반응형

 

소나기(Sonagi) 미세 먼지 공기청정기 전체 소스코드

 

 

메이커 프로젝트 프로젝트인 미세먼지 공기청정기 전체 소스코드를 공유한다. 어제까지 정확히 동작하고 RGB Led가 미세먼지 PM2.5 농도에 따라 시안, 녹색, 녹색, 빨강으로 변하는 코드를 수정했다. 자세한 연결도와 동작은 다른 문서를 참고하고 아래 소스코드를 참고한다.

 

 

/*****************************************************************************
*
* Copyright (C) 2018 GwaCheon Digotal Creative Group
* Project Name : Air Cleaner witn PM2008M, Arduino Mega
* Version : 1.1 (2018.11.17)
* SYSTEM CLOCK : 16Mhz 
* BOARD : Arduino UNO. 5V operation 


PORT Description

1. RX : 17           
2. TX : 16
  
1. 2018.11.17  : First version is released.

****************************************************************************/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);  // I2C LCD 객체 선언

int redPin_1 = 5;
int greenPin_1 = 6;
int bluePin_1 = 7;

int redPin_2 = 27;
int greenPin_2 = 25;
int bluePin_2 = 23;

unsigned char Send_data[5] = {0x11,0x02,0x0B,0x07, 0xDB}; // 농도읽는명령
unsigned char Receive_Buff[56];                           // data buffer
unsigned long PM1, PM25, PM10;                                     // 농도저장변수 : 각 32bit(8bit*4 = 32)
unsigned long COM_SUCCESS, COM_COUNT;                              // 통신성공/통신시도횟수
unsigned char recv_cnt = 0;

void Send_CMD(void)                                        // COMMAND
{
  unsigned char i;
  for(i=0; i<5; i++)
  {
    Serial2.write(Send_data[i]);
    delay(1);      // Don't delete this line !!
  }
}
unsigned char Checksum_cal(void)                          // CHECKSUM 
{
  unsigned char count, SUM=0;
  for(count=0; count<55; count++)
  {
     SUM += Receive_Buff[count];
  }
  return 256-SUM;
}

void setup() {
   pinMode(redPin_1, OUTPUT);
   pinMode(greenPin_1, OUTPUT);
   pinMode(bluePin_1, OUTPUT);

   pinMode(redPin_2, OUTPUT);
   pinMode(greenPin_2, OUTPUT);
   pinMode(bluePin_2, OUTPUT);
  
  Serial.begin(9600);
  while (!Serial) ;
  Serial2.begin(9600);
  while (!Serial2);

  // initialize the LCD
  lcd.begin(); // lcd를 사용을 시작합니다.
  lcd.backlight(); // backlight를 On 시킵니다.
  //lcd.print("Hello, world!"); // 화면에 Hello, world!를 출력합니다.
}

void loop() {

  //lcd.begin(); // lcd를 사용을 시작합니다.
  
  display_pm10();
  display_temphumi();
  airquality_rgb();
  
  delay(500);       //1000ms
    
}

void airquality_rgb()
{
  if(PM25 <= 15)
    setColor(255, 0, 0); // cyan
  if((PM25>15) && (PM25<=35))
    setColor(255, 0, 255); // green
  if((PM25>35) && (PM25<=75))
    setColor(0, 0, 255); // yello
  if(PM25>75)
    setColor(0, 255, 255); // red
}

void setColor(int red, int green, int blue)
{
  digitalWrite(redPin_1, red);
  digitalWrite(greenPin_1, green);
  digitalWrite(bluePin_1, blue); 
}


void display_pm10()
{
  COM_COUNT++;  
  Send_CMD();  // Send Read Command
  
  while(1)
  {
    if(Serial2.available())
    { 
       Receive_Buff[recv_cnt++] = Serial2.read();
      if(recv_cnt ==56){recv_cnt = 0; break;}
    }
    
  } 
  if(Checksum_cal() == Receive_Buff[55])  // CS 확인을 통해 통신 에러 없으면
  {
        COM_SUCCESS++;
        PM1 = (unsigned long)Receive_Buff[3]<<24 | (unsigned long)Receive_Buff[4]<<16 | (unsigned long)Receive_Buff[5]<<8| (unsigned long)Receive_Buff[6];  // 농도계산(시프트)
        PM25 = (unsigned long)Receive_Buff[7]<<24 | (unsigned long)Receive_Buff[8]<<16 | (unsigned long)Receive_Buff[9]<<8| (unsigned long)Receive_Buff[10];  // 농도계산(시프트)
        PM10 = (unsigned long)Receive_Buff[11]<<24 | (unsigned long)Receive_Buff[12]<<16 | (unsigned long)Receive_Buff[13]<<8| (unsigned long)Receive_Buff[14];  // 농도계산(시프트)
        Serial.write("COM count : ");
        Serial.print(COM_SUCCESS);
        Serial.write(" / ");
        Serial.print(COM_COUNT);
        Serial.write("    PM1.0 : ");
        Serial.print(PM1);
        Serial.write("    PM2.5 : ");
        Serial.print(PM25);
        Serial.write("    PM10 : ");
        Serial.println(PM10);

        lcd.setCursor(7, 0);
        lcd.print((int)PM25);
        lcd.print("   ");
   }
   else
   {
     Serial.write("CHECKSUM Error");
   }
}

void display_temphumi() {
  // 습도와 온도값을 측정하고, 제대로 측정되었는지 확인해줍니다.
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
 
  //if (isnan(humidity) || isnan(temperature) ) {
    //Serial.println("Failed to read from DHT sensor!");
    //return;
  //}
 
  // 온도와 습도값을 시리얼 모니터에 출력해 줍니다.
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print((int)humidity); Serial.println(" %");
 
  // LCD에 출력할 습도 메세지를 만듭니다.
  //String humi = "Humi : ";
  //humi += (String)humidity;
  //humi += "%";
 
  // LCD에 출력할 온도 메세지를 만듭니다.
  //String temp = "temp : ";
  //temp += (String)temperature;
  //temp += "C";
 
  // 첫번째 줄, 첫번째 칸부터 "Humi = 000%" 를 출력해 줍니다.
  //lcd.setCursor(0, 0);
  //lcd.print(humi);
 
  // 두번째 줄, 첫번째 칸부터 "temp = 000C" 를 출력해 줍니다.
  lcd.setCursor(4, 1);
  lcd.print((int)temperature);
  lcd.print(" C ");
  lcd.print((int)humidity);
  lcd.print(" %");
 
  //delay(1000);
}

 

 

폼나는 미세먼지 공기청정기, 프로젝트명 소나기 Sonagi

 

#메이커 운동, #반응하는 인형, #소프트웨어교육, #웨더 스테이션, #인형, #컴퓨터과학언플러그드, #컴퓨팅사고, #피지컬컴퓨팅, #미센먼지, #미세먼지공기청정기, #공기청정기,#DIY 공기청정기, #softbox 교육도구,#소프트박스,#arduino softbox, #softbox raspberrypi,#라즈베리파이교육,#임베디드시스템,#교육도구개발,

 

 

 

반응형