본문 바로가기 주메뉴 바로가기

1. 개요

아두이노는 저렴한 가격에 기초적인 지식만으로도 쉽게 프로그래밍을 할 수 있는 마이크로컨트롤러 보드입니다. 

간략히 특장점을 정리하면 아래와 같습니다.


 -. 저렴한 가격

 -. 다양한 입출력 장치의 손쉬운 연결

 -. 여러 운영체제와의 연결 (윈도우, 맥, 리눅스 모두 작동)

 -. 통합개발환경(IDE)가 제공외어 쉽게 프로그래밍이 가능

 -. USB를 통한 손쉬운 펌웨어 업로드

 -. 하드웨어 및 소프트웨어 모두 오픈소스


1.1. 아두이노 종류와 특징

아두이노는 하나의 제품을 말하는 것이 아니라 아두이노 오픈소스를 기반으로 한 컴퓨팅 플랫폼과 개발환경을 지칭하는 것으로 다양한 모양과 성능의 아두이노 및 아두이노 호환 보드의 개발이 되고 있습니다. 국내에서는 대표적으로 코코아팹이 있습니다. 


정말 많은 종류의 아두이노 보드가 있지만 교육현장에서 가장 많이 사용되는 아두이노 우노보드와 아두이노 나노보드에 대하여 알아보겠습니다.


1. 아두이노 Uno 


가장 많이 사용되는 아두이노 보드로 USB 통신을 위한 FTDI 칩을 기본 내장하여 PC와 바로 연결이 됩니다, 

USB 전원 및 외부 입력전원 사용이 가능하며, 5V, 3.3V 모두 지원하기 위한 레귤레이터가 내장되어 있습니다,

표준 보드의 형태로 다양한 확장 쉴드 보드들이 개발되어 있습니다,


 


2. 아두이노 Nano


아두이노 우노의 소형화 버전이라고 생각하시면 됩니다. 우노보드와 같은 프로세서를 사용하여 우노의 기능을 그대로 제공(아날로드 입력핀이 우노보다 2개 더 많음)하며, Micro 5pin USB 커넥터로 PC와 연결됩니다. 9V 건전지를 VIN, GND 핀으로 연결하여 소형화하여 다른 창작물에 장착할 수 있습니다. 





더 많은 아두이노 보드를 알아 보시려는 분들을 위해 정리가 잘 되어 있는 사이트 링크를 드려봅니다.^^

http://www.hardcopyworld.com/ngine/aduino/index.php/archives/274 


2. 기본사용법


2.1. 소프트웨어 설치

아두이노를 사용하기 위해서 소프트웨어를 설치하여야 합니다.


아두이노 IDE 다운로드

 -> https://www.arduino.cc/en/Main/Software


아두이노는 무설치 버전인 Zip파일용과 설치버전이 있습니다.

자주 사용한다면 설치버전이 좋겠지요^^ 


다운로드 할 때 기부 여부를 물어봅니다.
다운로드만 하시려면 'JUST DOWNLOAD', 기부하시고 다운로드 하시려면 'CONTRIBUTE & DOWNLOAD'를 클릭하시면 됩니다.

 
다운로드 후 설치 과정 중 특별하게 주의할 부분은 없고 중간에 보안창이 뜨면 '신뢰'에 체크하고 진행하시면 됩니다.
설치는 아두이노 IDE와 아두이노 보드 드라이버 2번을 설치하게 됩니다. 

2.2. 아두이노와 PC 연결

1. 아두이노 보드를 USB 케이블로 연결합니다.

연결을 하면 소프트웨어 설치시 아두이노 보드 드라이버를 같이 설치하였기때문에 컴퓨터가 알아서 아두이노 보드를 잡아줍니다. 


[연결 오류 시]

정품보드가 아닌 호환보드의 경우 연결 오류가 있을 경우 컴퓨터가 아두이노 보드를 제대로 설치하지 못하기 때문에 호환 드라이버를 수동으로 설치 후 재연결합니다.

호환 드라이버 다운로드 

 -> https://drive.google.com/open?id=1aK3e_27ZjLqHkq4bn3MuaYJwLoSnjHLd


2. 아두이노 IDE를 실행한 후 툴 -> 보드/ 프로세서/ 포트를 잡아줍니다.

 1) 보드 : 연결한 보드의 이름을 선택합니다. 저는 아두이노 나노보드를 주로 사용하여, 나노를 선택하였습니다.

 2) 프로세서 : 아두이노 우노와 나노는 모두 ATmega328P 프로세서를 사용합니다. Old Bootloader와 두 종류가 있는데 한 종류에서 업로드 오류가 나면 다른 하나로 바꾸어주면 대부분 업로드가 됩니다.

 3) 포트 : 연결된 포트를 보여주는데 보통 COM1 이외 다른 포트 (저는 COM8 이네요)를 선택해 주면됩니다. 물론, PC 장치관리자에 들어가서 확인하면 되지만 굳이 그렇게까지 하지 않아도 됩니다^^


 

2.4. 컴파일 및 업로드

프로그램을 작성 후 업로드 아이콘을 클릭해주면 컴파일 후 업로드까지 진행이 됩니다,



 

컴파일 또는 업로드 중 오류가 나면 아래 오류메세지에 오류의 원인이 나오게 되니, 보고 확인 후 수정하여 다시 컴파일 및 업로드를 하시면 됩니다.


 

3. 예제


3.1. LED 스위치 제어 (풀업)


아두이노 우노를 사용하였습니다.


스위치를 이용하여 LED를 제어해보며, 플로팅 상태를 해결하기 위한 풀업, 풀다운 구성을 살펴보며 전기의 성질에 대하여도 이해해 봅니다.


1. 준비물 

  -. 아두이노 우노보드, LED 1개, 점퍼케이블(수-수) 3개, 저항 1개(1k옴 정도), 스위치 (아무거나^^)


2. LED 제어 목표

  -. 4번핀을 입력, 13번핀을 출력으로 스위치로 LED 제어를 합니다.

  -. LED에 적정 전압을 주기 위해서 330옴 정도의 저항을 연결해야 되는데, 간단한 실습으로 바로 보드 13번핀과 GND에 바로 LED를 연결합니다.


 1) 일반적인 생각 (플로팅 상태)

  -. 아래처럼 배선과 프로그래밍을 하면,
    스위치가 닫히면 -> 4번핀에 전류가 흘러 HIGH -> LED 켜짐
    스위치가 열리면 -> 4번핀에 전류가 흐르지 않아 LOW -> LED 꺼짐



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int led = 13;                       // 13번핀을 led로 선언
int sw = 4;                       // 4번핀을 sw로 선언
 
void setup() {
  pinMode(led, OUTPUT);            //led핀을 OUTPUT으로 설정
  pinMode(sw, INPUT);             // sw핀을 INPUT으로 설정
 
}
 
void loop() {
  if (digitalRead(sw) == HIGH) {        // sw핀의 로직레벨이 HIGH면
    digitalWrite(led, HIGH);          // led핀으로 HIGH(5V)출력 -> LED 켜짐 
  }
  else {
    digitalWrite(led, LOW);          // 아니면 led핀으로 LOW출력 -> LED 꺼짐
  }
}
 
cs



그런데, 실제로 동작을 해보면, LED 제어가 안됩니다^^;;; 


  

그럼 실제로 4번핀의 입력상태가 어떤지 알아보기 위해 아래 코드를 다운로드한 후 시리얼모니터로 상태를 봅니다.


1
2
3
4
5
6
7
8
9
10
11
12
int pushButton = 4;  // 4번핀을 pushButton으로 선언
 
void setup() {
  Serial.begin(9600);
  pinMode(pushButton, INPUT);  //pushButton핀을 입력으로 설정
}
 
void loop() {
  int buttonState = digitalRead(pushButton); // pushButton 디지털 입력상태를 buttonState로 선언
  Serial.println(buttonState);  // 시리얼모니터에 buttonState 
  delay(1);    
}
cs




 

  상태를 보면 스위치가 닫히면 1이 출력 되지만 스위치가 열리면 1과 0이 번갈아가며 출력이 됩니다.

  즉, 스위치가 열려 전원이 공급되지 않아도 입력핀에 전류가 애매하게^^ 남아서 1과 0 사이에서 방황하는 이 상태를 '플로팅 상태'라고 합니다. 

  그럼 이렇게 스위치가 열렸을 때 입력핀에 있는 잔여 전류를 확실히 없앨 수 있는 회로 구성이 필요하겠지요? 

  이런 회로 구성을 풀업(PULL-UP)과 풀(PULL-DOWN) 이라고 합니다.


 2) 풀업 (PULL-UP)


  플로팅 상태의 값을 끌어올린다는 것으로 스위치가 열려있을 때 1 (HIGH)값을 가지도록 하는 방법입니다.

  풀다운보다 노이즈나 충격에 강해서 더 많이 사용됩니다.

  아래 처럼 회로 구성을 합니다.




[회로도 출처: 코코아팹 홈페이지 학습 - 중급 예제 중]

  -. 스위치가 열리면
   -> 전류가 4번핀에 전류가 흘러서 HIGH 출력,
  -. 스위치가 닫히면 
    -> VCC와 GND가 연결되며, 4번핀에 남아있을 수 있는 전류와 함께 모두 GND로 흘러가서 4번핀에 흐르는 전류가 없어 LOW 출력이 됩니다. 


 3) 아두이노 프로그램 작성


  -. 풀업은 스위치가 열려있을 때 핀에 HIGH, 닫혔을 때 LOW이니, LOW 일때 LED가 켜지도록 프로그램 하면 스위치를 켰을 때 LED가 켜지겠지요^^  


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int led = 13;                       // 13번핀을 led로 선언
int sw = 4;                       // 4번핀을 sw로 선언
 
void setup() {
  pinMode(led, OUTPUT);            //led핀을 OUTPUT으로 설정
  pinMode(sw, INPUT);             // sw핀을 INPUT으로 설정
 
}
 
void loop() {
  if (digitalRead(sw) ==  LOW) {        // sw핀의 로직레벨이 LOW면
    digitalWrite(led, HIGH);          // led핀으로 HIGH(5V)출력 -> LED 켜짐 
  }
  else {
    digitalWrite(led, LOW);          // 아니면 led핀으로 LOW출력 -> LED 꺼짐
  }
}
 
cs


 

4. 동작


 -. 스위치를 닫으면(ON) LED가 켜지고, 열면(OFF) LED가 꺼지는 것을 확인합니다.



 

5. 생각해보기


  -. 그냥 떠오르는 생각^^;; 


   위 회로를 가만히 보다보면 저항이 없어도 되지 않나? 라는 생각을 할 수 있습니다. 

   VCC와 GND가 바로 붙어서 합선의 효과로 보드가 제대로 동작하지 않습니다. 

   그럼 조금 낮은 3.3V를 넣어주면 어떨까요? 마치 저항을 붙인 것 같은 효과처럼요^^

   아두이노 보드의 3.3V 핀으로 연결하여 해보면 저항 없이도 동작하는 것을 볼 수 있습니다. (다른 보드에 따라 안될 수도 있습니다^^;;)

   이는 입력핀이 어느 정도의 전압을 기준으로 HIGH와 LOW를 넘나드느냐에 따라 다르며, HIGH-> LOW, LOW -> HIGH에 따라 또 다를 수도 있습니다.

   이 실험은 단순히 입출력핀이 디지털 입력의 HIGH와 LOW를 구분하는 기준을 이해하는 선에서 해보시기 바랍니다.     



 6. 아두이노 소프트웨어 풀업(PULL-UP) 지원


  아두이노의 각 핀에는 내부에 풀업 저항이 달려있기 때문에 저항이 없어도 풀업을 사용할 수 있습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int led = 13;                       // 13번핀을 led로 선언
int sw = 4;                       // 5번핀을 sw로 선언
 
void setup() {
  pinMode(led, OUTPUT);            //led 핀을 OUTPUT으로 설정합니다.
  pinMode(sw, INPUT_PULLUP);        //sw가 연결된 핀의 모드를 INPUT_PULLUP 상태로 설정합니다.
 
}
 
void loop() {
  if (digitalRead(sw) == LOW) {        // 스위치가 연결된 핀이 LOW라면, 
    digitalWrite(led, HIGH);          // led핀으로 HIGH(5V)출력 -> LED 켜짐
  }
  else {
    digitalWrite(led, LOW);    // 아니면 LOW 출력 -> LED 
  }
}
cs

 

  핀 설정을 INPUT_PULLUP 으로 하고, 스위치에 GND만 연결하면 됩니다.

  간편하지요?^^


 


 

3) 풀다운 회로 구성


  회로 구성에 대한 이해로 알아보며, 회로가 이해가 되면 풀업이 더 안정적인 것을 알 수 있습니다.


[회로도 출처: 코코아팹 홈페이지 학습 - 중급 예제 중]

3.2. 블루투스 LED 제어 무드등 만들기


아두이노 나노를 사용하였습니다.


주제 : 아두이노 블루투스로 LED 제어하여 나만의 작품 만들기

학습목표 : 아두이노 IDE 기본 사용법을 알 수 있다

              블루투스 이름을 변경할 수 있다.

              스마트폰으로 블루투스 연결하여 LED의 On/ Off 를 제어할 수 있다,

              나만의 개성있는 LED 활용 작품을 만들 수 있다.

 

1. 준비물


아두이노 나노보드, 블루투스 HC-06, USB 케이블(나노용), LED, 미니브레드보드, 9V 배터리, 9V배터리 홀더(핀형), F-M 케이블 10cm 6개, 무드등을 만들 페트병 등 재활용 용품  


2. 기본 작업 순서

 1) 부품 연결

 2) 블루투스 이름 바꾸기

 3) LED 제어 프로그램 작성하기
 4) 스마트기기에 블루투스 조종기 설정하기

 5) 건전지 연결

 6) 나의 작품에 부착하기


3. 부품 연결

 1) 미니브레드보드에 아두이노 나노 호환보드를 끼웁니다,

 2) F-M 케이블을 이용하여 HC-06과 아두이노 나노를 연결합니다.

  -. VCC - 5V

  -. GND - GND

  -. TXD - D11

  -. RXD - D12

 3) F-M 케이블을 이용하여 LED와 아두이노 나노를 연결합니다.

  -. + (긴다리) - D3

  -. - (짧은다리) - GND

 4) 블루투스는 D11, D12 핀으로 정보를 주고 받고, LED는 D3 핀으로 출력이 되면 켜지는 구조입니다.^^

 5) 프로그램을 업로드 하기위해서 USB로 PC와 연결하면 전원을 공급받을 수 있으니 9V 건전지는 프로그래밍하는 동안 거추장^^스러우니 나중에 연결합니다. 



 


 

4. 블루투스 이름 바꾸기

 1) USB 케이블로 PC와 연결합니다.

 2) 아래 프로그램을 아두이노 IDE에서 작성합니다. (복사하여 붙여넣기 합니다^^)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <SoftwareSerial.h>
 
SoftwareSerial BTSerial ( 1112 );    // 11=TXD, 12=RXD 값 변경 가능
 
void setup() {  
 
  Serial.begin ( 9600 );
 
  BTSerial.begin ( 9600 );
 
}
 
void loop() {
 
  if ( BTSerial.available() )
    Serial.write ( BTSerial.read () );
 
  if ( Serial.available() )
    BTSerial.write ( Serial.read() );
 
}
cs


 3) 보드, 프로세서, 포트 등을 확인 후 프로그램을 업로드합니다. -> 모양의 업로드 아이콘을 클릭하면 PC에 저장 여부를 물어보는데 취소하면 그냥 업로드, 저장을 선택하면 저장하고 업로드를 합니다^^


.

 

 4) (Ctrl + Shift + M)을 눌러서 시리얼모니터를 엽니다.



 5) AT+NAME(원하는 이름)을 타이핑하고 엔터를 치면 'OKsetname' 이 출력되면서 HC-06의 이름이 바뀝니다. 이제 HC-06의 이름은 robomall01 입니다^^



 

 6) AT+PIN(원하는 핀번호)를 타이핑하면 핀번호가 변경됩니다. 핀번호는 쉽게 접속 비밀번호이며, 설정을 안한 경우는 대부분 '1234' 또는 '0000' 입니다. 저는 0101로 바꾸어 보았습니다^^



 

5. LED On/ Off 프로그램 작성하기

 1) 아래 프로그램을 아두이노 IDE에 새롭게 작성합니다. (복사 붙여넣기^^)

 2) 프로그램을 간략히 설명하면...

  -. 블루투스는 D11, D12번 핀으로 통신한다.

  -. 1의 신호가 들어오면 D3번으로 출력, 0의 신호가 들어오면 출력하지 않는다.

 3) 괄호 등을 빼먹지 않도록 합니다.^^


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <SoftwareSerial.h>

SoftwareSerial BTSerial(11,12);   //(TXD,RXD)
 
void setup() {
 
BTSerial.begin(9600);
Serial.begin(9600);
 
pinMode(3, OUTPUT);
 
}
 
void loop() {
 
if(BTSerial.available()){
 
char order = (char) BTSerial.read();
 
Serial.println(order);
 
if(order == '1'){
 
digitalWrite(3, HIGH);  
 
}else if(order == '0'){
 
digitalWrite(3, LOW);
 
}
 
}
}
cs



 

6. 건전지 연결

 1) 9V 건전지 홀더에서 나온 전원케이블을 아두이노 나노보드에 연결합니다.

  -. + (빨간색) - VIN

  -. - (검정색) - GND

 2) 아두이노 나노보드에는 VIN으로 연결 시 레귤레이터가 있어서 9V전원도 연결이 가능합니다.^^ (권장전압 7~12V)  


 


7. 스마트폰 블루투스 조종기 설치 및 설정하기

 1) 스마트기기에 '아두이노 블루투스 컨트롤러' 를 검색하여 설치 후 실행합니다.


 2) 블루투스 리스트에서 내 블루투스를 찾아 클릭합니다. 저는 robomall01 이라고 이름을 지어주었었지요^^
 3) 처음 연결 시 PIN번호를 넣으라고 하면 설정한 PIN 번호를 입력합니다. 저는 '0101'^^
 4) 스위치 모드를 선택하고, 설정(우측 상단의 기어모양)을 클릭한 후 녹색에 '1' 빨간색에 '0' 넣어줍니다
 5) 이제 스위치를 클릭하면 LED On/ Off 제어가 됩니다.


 

8. 나만의 작품에 부착하기  

 1) PET병 등 재활용품을 이용하여 나만의 무드등을 만들어 봅니다.

 2) LED를 추가 장착하여 더 멋진 무드등을 만들어 봅니다.


3.3. 조도센서


조도센서을 아두이노에 연결하여 센서값을 확인해 보겠습니다.

조도센서는 밝기를 측정할 수 있는 센서인데, 보통 황화카드뮴(Cds)을 이용한 소자를 사용합니다.

빛이 밝으면 저항이 낮아지고, 어두우면 저항이 높아지는 일종의 장동 가변저항 같은 것입니다.

정확한 lux값을 측정하기는 어렵고 밝기의 변화를 측정하는 용도로 사용합니다.


조도센서의 +,- 를 연결하고 S는 Pin A0 에 연결합니다.

아날로그는 pinMode를 설정해 주지 않아도 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define Cds A0
 
void setup() {
  Serial.begin(9600);
 
}
 
void loop() {
  int CdsValue = analogRead(Cds);
 
  Serial.print("Cds = ");
  Serial.println(CdsValue);
  
  delay(300);
}

cs


시리얼 모니터로 밝을 때의 값과 어두울 때의 값을 확인해 봅니다.

이제 이 값을 기준으로 다양한 동작을 해보면 되겠지요^^



 



3.4. 릴레이


릴레이 활용입니다.

위 조도센서값을 이용하여 릴레이에 연결된 식물생장 LED를 ON/OFF 해보겠습니다.


이전 조도센서가 대략 밝을 때 250내외 어두울 때가 900 내외 정도이니 대략 중간값인 550을 기준으로 잡겠습니다.

릴레이를 +,- 연결 후 S를 4번핀에 연결하고, 식물생장 LED의 - 는 보드의 GND, +는 릴레이의 NO, 릴레이의 COM은 보드의 VIN에 연결합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define CdsPin A0
#define relayPin 4
 
void setup() {
  Serial.begin(9600);
  pinMode(relayPin,OUTPUT);
}
 
void loop() {
  int CdsValue = analogRead(CdsPin);
 
  Serial.print("Cds = ");
  Serial.println(CdsValue);
 
  if(CdsValue > 550){
    digitalWrite(relayPin,HIGH);
  }
 
  else if(CdsValue <= 550){
    digitalWrite(relayPin,LOW);
  }
 
  delay(300);
}
cs


조도센서에 손으로 빛을 가리면 식물생장 LED가 켜집니다.

3.5. 온습도 센서


온습도센서의 +,- 를 보드에 연결하고, S를 4번핀에 연결합니다.


온습도센서를 사용하기 위해서는 라이브러리를 설치하여야 합니다.

라이브러리 매니저에서 dht를 검색한 후 라이브러리를 설치합니다.



adafruit unified sensor 도 검색하여 설치합니다.

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "DHT.h"          // 온습도 센서 라이브러리
#define DHTPin 4          // 4번핀에 연결
#define DHTTYPE DHT11     // 온습도 센서타입 
 
DHT dht(DHTPin,DHTTYPE);            // 온습도 센서 함수 선언
 
void setup() {
  Serial.begin(9600);               //시리얼 통신 속도 9600bps으로 설정
  dht.begin();                      //온습도 센서 초기화 및 통신 시작
}
void loop() {
  float tempValue = dht.readTemperature();   // 온도 측정값을 tempValue에 저장
  float humValue = dht.readHumidity();       // 습도 측정값을 humValue에 저장
 
  Serial.print("temp : "); 
  Serial.print((int)tempValue); 
  Serial.print(" °C, ");               
  Serial.print("hum : "); 
  Serial.print((int)humValue); 
  Serial.println(" %");                  //다음 측정값은 줄바꿈하여 시리얼모니터 표시
  delay(300);
}
cs


 

3.6. 16*2 LCD


아두이노에서는 16*2 LCD 모듈을 가장 많이 사용합니다.


역시 모듈을 사용하기 위해서는 라이브러리를 설치합니다.



아래 사진처럼 16개의 문자를 적을 수 있는 2개의 라인이 있습니다.

위 처럼 표시하고자 하면, 아래와 같이 지정하여 주면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <Wire.h>                   // i2C 통신을 위한 라이브러리
#include <LiquidCrystal_I2C.h>      // LCD 1602 I2C용 라이브러리
LiquidCrystal_I2C lcd(0x27162); // 화면이 안나오면 0x27 -> 0x3F 로 변경
 
void setup()
{
  lcd.init();  // LCD 초기화
}
 
void loop()
{
  lcd.backlight();      // 백라이트 켜기
  lcd.setCursor(50);  // (공란의 갯수, 라인번호) 5개 공란 뒤에 쓰기
  lcd.print("HELLO!!");
  lcd.setCursor(01);  // (공란 없음, 1라인)
  lcd.print("Have a nice day!");
}
cs



3.5. 온습도 센서의 것과 같이 사용하면 아래와 같이 되겠지요.

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "DHT.h"          // 온습도 센서 라이브러리
#define DHTPin 4          // 4번핀에 연결
#define DHTTYPE DHT11     // 온습도 센서타입 
#include <Wire.h>                   // i2C 통신을 위한 라이브러리
#include <LiquidCrystal_I2C.h>      // LCD 1602 I2C용 라이브러리
LiquidCrystal_I2C lcd(0x27162); // 화면이 안나오면 0x27 -> 0x3F 로 변경
 
DHT dht(DHTPin,DHTTYPE);            // 온습도 센서 함수 선언
 
 
void setup() {
  Serial.begin(9600);               //시리얼 통신 속도 9600bps으로 설정
  dht.begin();                      //온습도 센서 초기화 및 통신 시작
  lcd.init();                       // LCD 초기화
}
 
void loop() {
  float tempValue = dht.readTemperature();   // 온도 측정값을 tempValue에 저장
  float humValue = dht.readHumidity();       // 습도 측정값을 humValue에 저장
 
  lcd.backlight();      // 백라이트 켜기
  lcd.setCursor(10);  // (공란의 갯수, 라인번호) 1개 공란 뒤에 쓰기
  lcd.print("Temp : ");
  lcd.print((int)tempValue);
  lcd.print("C");
  lcd.setCursor(11);  // (공란 1개, 1라인)
  lcd.print("Humi : ");
  lcd.print((int)humValue);
  lcd.print("%");
  
  Serial.print("temp : "); 
  Serial.print((int)tempValue); 
  Serial.print(" °C, ");               
  Serial.print("humi : "); 
  Serial.print((int)humValue); 
  Serial.println(" %");                  //다음 측정값은 줄바꿈하여 시리얼모니터 표시
  delay(300);
}
cs



I2C 어드레스를 0x27, 0x3F 둘 다 화면에 표시가 안될 때는 연결 케이블을 먼저 확인한 후 이상이 없으면 LCD 뒷면의 가변저항을 돌려 글자의 밝기를 조절해보면 됩니다.


참고로 'PCF8574AT'는 0x3F, 'PCF8574T'는 0x27입니다. (A0~A2에 아무 연결이 없을 때)


3.7. 토양수분센서


토양 수분 센서를 A0 핀에 연결하고 간단히 입력값을 시리얼 모니터에 표시하여 봅니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "DHT.h"          // 온습도 센서 라이브러리
#define DHTPin 4          // 4번핀에 연결
#define DHTTYPE DHT11     // 온습도 센서타입 
#include <Wire.h>                   // i2C 통신을 위한 라이브러리
#include <LiquidCrystal_I2C.h>      // LCD 1602 I2C용 라이브러리
LiquidCrystal_I2C lcd(0x27162); // 화면이 안나오면 0x27 -> 0x3F 로 변경
#define SoilPin A0         // 토양수분센서 A0번 핀에 연결 
 
DHT dht(DHTPin,DHTTYPE);            // 온습도 센서 함수 선언
 
 
void setup() {
  Serial.begin(9600);               //시리얼 통신 속도 9600bps으로 설정
  dht.begin();                      //온습도 센서 초기화 및 통신 시작
  lcd.init();                       // LCD 초기화
}
 
void loop() {
  float tempValue = dht.readTemperature();   // 온도 측정값을 tempValue에 저장
  float humValue = dht.readHumidity();       // 습도 측정값을 humValue에 저장
  int SoilValue = analogRead(SoilPin);       // 토양수분 측정값을 SoilValue에 저장
  int SoilValue_per = map(SoilValue, 1804501000);  
  /* 센서 값을 퍼센트로 변경, 0~1023의 값이나, 물티슈로 센서를 감싼 상태로 최소값과 그냥 대기중의 최대값을 확인 후 기재 
  map(SoilValue, 최소값_물티슈, 최대값_대기, 100, 0) */
 
// LCD에 온도, 습도, 토양수분 표시하기
 
  lcd.backlight();      // 백라이트 켜기
  lcd.setCursor(00);  // (X축 넘길 갯수, 라인번호) 첫 번째 칸, 첫 번째 줄에 표시
  lcd.print("T : ");
  lcd.print((int)tempValue);
  lcd.print("C");
  lcd.setCursor(80);  // (1칸 띄고, 첫번째 라인)
  lcd.print("H : ");
  lcd.print((int)humValue);
  lcd.print("%");
  lcd.setCursor(21);  // (2칸 띄고, 2번째 라인)
  lcd.print("Soil_M : ");
  lcd.print(SoilValue_per);
  lcd.setCursor(131);  // (13칸 띄고, 2번째 라인)
  lcd.print("%");
 
// 시리얼 모니터에 온도, 습도, 조도, 토양수분 아날로그 입력값, 토양수분 %로 변경값 표시하기
 
  Serial.print("temp : "); 
  Serial.print((int)tempValue); 
  Serial.print(" °C, ");               
  Serial.print("humi : "); 
  Serial.print((int)humValue); 
  Serial.print(" % ");   
  Serial.print("Soil : ");
  Serial.print(SoilValue);
  Serial.print("   ");
  Serial.print("Soil_M : "); 
  Serial.print((int)SoilValue_per); 
  Serial.println(" % ");                //다음 측정값은 줄바꿈하여 시리얼모니터 표시
  delay(300);
}
cs


토양 수분 센서는 0~1023의 값으로 표시되는데 수분량이 적을 수록 큰 값을 나타냅니다.


최대값(대기 중)과 최소값(물 속)을 알아봅니다.

최소값은 물이 없는 경우 물티슈 등을 이용하여도 됩니다.

전 측정해 보니, 아무것도 없는 상태에는 440 정도, 물속에서는 190 정도가 나왔습니다.



이를 map 함수를 이용하여 0~100의 값. 즉, % 로 변경해 줍니다. 앞 뒤로 여유있게 10 정도를 더해서 수분이 100% 일때를 180, 건조할 때를 450으로 잡았습니다.

 int SoilValue_per = map(SoilValue, 180, 450, 100, 0); 

이렇게 하니 토양 수분 센서가 그냥 허공에 있을 때 4% 정도가 나오네요.
다른 센서도 해보니 그것은 최소값 308, 최대값 642 가 나왔습니다. 이렇게 각각의 센서마다, 그리고 사용하는 전원과 부하에 따라 값이 다를 수 있으니, 각각 테스트하여 알아보기 편하게 % 로 변경합니다. 

4. 프로젝트

TOP