티스토리 뷰
아두이노 프로젝트 "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가 길기 때문에 값을 바로바로 읽어들이지 못하고 여러번의 입력을 시도해야만 읽어들인다는 단점이 있었다.