코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-09-17 14:35:08
NO | 부품명 | 수량 | 상세설명 |
1 | 아두이노 우노 | 1 | |
2 | 브레드보드 | 1 | |
3 | 온습도 센서 | 1 | DHT11 온습도센서 모듈을 사용했습니다. |
4 | LCD | 1 | LCD-00709을 사용했습니다. 다른 LCD를 사용하실 경우 연결방법이 다를 수 있습니다. |
5 | Potentiometer | 1 | |
6 | 콘센트 | 1 | 직접 가습기에 릴레이를 연결할 경우 필요하지 않습니다. |
7 | 점퍼 케이블 | 20 | |
8 | 5V 릴레이 모듈 | 1 | |
9 | 가습기 | 1 |
부품명 | 아두이노 우노 | 브레드보드 | 온습도센서 | LCD | Potentiometer |
사진 | x1 | x1 | x1 | x1 | x1 |
부품명 | 콘센트 | 점퍼 케이블 | 5V 릴레이 모듈 | 가습기 |
사진 | x1 | x20 | X1 | x1 |
/* 본 스케치는 여러 커뮤니티를 참고하여
kocoafab에서 작성하였습니다.
누구나 무료로 사용하실 수 있습니다.*/
#include <LiquidCrystal.h>
#include <DHT11.h>
#define relay 9 //relay와 연결된 9번 핀 #define dht11Pin 6 //dht11과 연결된 6번 핀 LiquidCrystal lcd(12,11,5,4,3,2); //RS 핀, E핀, 데이터 핀 4개 String lcdString = ""; DHT11 dht11(dht11Pin); //dht11 라이브러리 사용을 위한 객체 선언
void setup() { pinMode(relay, OUTPUT); lcd.begin(16,2); //LCD 크기 지정, 2줄 16칸 lcd.clear(); //화면 지우기
Serial.begin(9600);
} void loop() { int err; //에러구분 변수 float humi; //습도 저장 변수 float tem; //온도 저장 변수, 필요한 분은 사용하세요.
if((err=dht11.read(humi, tem))==0) //습도값을 에러없이 읽어 왔다면 { onOff(humi); //가습기 on/off 함수 호출 lcdHumidity(humi); //현재 습도 lcd 출력 함수 호출 } else {
//읽어오는 도중 문제가 발생할 경우 에러번호와 에러 시리얼 모니터에 출력 Serial.println(); Serial.print("Error No :"); Serial.print(err); Serial.println(); } delay(DHT11_RETRY_DELAY); //다시 읽어올때 까지 멈춤 }
//가습기 on/off 함수 호출
void onOff(float h) {
if (h < 50 ) { //습도가 50%보다 작으면
digitalWrite(relay, HIGH); //가습기 ON
}else {
digitalWrite(relay,LOW);
}
}
//현재 습도 LCD 출력 함수
void lcdHumidity(float hu) {
lcd.setCursor(0,0); //커서 0,0에 배치
lcd.print("current humidity"); //""안에 글자 출력
lcd.setCursor(1,3); //커서 위치 1,3으로 변경 후
char buffer[10]; //float를 string으로 변환하기 위한 임시 char 배열 선언
dtostrf(hu, 4, 1, buffer); //float -> char로 변환
String humidity = " : "; //두번째 줄에 출력할 구문 만들기 ( : 습도 %)
humidity += (String)buffer; //char -> string
humidity += "%";
Serial.print(humidity);
lcd.print(humidity); //현재 습도 출력
}
#include <LiquidCrystal.h>두 개의 라이브러리가 필요합니다.
#include <DHT11.h>
if((err=dht11.read(humi))==0) //습도값을 에러없이 읽어 왔다면 { onOff(humi); //가습기 on/off 함수 호출 lcdHumidity(humi); //현재 습도 lcd 출력 함수 호출 }
DHT11라이브러리에 있는 read함수는 습도, 온도 값을 읽어서 변수에 저장해줍니다.
동시에 에러번호를 반환합니다.
반환된 값이 0이면 정상 동작을 의미합니다.
즉, 위 코드는 습도를 정상적으로 측정하였다면(반환 값이 0이면) 아래 두 함수를 호출하라는 뜻입니다.
void onOff(float h) {
if (h < 50 ) { //습도가 50%보다 작으면
digitalWrite(relay, HIGH); //가습기 ON
}else {
digitalWrite(relay,LOW);
}
}
습도가 50보다 작으면 릴레이의 HIGH 값을 전달하므로써 콘센트에 전류가 흐르게 합니다.
50 자리에 원하는 습도 정도에 따라 숫자를 넣어보세요.
//현재 습도 LCD 출력 함수
void lcdHumidity(float hu) {
lcd.setCursor(0,0); //커서 0,0에 배치
lcd.print("current humidity"); //""안에 글자 출력
lcd.setCursor(1,3); //커서 위치 1,3으로 변경 후
char buffer[10]; //float를 string으로 변환하기 위한 임시 char 배열 선언
dtostrf(hu, 4, 1, buffer); //float -> char로 변환
String humidity = " : "; //두번째 줄에 출력할 구문 만들기 ( : 습도 %)
humidity += (String)buffer; //char -> string
humidity += "%";
Serial.print(humidity);
lcd.print(humidity); //현재 습도 출력
}
스케치를 작성하시다 보면 변수의 타입을 변경해야 하는 경우가 많이 발생합니다.
lcd.print함수는 float을 출력할 수 없습니다.
하지만 습도는 float타입입니다.
이럴 경우 float을 dtostrf함수를 통해 char로 변경하고
변경된 char를 string으로 변경합니다.
dtostrf함수 () 안에는 변경할 float타입의 값, 최소한의 길이, 정확도, 변경된 값을 저장할 char 배열 변수가 들어갑니다.
정확도는 소수점 자리를 의미합니다. 1은 소수점 첫번째 자리까지만 변환된다는 의미입니다.
lcd에 출력할 문구를 변경하거나 다른 lcd를 사용해보세요.
dht11센서는 온도 측정도 가능합니다. 온도도 값도 이용해보세요.
kocoafab