[Arduino] 아두이노 DIY 스마트 책상 만들기!
1. 개요
아두이노와 각종 센서를 통해 책상에 오래 앉아 있는 직장인 또는 학생의 편의와 건강을 위한 스마트 책상 만들기 프로젝트입니다.
2. 회로도
회로도가 조금 복잡합니다... USB 모듈에는 USB 선풍기를 연결했습니다.
3. 사용 부품
아두이노 우노 R3
I2C LCD 모듈
적외선 근접센서
USB 인터페이스 변환 모듈
USB 선풍기
3색 LED * 2
온습도 센서
조도 센서
MF, FF 점퍼 선 * 다수
4. 소스코드
#include <LiquidCrystal_I2C.h>
#include <dht11.h>
#define DHT11PIN 10
LiquidCrystal_I2C lcd(0x27,20,4); // LCD 모듈 구조체 선언
dht11 DHT11; // 온, 습도 모듈 구조체 선언
unsigned long readTime=0; // 착석 시 타이머 작동을 위한 변수
unsigned long readCheckTime=0; // 미착석 여부를 위한 변수
long previousMillis = 0; long interval = 1000;
void setup() {
lcd.init(); // LCD 초기화
lcd.backlight(); // LCD 백라이트 출력
// 출력 핀모드 설정
pinMode(5, OUTPUT); pinMode(7, INPUT); // 13 : USB, 7 : 근접센서
pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT);
// LED = 2: RED, 3: GREEN, 4 : BLUE
pinMode(13, OUTPUT); pinMode(6, OUTPUT); pinMode(9, OUTPUT); // 백색 LED
Serial.begin(9600); // 시리얼 통신 시작(BAUD = 9600)
}
void loop() {
int chk = DHT11.read(DHT11PIN); // DHT11 라이브러리를 통해 온,습도 데이터를 받아옴
unsigned long currentMillis = millis(); // 1/1000초 단위로 시간 입력(별개의 루프 사용위함)
int brightness = analogRead(A0); // 조도 센서 데이터를 아날로그 값으로 입력받음
int checkP = digitalRead(7); // 근접 선서 데이터를 디지털 값으로 입력받음(0 or 1)
// 착석했지만 근접 센서에 체크가 되지 않는경우(잠깐 자리를 고쳐앉는 경우)에 계속 착석 중으로 체크하기 위해
if(checkP)
readCheckTime++; // 근접 센서에 근접한 사물이 없는 경우
else
readCheckTime = 0; // 근접 센서에 근접한 사물이 있는 경우
if(currentMillis - previousMillis > interval) { // interval(1000ms, 1초) 단위로 실행되는 루프(메인 루프와 별개로 작동)
previousMillis = currentMillis; // 이전시간을 현재시간으로 설정해줌으로써 다음 interval 단위에 체크하기 위함
if(readCheckTime<50)
readTime++;
else
readTime = 0; // 착석 시 1초 단위로 타이머 변수에 저장
lcd.clear(); // LCD 화면을 지움(초기화)
}
lcd.setCursor(0,0); // 0,0(첫째줄 왼쪽 첫번째) 자리에 출력하기위해 커서를 set
lcd.print("BG:"); lcd.print(brightness/10); lcd.print("%, "); // 밝기 출력
lcd.print("TMP:"); lcd.print(DHT11.temperature); lcd.print("'C"); // 온도 출력
lcd.setCursor(0,1); // 0,1(둘째줄 왼쪽 첫번째) 자리에 출력하기위해 커서를 set
lcd.print("ST:"); // 착석 여부 확인
if(readCheckTime<50)
lcd.print("O");
else
lcd.print("X");
lcd.print(" LED:"); // 착석 여부와 주변 밝기에 따라 LED 작동 여부 확인
if(readCheckTime<50 && brightness/10 < 40) { // RGB모두 켬(백색)
lcd.print("O");
digitalWrite(13, LOW); digitalWrite(6, LOW); digitalWrite(9, LOW);
}
else { // 애노드 타입이므로 5,6,9번 핀을 GND로 연결(LOW=HIGH, HIGH=LOW)
lcd.print("X");
digitalWrite(13, HIGH); digitalWrite(6, HIGH); digitalWrite(9, HIGH);
}
lcd.print(" FAN:"); // FAN 작동 여부
if(readCheckTime<50 && DHT11.temperature >= 25) {
lcd.print("O"); analogWrite(5, 255);
}
else {
lcd.print("X"); digitalWrite(5, LOW);
}
if(readTime<1800) {
digitalWrite(3, LOW); digitalWrite(2, HIGH); digitalWrite(4, HIGH);
} // 30분이하 : GREEN
else if(readTime<3600) {
digitalWrite(3, HIGH); digitalWrite(2, HIGH); digitalWrite(4, LOW);
} // 30분~1시간 : BLUE
else {
digitalWrite(3, HIGH); digitalWrite(2, LOW); digitalWrite(4, HIGH);
} // 1시간이상 : RED
}
소스코드 주석에 설명이 있기 때문에 작동 순서만 설명드리겠습니다.
1. 책상 또는 의자 부근에 설치한 근접센서에 사람이 확인되면 작동 시작
2. 온도와 조도를 측정하여 선풍기 및 조명(LED) 작동 여부 확인
3. 근접센서에 일정시간 이상 감지 되지않으면 사람이 없다고 간주 각종 센서 전원 OFF
4. 사람이 착석한 이후 일정시간 마다 초록, 파랑, 빨강 LED 점등
질문 사항은 댓글로 남겨주세요!
'Arduino' 카테고리의 다른 글
아두이노 블루투스(HC06) 연동 (0) | 2018.09.04 |
---|---|
[Arduino] 아두이노 ESP8226 OV2640 영상처리 및 패턴인식 프로그래밍 (3) | 2018.08.17 |