티스토리 뷰

아두이노 프로젝트 "Smart Classroom"


1) 제작 목적.

- 수업방해 방지

- 시험기간 내, 빈강의실을 찾아 다니는 학생들에게 편의성 제공

- 강의실 관리 용이

 



2) 기능

- 전력낭비 방지.

- 일정 온도 이상에서 선풍기 가동.

- 일정 온도 이상에서 화재 발생 알림.

- 교실 학생 수, 카운트

- 교수님의 재실 여부 확인




3) 사용 부품

- Orange Board 2개

- Bread Board

- Jumping Cable

- LED, Red diode

- Resistor

- LCD

- Button

- DC motor

- Bluetooth

- 온습도 센서

- 인체감지 센서

- 피에조 부조




4) 구조


<1층 바닥 구조>

 




<교실 내부 구조>





<천장 구조>





5) 오렌지 보드 코드


OrangeBoard1 (학생수 감지 및 LCD 및 블루투스 제어)

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

#include <SoftwareSerial.h>


SoftwareSerial BTSerial(4, 5); 

boolean BT=0; //블루투스 입력 저장 변수.


String A = "Prof is in class"; //교수님이 계실 때, LCD에 띄울 문자열.

String B = "Welcome "; //교수님이 안 계실 때, LCD에 띄울 문자열.


void setup() {

// put your setup code here, to run once:

Serial.begin(9600);


//빨간색 LED를 제어하는 핀.

BTSerial.begin(9600); //Serial모니터 setup

pinMode(2, OUTPUT);


// 3~12핀은 스위치 입력을 받는 핀.


pinMode(3, INPUT_PULLUP); 

pinMode(4, INPUT_PULLUP);

pinMode(5, INPUT_PULLUP);

pinMode(6, INPUT_PULLUP);

pinMode(7, INPUT_PULLUP);

pinMode(8, INPUT_PULLUP);

pinMode(9, INPUT_PULLUP);

pinMode(10, INPUT_PULLUP);

pinMode(11, INPUT_PULLUP);

pinMode(12, INPUT_PULLUP);


//LCD setup

lcd.init();

lcd.backlight();

}


//스위치가 몇개 눌렸는지 count하는 함수.

int NumPeople(){


int count=0; //눌린 스위치 개수를 세는 변수.

//스위치가 눌렸으면 count를 증가시킴.


if(digitalRead(3) == LOW){

count++; 

}


if(digitalRead(4) == LOW){

count++; 


if(digitalRead(5) == LOW){

count++; 

}

if(digitalRead(6) == LOW){

count++; 

}

if(digitalRead(7) == LOW){

count++; 

}

BlueTooth();

//스위치 개수가 너무 많아서 BlueTooth 입력을 scan받는 간격(delay)이 너무 김.

//그러므로, 중간에 한번 더 BlueTooth 입력 scan


if(digitalRead(8) == LOW){

count++; 

if(digitalRead(9) == LOW){

count++; 

}


if(digitalRead(10) == LOW){

count++; 

}

  

if(digitalRead(11) == LOW){

  count++; 

}

if(digitalRead(12) == LOW){

count++; 

}


return count; //눌린 스위치 개수 return

}


//BlueTooth 입력 스캔 및 빨간색 LED 제어

void BlueTooth(){


if (BTSerial.available()){

char data = BTSerial.read(); //BlueTooth 입력을 data 변수에 저장.


//data값이 '1'이면, 빨간색 LED 점등.

if(data == '1'){

Serial.write(data);

digitalWrite(2, HIGH);


lcd.setCursor(0,1); //LCD 커서 (0,1)으로 이동

lcd.print(A); //A문자열(Prof is in class) 출력

BT= 1; //BT를 1로 set

}


//data값이 '2'이면, 빨간색 LED 꺼짐.

else if(data == '2'){

Serial.write(data);

digitalWrite(2, LOW);

lcd.setCursor(0,1); //LCD 커서 (0,1)으로 이동

lcd.print(B); //B문자열(Welcome) 출력

BT= 0; //BT를 0로 set

}

}



void loop() {

//BlueTooth 함수 호출

BlueTooth();


//NumPeople함수를 호출하여, return 값 count를 정수형 변수 num에 저장.

int num = NumPeople();


//LCD에 num값 출력

lcd.setCursor(0,0); //LCD 커서 (0,0)으로 이동

lcd.print("Student: ");

lcd.print(num); //학생수 출력

lcd.print("/10");


delay(1000);

lcd.clear();


//lcd가 clear되면서, LCD 두번째 줄이 계속 초기화 되므로 boolean 타입의 변수 BT에 블루투스 연결 값을 계속 저장해두고, 저장 값을 불러와 LCD에 재출력.


if(BT==1){

lcd.setCursor(0,1);

lcd.print(A);

}

else if(BT==0)

{

lcd.setCursor(0,1);

lcd.print(B);

}

}




OrangeBoard2 (온습도 센서 센싱 및 DC모터 및 피에조, 인체감지 조명 제어)

#include "DHT.h"

#define DHTPIN 2

#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE); 


int lightState = 0; //lightState는 LED 상태값을 저장할 변수

unsigned long startTime = millis(); //startTime는 시간 값을 저장하고 있는 변수.


void setup() {

Serial.begin(9600);

Serial.println("온습도센서 test!");

dht.begin(); //온습도센서 setup 

pinMode(8, OUTPUT); //피에조 부저 OUTPUT Pin

pinMode(3, OUTPUT); //DC모터 OUTPUT PIN

pinMode(5, INPUT); //인체 감지 센서 INPUT PIN


//RGB LED PIN

pinMode(9, OUTPUT);

pinMode(10, OUTPUT);

pinMode(11, OUTPUT);

pinMode(12, INPUT_PULLUP); //LED 제어 SWITH PIN

}


void TemperatureControl(){

float h = dht.readHumidity(); //h는 습도를 저장할 변수

float t = dht.readTemperature(); //t는 온도를 저장할 변수


//t가 35도 이상일 때, 불이 났음을 감지.

//피에조 부저 울림.


if (t>=35){

tone(8, 261, 250);

delay(500);

}


//t가 35도 이상이 아닐 경우, 피에조 부저 꺼짐.

else{

noTone(8);

}


//t가 35도 이상이 아닐 경우, 피에조 부저 꺼짐.

else{

noTone(8);

}


//t가 28도~34도 일 때, 선풍기 돌아감.

if (t<35 && t>=28) {

analogWrite(3, 255);

delay(1000); 

}


//t가 28~34도가 아닌 경우, 선풍기 꺼짐. 

else{

analogWrite(3, 0);

}

/온습도센서값을 불러올 수 없는 경우, Serial monitor에 출력. 


if (isnan(h) || isnan(t) ) {

Serial.println("Failed to read from DHT sensor!");


//습도 출력

Serial.print("Humidity: ");

Serial.print(h);

Serial.print(" %\t");

//온도 출력

Serial.print("Temperature: ");

Serial.print(t);

Serial.println(" *C ");

delay (1000);

}


void PeopleDetection(){


// 인체 감지 0이면 시간 재기 시작

// 중간에 인체 감지 1이면 시간 0부터 다시잼


//인체 감지 센서의 센싱 값 a에 저장

int a = digitalRead(5);


//인체 감지 센서에 Detection되지 않은 채로 10초 이상 지났을 경우, LED 꺼짐. 

if((millis()-startTime)/1000 > 10){

analogWrite(9,0);

analogWrite(10,0);

analogWrite(11,0);

}


//인체감지센서로 Detection된 경우, startTime 현재시간으로 초기화.

if(a==HIGH){

startTime = millis();

}

}



void loop() {

//온습도 함수 호출

TemperatureControl();

//인체 감지 함수 호출

PeopleDetection();

//스위치를 누르고, lightState가 0일 경우, LED가 켜지고, lightState값(LED의 상태 유지를 위한 상태 유지 변수)을 1로 초기화.

if(digitalRead(12) == LOW){

if(lightState ==0){

lightState = 1;


digitalWrite(9, HIGH);

digitalWrite(10, HIGH);

digitalWrite(11, HIGH);

delay (1000);


//한번 더 누르면, lightState 0으로 초기화되고 LED가 꺼짐.

else{

lightState = 0;

digitalWrite(9, LOW);

digitalWrite(10, LOW);

digitalWrite(11, LOW);

delay (1000);

}

}

    }

}




6) 아쉬웠던 점

- 코드가 길기때문에, delay가 길다. 특히, LED와 블루투스를 제어할 떄, delay가 길기 때문에 값을 바로바로 읽어들이지 못하고 여러번의 입력을 시도해야만 읽어들인다는 단점이 있었다.

공지사항
최근에 올라온 글