2023.11.15(am): 아두이노 가습기 만들기

이 자료는 로봇만들기 봉사활동에 사용될 자료입니다.

부품 구매 링크

건조한 겨울철을 대비하여 아두이노를 활용한 가습기를 만들겠습니다.

가습기의 종류에는 가열식 가습기와, 초음파 가습기가 있는데, 우리는 초음파 가습기를 만들것입니다.

먼저 부품을 꺼내서 아래와 같이 구성되어 있는지, 빠진 것은 있는지 확인해봅시다.

초음파 가습기 모듈은 아래와 같이 생겼는데, 전선은 방수처리가 되어있으며, 물이 없을 때 사용하면 고온에 의해 전선이 끊어질 수 있으니 물이 없는 상태에서 동작시키지 않도록 주의합니다.
또한 하얀색부분이 진동판인데, 진동판은 물에 띄워서 작동시켜야 하며 물 속으로 잠기면 가습이 되지 않습니다.

다음은 LCD 모듈입니다. LCD 모듈은 스위치 많이 누르기 게임에서 다뤄봤을텐데요,

복습을 해보면 LCD 란 Liquid Crystal Display 의 약자로 액정 표시 장치입니다.
액정(Liquid Crystal)이란 액체처럼 유체의 성질을 가지며, 고체처럼 광학 성질을
가지는 물질을 말합니다. 뒤에 있는 가변저항을 통해 문자의 명암(선명도)을 조절할 수 있습니다.
또한 액정은 전기적 신호를 가해 원하는 방향으로 배열하여 빛을 투과시키거나
차단 시킬 수 있습니다.

다음은 온습도 센서입니다.

온습도 센서의 이름은 DHT11입니다. 이 센서는 서미스터(Thermistor: thermally sensitive resistor)라 하는 반도체의 저항이 온도에 따라 변하는 특성을 이용한 것인데요,
일반적으로 온도 센서를 사용할 때 금속산화물 반도체를 사용하며, 금속에 비해 비교적 큰 저항온도계수를 가지며 서미스터의 저항온도계수(TCR: Temperature Coefficient of Resistance)는 일정하지 않으며 온도에 따라 달라지는 특성을 보입니다.
온도가 증가함에 따라 저항이 증가 하는 타입을 정온도계수 (PTC :positive temperature coefficient)형, 저항은 감소하는 타입을 부온도계수(NTC :negative temperature coefficient)형이라 합니다. DHT11은 NTC형이 사용되고 있습니다.
DHT11센서에서 습도의 경우는 습도에 따라 저항이 변하는 정전용량 습도 센서를 사용합니다.
습도의 단위 RH는 Relative Humidity로 상대 습도를 말합니다.
즉 대기 중에 포함되어있는 수증기량과 측정 당시의 온도에서 포함할 수 있는 최대의 수증기량과의 비를 백분율로 표시한 것입니다.

온습도 센서 사용법은 아래 글을 참고해주세요.

LCD 모듈, 온습도센서, 초음파 가습기 모듈을 순서대로 동작시키며 테스트해보겠습니다.

우선 LCD 모듈과 아두이노를 아래와 같이 연결해주세요.

그리고 아래 소스코드를 업로드 해줍니다.

LiquidCrystal_I2C 라이브러리가 필요한데, 라이브러리 매니저에서 해당 라이브러리를 찾아 다운로드 해줍니다. 아래는 LCD 모듈의 주소를 알아보는 코드입니다.

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);     //시리얼 통신 속도
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
 
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

시리얼 모니터에 뜨는 LCD모듈의 Adress를 기록해둡니다.

그리고나서 아래와 같이 온습도 센서를 아두이노와 연결합니다.





가습기 모듈의 전선은 아래 모터드라이버의 MOTOR A 부분에 드라이버로 연결해줍니다.

아두이노의 GND와 5V를 사용하기 위해 아래와 같이 브레드 보드에 연결해줍니다.

모터드라이버의 전원선 제외, A-1A 은 8번핀, A-1B는 7번핀에 연결해줍니다.

아래 코드를 업로드해줍니다.

DHT11 라이브러리도 추가해야합니다.

#include <LiquidCrystal_I2C.h>    // I2C LCD 모듈 라이브러리
LiquidCrystal_I2C lcd(0x27,16,2);   //(주소, 글자수, 줄수)

#include <DHT11.h>              // 온습도 센서 라이브러리

int t_h_pin = 4;       //온습도 센서핀
int motorA = 7;
int motorB = 8;
DHT11 dht11(t_h_pin); 


void setup() 
{
  
      Serial.begin(9600);       // 시리얼 통신 시작, 통신속도 설정
    
      pinMode(t_h_pin,OUTPUT);        // 온습도 핀모드 설정

       pinMode(motorA,OUTPUT);
       pinMode(motorB,OUTPUT);

      lcd.init();
      lcd.backlight();      // I2C LCD 모듈 backlight_ON
    
}

void loop() 
{
      float temp, humi;             // 온습도 센서 측정 값 함수 설정
      dht11.read(humi, temp);
  
      Serial.print("temperature:");        // 시리얼 모니터 창에 "temperature" 글씨 출력
      Serial.print(temp);                // 센서에서 측정한 온도 값을 시리얼 모니터 창에 출력
      
      lcd.setCursor(0,0);             // LCD 화면에 글씨 시작 위치 값 설정 
      lcd.print("t:");              // LCD 화면에 "t:" 글씨 출력
      lcd.print(temp);            // LCD 화면에 온도 값 출력

      
      Serial.print("humidity:");         // 시리얼 모니터 창에 "humidity" 글씨 출력
      Serial.println(humi);            // 센서에서 측정한 습도 값을 시리얼 모니터 창에 출력
      
      lcd.setCursor(9,0);            // LCD 화면에 글씨 시작 위치 값 설정 
      lcd.print("h:");             // LCD 화면에 "h:" 글씨 출력
      lcd.print(humi);           // LCD 화면에 습도 값 출력
   
      delay(3000);          // 딜레이 3초
      
  
      if ( humi < 30 )        // 습도 값이 30 미만 ( 기준 값 )
      {
        digitalWrite(motorA, LOW);
        digitalWrite(motorB, HIGH);
          lcd.setCursor(0,1);                // LCD 화면에 글씨 시작 위치 값 설정 
          lcd.print(" humidifier_ON");            // LCD 화면에 " humidifier_ON" 글씨 출력
      }
  
      else            // 습도 값이 30 이상 ( 기준 값 )
      {
        digitalWrite(motorA, HIGH);
        digitalWrite(motorB, HIGH);
          lcd.setCursor(0,1);               // LCD 화면에 글씨 시작 위치 값 설정 
          lcd.print("humidifier_OFF");           // LCD 화면에 " humidifier_OFF" 글씨 출력
      }

}

Leave a Reply

Your email address will not be published. Required fields are marked *