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 점등


질문 사항은 댓글로 남겨주세요!



to Top