본문 바로가기

아두이노 수경재배

아두이노로 만드는 수경재배 장치; 5. 온도, 습도계 v 2.0

아두이노로 만드는 수경재배 장치 목차

1. 아두이노 시작하기

2. 아두이노 IDE

3. 첫 번째 아두이노 개발

4. 온도, 습도계 v 1.0

5. 온도, 습도계 v 2.0

6. 조도계 (광센서)

7. 시간 지연 릴레이 (자동 스위치)

8. 와이파이 연결 (ESP 01) - 1

9. 와이파이 연결 (ESP 01) - 2

 

지난주에 육모판에 뿌린 씨앗이 100개 정도 싹을 틔웠는데, 아직은 밤이면 온도가 많이 떨어져서 괜찮은지 걱정이 되었다. 그래서 지난번에 아두이노로 만든 온도, 습도계 v 1.0을 컴퓨터를 사용하지 않고도 직접 사용할 수 있도록 LCD를 달기로 했다.

 

LCD를 연결하는 방법은 LCD모듈을 아두이노 보드로 직접 연결하는 방법과 I2C모듈을 사용해서 연결하는 2가지 방법이 있다. 아두이노 보드를 직접 연결하려면,

 

이렇게 많은 점퍼선이 필요하다. 반면 I2C 방식을 이용하면 VCC, GND 전원선 2가닥과 SDA, SCL두선만 연결하면 LCD를 연결할 수 있다.

 

가격차이도 많이 나지 않기 때문에 당연히 I2C방식으로 연결하기로 했다. 그럼 I2C는 뭘까?

1. I2C 프로토콜

I2C는 Inter-Integrated Circuit의 약자로, 아두이노가 컴퓨터와 통신하기 위해 UART를 사용해서 RX, TX두선을 USB로 변환해서 주고받는 것처럼 IC(집적회로)끼리 통신할 때 2선으로 통신할 수 있도록 해 준다. 뿐만 아니라 아래의 그림처럼 1부터 n개로 구성된 여러 개의 IC를 SDA (Serial DAta), SCL (Serial CLock) 두 선으로 묶어도 모두와 통신이 가능하게 해 주는 편리한 프로토콜이다. 아두이노처럼 점퍼선을 사용해서 복잡한 기기들을 연결한다면 LCD의 예처럼 연결선을 2선 + 전원선으로 대폭 줄여줄 수 있다.

 

출처: 위키피디아

2. 회로구성 2차

지난번에 만든 온도, 습도계를 I2C가 들어있는 LCD를 연결하여 업그레이드한 회로는 다음과 같다.

 

실제 아두이노 UNO와 프로토타입 쉴드에 구현된 형태는 아래 사진과 같다.

 

3. 스케치 프로그램 2차

  • I2C LCD 테스트

먼저, I2C 방식의 LCD를 연결하기 위해 먼저 아두이노 IDE의 Library Manager에서 해당 라이브러리를 찾아 설치한다.

 

이제 LCD가 동작하는지 간단한 테스트 프로그램을 돌려보자.

 

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

void setup()
{
  lcd.init();                  // initialize the lcd 
  lcd.backlight();
}

void loop()
{
  lcd.clear();                 // clear display
  lcd.setCursor(0, 0);         // move cursor to   (0, 0)
  lcd.print("Arduino");        // print message at (0, 0)
  lcd.setCursor(2, 1);         // move cursor to   (2, 1)
  lcd.print("I2C LCD Test");   // print message at (2, 1)
  delay(2000);                 // display the above for two seconds
}

 

만일 LCD에 백라이트가 들어오고 SDA (A4 핀)와 SCL(A5 핀)을 제대로 연결했는데도 글자가 나오지 않는다면 뒷면에 있는 가변저항을 좌우로 돌려보자. 많은 경우 가변저항을 돌려보면 해결이 된다.

 

  • 온도, 습도 LCD로 표시

이제 지난번에 참조했던 DHTlib의 Example프로그램에서 Serial출력을 lcd.print로 바꿔 LCD에 표시되도록 수정해 보자.

 

#include <dht.h>
#include <LiquidCrystal_I2C.h>

#define DHT22_PIN     8

LiquidCrystal_I2C lcd(0x27,16,2);
dht DHT;

struct
{
    uint32_t total;
    uint32_t ok;
    uint32_t crc_error;
    uint32_t time_out;
    uint32_t connect;
    uint32_t ack_l;
    uint32_t ack_h;
    uint32_t unknown;
} stat = { 0,0,0,0,0,0,0,0};

void setup()
{
    lcd.init();                 // initialize the lcd 
    lcd.backlight();
}

void loop()
{
    lcd.clear();                 // clear display
    lcd.setCursor(0, 0);         // move cursor to   (0, 0)

    uint32_t start = micros();
    int chk = DHT.read22(DHT22_PIN);
    uint32_t stop = micros();

    stat.total++;
    switch (chk)
    {
    case DHTLIB_OK:
        stat.ok++;
        lcd.print("Humidity: ");
        lcd.print(DHT.humidity);
        lcd.setCursor(0, 1);
        lcd.print("Temp: ");
        lcd.print(DHT.temperature);
        break;
    case DHTLIB_ERROR_CHECKSUM:
        stat.crc_error++;
        lcd.print("Checksum error");
        break;
    case DHTLIB_ERROR_TIMEOUT:
        stat.time_out++;
        lcd.print("Time out error");
        break;
    case DHTLIB_ERROR_CONNECT:
        stat.connect++;
        lcd.print("Connect error");
        break;
    case DHTLIB_ERROR_ACK_L:
        stat.ack_l++;
        lcd.print("Ack Low error");
        break;
    case DHTLIB_ERROR_ACK_H:
        stat.ack_h++;
        lcd.print("Ack High error");
        break;
    default:
        stat.unknown++;
        lcd.print("Unknown error");
        break;
    }
    delay(2000);
}

아두이노로 Upload 하고 문제가 없으면 다음과 같이 습도와 온도가 표시된다.