프로젝트

공기품질 모니터링 사물인터넷 프로젝트 / 아두이노 / 먼지센서 / 스근하이

페이지 정보

작성자 용가리치킨 작성일17-03-28 17:37 조회4,384회 댓글0건

본문


 안녕하세요 메카솔루션입니다. 

이번에는 먼지센서와 아두이노를 이용해서 인터넷을 통해 먼지 센서의 값을 모니터링 하는 프로젝트를 만들어 보고자 합니다.

봄이 되니까 벗꽃도 이쁘고 개나리도 이쁜데.... 하늘만이 어째 누렇습니다.


pick_manager-15이놈이 봄이라도 타나보네;;


아무튼 이 누런 하늘은 역시 황사가 원인이라 생각 됩니다. 혹시라도 먼지때문에 건강이라도 나빠지면 큰일입니다. 조심하는 것도 좋지만 내가 일하는 업무환경도 한번 신경을 써 봐야 겠습니다.

그래서 이번에 만들어볼 프로젝트는 공기 품질 모니터 입니다.

위는 이번 프로젝트에 사용할 부품 목록입니다. 


그렇다면 바로 만들어 봅시다.


회로도 알아보기

회로도는 다음과 같습니다.

저의 경우 납땜을 해서 사용했지만  납땜을 하지 않고 흰색 소켓 부분에서 점퍼선을 끌어다 사용 할 수 있습니다.



스근하이 가입하고, 장치및 센서 등록하기

우선 센서 데이터를 모니터링 하는것은 스근하이 서비스를 이용하고자 합니다. 우선 이용을 위해 간단한 회원가입과 장치 등록이 필요한데 다음을 참고해 줍니다.

http://sgnhi.org

위링크가 스근하이 홈페이지 입니다. 우선 회원 가입을 합니다.


http://blog.sgnhi.org/220713418216


소스코드 알아보기

소스코드를 작성하기 앞서 라이브러리를 다운로드 해야 합니다.

https://github.com/keepworking/ezTask

https://github.com/SGNHI/SGN_Arduino_Ethernet

소스코드는 두가지를 보도록 하겠습니다.

기본 먼지센서 코드

#define        COV_RATIO                       0.2            //ug/mmm / mv

#define        NO_DUST_VOLTAGE                 400            //mv

#define        SYS_VOLTAGE                     5000           



/*

I/O define

*/

const int iled = A1;                                            //drive the led of sensor

const int vout = A0;                                            //analog input


/*

variable

*/

float density, voltage;

int   adcvalue;


/*

private function

*/

int Filter(int m)

{

  static int flag_first = 0, _buff[10], sum;

  const int _buff_max = 10;

  int i;

  

  if(flag_first == 0)

  {

    flag_first = 1;


    for(i = 0, sum = 0; i < _buff_max; i++)

    {

      _buff[i] = m;

      sum += _buff[i];

    }

    return m;

  }

  else

  {

    sum -= _buff[0];

    for(i = 0; i < (_buff_max - 1); i++)

    {

      _buff[i] = _buff[i + 1];

    }

    _buff[9] = m;

    sum += _buff[9];

    

    i = sum / 10.0;

    return i;

  }

}



void setup(void)

{

  pinMode(iled, OUTPUT);

  digitalWrite(iled, LOW);                                     //iled default closed

  

  Serial.begin(9600);                                         //send and receive at 9600 baud

  //Serial.print("*********************************** WaveShare ***********************************\n");

}


void loop(void)

{

  /*

  get adcvalue

  */

  digitalWrite(iled, HIGH);

  delayMicroseconds(280);

  adcvalue = analogRead(vout);

  digitalWrite(iled, LOW);

  

  adcvalue = Filter(adcvalue);

  

  /*

  covert voltage (mv)

  */

  voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;

  

  /*

  voltage to density

  */

  if(voltage >= NO_DUST_VOLTAGE)

  {

    voltage -= NO_DUST_VOLTAGE;

    

    density = voltage * COV_RATIO;

  }

  else

    density = 0;

    

  /*

  display the result

  */

  //Serial.print("The current dust concentration is: ");

  Serial.print(density);

  //Serial.print(" ug/m3\n");  

  Serial.println();

  delay(1000);

}


스근하이 센서 모니터링 코드

#include <SGN_Arduino_Ethernet.h>//스근하이 이더넷 라이브러리 입니다.

#include <ezTask.h>


#define        COV_RATIO                       0.2            //ug/mmm / mv

#define        NO_DUST_VOLTAGE                 400            //mv

#define        SYS_VOLTAGE                     5000         


char ID[] = "사용자ID";//사용자의 ID를 입력합니다.

char DEVICE_CODE[] = "장치코드";//장치 코드를 입력해주도록 합니다.


IPAddress IP(192, 168, 0, 177);//IP주소를 입력해줍니다.

dotori Dsensor("센서코드");//사용할 센서를 선언해줍니다.


/*

  I/O define

*/

const int iled = A1;                                            //drive the led of sensor

const int vout = A0;                                            //analog input


/*

  variable

*/

float density, voltage;

int   adcvalue;


int Filter(int m)

{

  static int flag_first = 0, _buff[10], sum;

  const int _buff_max = 10;

  int i;


  if (flag_first == 0)

  {

    flag_first = 1;


    for (i = 0, sum = 0; i < _buff_max; i++)

    {

      _buff[i] = m;

      sum += _buff[i];

    }

    return m;

  }

  else

  {

    sum -= _buff[0];

    for (i = 0; i < (_buff_max - 1); i++)

    {

      _buff[i] = _buff[i + 1];

    }

    _buff[9] = m;

    sum += _buff[9];


    i = sum / 10.0;

    return i;

  }

}


ezTask Dust(1000, []() {

  digitalWrite(iled, HIGH);

  delayMicroseconds(280);

  adcvalue = analogRead(vout);

  digitalWrite(iled, LOW);


  adcvalue = Filter(adcvalue);


  /*

    covert voltage (mv)

  */

  voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;


  /*

    voltage to density

  */

  if (voltage >= NO_DUST_VOLTAGE)

  {

    voltage -= NO_DUST_VOLTAGE;


    density = voltage * COV_RATIO;

  }

  else

    density = 0;

    Serial.println(density);

});



void setup() {

  Serial.begin(9600);

  //dev.setmac(0xC0, 0x00, 0x01, 0x0F, 0xF1, 0xCE);//맥어드레스 변경은 충돌이 없을시 생략 가능합니다.

  dev.init(ID, DEVICE_CODE, IP); //장치의 사용을 시작합니다.

  dev.setRest((unsigned long)1000 * 60 * 10);

  pinMode(iled, OUTPUT);

  digitalWrite(iled, LOW);

}


void loop() {

  Dust.run();//먼지센서의 값을 갱신 합니다.

  Dsensor.set(density);//읽어들인 먼지센서의 값을 저장합니다.

  dev.send(Dsensor);

}




동작 모습 확인해 보기




아직 데이터가 얼마 안쌓여 있는데 얼추 맞는 것같습니다. 값이 조금 틀린것 같은 부분은 자체에 있는 가변저항을 조절하여 값을 조정 할 수 있습니다.




스마트폰 환경에서도 접속하면 확인이 가능합니다.




누적된 데이터를 따로 다루어 보고 싶다면 다운로드 기능을 사용할 수 있습니다.


감사합니다.


출처 메카솔루션

댓글목록

등록된 댓글이 없습니다.


모바일 버전으로 보기