#1 (진행중)아두이노로 방 온도/조도/습도 확인, 조명 ON/OFF, 문 열기/닫기 웹서버 만들기( Arduino HomeAutomation Webserver- Humidity, Temperature, illuminance measurement / Light ON,OFF/ Door open,close / Automatic maintain temperature)
자동화를 해보고 싶다.
뭐든 스마트폰으로 띡띡 누르면 되는 그런 방, 그런 집. 영화 '아이언맨'의 토니 스타크 같은 그런 삶 !!!
이런 멋진사람 같으니라구~ |
일단 서버를 만들어야 할텐데
서버는 아두이노 web server 예제 소스를 참고하기로 하고..
시작하기전에 아이디어를 정리 해 보자.
1. 인체감지 센서로 사람이 들어오면 알림으로 알려줬으면 좋겠다.
2. 온습도를 측정하여 습도가 특정 수치 이상을 찍으면 제습기를 가동, 온도가 일정 온도 이상(25)을 찍으면 에어컨을 가동하고 일정 온도(24도)에 도달하면 송풍으로 전환하여 10분 가동(필터 말리기)후 전원 OFF
3. 조도에 따라 블라인드를 자동으로 열고 닫았으면 좋겠다.(기숙사라 룸메이트에게 피해가 갈 수 있으므로 여기서 구현은 불가능하다)
4. 기숙사 방 내자리 스탠드 전원을 침대에 누워서 끌 수 있었으면 좋겠다.
5. 기숙사 입구 출입문이 사원증 태그를 하지 않고도 가능했으면 좋겠다.(나는 기숙사 상담매니저이므로 출입기록이 데이터로 남아야되는 거주사원과 구분된다)
사람이 들어오면 알림으로 알려주는 1번을 진행하기에는 내가 아직블루투스를 통한 알림 전달 방식을 체득하지 못했으므로.. 일단 웹페이지에 표시만 되도록 하고 나중에 연구해서 기능추가를 하도록 해야지!
2번에서 제습기는 리모컨이 없다. 그렇다면 제습기를 뜯어서 버튼부 릴레이를 부착시켜야 할텐데..여기에 photo coupler를 사용해도 될까? 어떻게 하든 무선으로 정보를 전달해야하므로.. 블루투스 모듈이 2개 필요하다. 지금 아직 블투모듈이 몇개 없으므로 일단 값을 표시하는 것으로만 만들어 놓기로 하자.
우선은 4번과 5번을 중점적으로 하면 되겠군.
iptime 공유기에 아두이노 웹서버를 만들어서 유선연결하고 어디서든 내 방 정보와 출입문 제어를 할 수 있게 하기 위해서 사용중인 iptime 공유기에서 아두이노 웹서버 아이피를 포트포워딩 해줬다.
보안문제가 있긴한데.. 일단 나만아는거니까.. 나중에 보안을 신경써보도록 하자.
준비물
1. 아두이노 MEGA 호환품(우노로 했으나 여러 기능의 복합체이다보니 메모리 부족현상이 있음. f로 플래시메모리? 안에 코드를 저장하는 것으로 대체 해 보았으나 웹페이지 로딩 시 간헐적으로 문자열이나 버튼이 누락되는 불안정 현상을 목격하고 MEGA로 교체함)
2. 이더넷 쉴드
3. 5V릴레이 2개 (출입문용 리모컨 제어 1개, 스탠드 전원제어 1개)
4. DHT22(온습도센서)
5. 조도센서 1개
6. PIR 인체감지센서
7. 기타 점퍼 케이블 및 빵판
8. 각종 적외선 리모컨 신호를 수집하기위한 IR Receiver 1개와 수집한 신호를 뿌려줄 emission인가 하는 송신모듈(?) 1개
웹서버 페이지(2초마다 갱신) |
완료된 사진. : 아래 릴레이는 출입문 제어 리모컨용이고 우측 어둠속 릴레이가 스탠드 전원제어용. 왼쪽 하단 흰색 블럭같은게 DHT22 온습도 센서, 그 위에 흰색 반구형태의 뭐시기가 PIR 인체감지센서 그 옆 어딘가에 콩알만한 크기로 조도센서가 저항과함께 박혀있다. 비전공자이다보니 회로도를 그릴 줄 모른다..ㅠㅠ 나중에 공부해서 올려볼 예정~! |
소스코드
#include <SGN_Arduino_Ethernet.h>
//스근하이 추가한 첫 버전 05.22 10:30
//이게 성공버전임 + 온습도 센서 바꾼 성공버전
#include <DHT.h>
#include <SPI.h>
#include <Ethernet.h>
#define relay 4 //스탠드 릴레이에 신호를 보낼 핀설정
#define door 2 //출입문 릴레이에 신호 보낼 핀임
#define DHTPIN 6 //온습도 센서 디지털 6번핀
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define BRsensor A0
DHT dht(DHTPIN, DHTTYPE); //온습도센서 타입설정
//스근하이(sgnhi.org) 서버로 보내기 준비
char ID[]="스근하이 아이디라 비밀";
char DEVICE_CODE[]="스큰하이 코드라 비밀";
dotori Tsensor("비밀");
dotori Hsensor("비밀");
dotori PIRsensor("비밀");
dotori Lsensor("비밀");
//스근하이 준비 완료
int inputPir = 3;
int pirState = LOW;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED } ; //mac address
IPAddress ip(아이피 주소라 비밀) ;
EthernetServer server(9090) ;
int val;
String readString;
int value = 0; //릴레이 문열림 제어용 값
int Door_status = 0;
int PreDoor_status = 0;
void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(115200);
pinMode (relay, OUTPUT); // relay를 output으로 설정한다.
pinMode(inputPir, INPUT);
pinMode(2, OUTPUT);
dht.begin(); //온습도 센서 가동
//스근하이 장치사용 시작 setup
dev.init(ID,DEVICE_CODE,ip);
}
void loop()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) { // This is all where we start up the server and strings.
char c = client.read();
if (readString.length() < 100) {
readString += c;
}
if (c == '\n') {
Serial.println(readString);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html; charset=UTF-8");
client.println("");
client.println("<hmtl>");
client.println("<head>");
client.println("<meta charset=utf-8>");
client.println("<meta name=viewport content=width=device-width, initial-scale=1>");
client.println("</head>");
client.println("<title>");
client.println("예진이의 룸오토메이션 Page");
client.println("</title>");
client.println("<body bgcolor=black>");
client.println("<font color=white>");
client.println("<meta http-equiv=\"refresh\" content=\"4\">");
client.println("<center>");
client.println("<p>");
client.println("<FORM>");
client.println("</br>");
client.println("</br>");
client.println("</br>");
client.println("<INPUT type=button value=스탠드ON onClick=window.location='/?lighton1'>");
client.println("<INPUT type=button value=스탠드OFF onClick=window.location='/?lightoff1'>");
client.print("<table border=1 width=200>");
client.print("<tr>");
client.print("<td align=center>");
client.print("<font color=white size=3>");
client.print("<b>");
client.print("인체감지 결과");
client.print("</b>");
client.print("</td>");
client.print("</tr>");
client.print("<tr>");
client.print("<td align=center>");
client.print("<font color=white size=3>");
val = digitalRead(inputPir);
if (val == HIGH) {
client.print("<font color=magenta size=3>");
client.print("현재 동작 감지됨");
}
else {
client.print("<font color=white size=3>");
client.print("동작 없음");
}
client.print("</td>");
client.print("</tr>");
client.print("</table>");
client.println("</br>");
client.println("<INPUT type=button value=출입문열기 onClick=window.location='/?HIGH\'>");
client.println("<INPUT type=button value=출입문닫기 onClick=window.location='/?LOW\'>");
client.println("</br>");
client.print("<table border=1 width=200>");
client.print("<tr>");
client.print("<td align=center>");
client.print("<font color=white size=3>");
client.print("<b>");
client.print("출입문 상태");
client.print("</b>");
client.print("</td>");
client.print("</tr>");
client.print("<tr>");
client.print("<td align=center>");
client.print("<font color=white size=3>");
if (Door_status < PreDoor_status) {
client.print("<font color=Lime size=3>");
client.print("Opened");
}
else {
client.print("<font color=Red size=3>");
client.print("Closed");
}
client.print("</td>");
client.print("</tr>");
client.print("</table>");
client.println("<p>");
client.println("<table border=0 width=300>");
client.println("<tr>");
client.println("<td align=center>");
client.println("<font color=white>");
client.println("▼현재 온도(온도 24도로 유지)");
client.println("</td>");
client.println("</tr>");
client.println("<tr>");
client.println("<td align=center>");
client.println("<font color = Bright Orange size=6>");
client.println((t)-1);
client.println(" °C");
client.println("</td>");
client.println("</tr>");
client.println("</table>");
client.println("<p>");
client.println("<table border=0 width=300>");
client.println("<tr>");
client.println("<td align=center>");
client.println("<font color=white>");
client.println("▼현재 습도 (습도 50%이상시 제습기 가동)");
client.println("</td>");
client.println("</tr>");
client.println("<tr>");
client.println("<td align=center>");
client.println("<font color = turquoise size=6>");
client.println(h);
client.println(" %");
client.println("</td>");
client.println("</tr>");
client.println("</table>");
client.println("<p>");
client.println("<table border=0 width=300>");
client.println("<tr>");
client.println("<td align=center>");
client.println("<font color=white>");
client.println("▼현재 조도 상태(태양광=100)");
client.println("</td>");
client.println("</tr>");
client.println("<tr>");
client.println("<td align=center>");
client.println("<font color = lime size=6>");
int brightness = (analogRead(0)/10);
client.println(brightness);
client.println("");
client.println("</td>");
client.println("</tr>");
client.println("</table>");
client.print("</FORM>");
client.print("</center>");
client.print("</font>");
client.print("</body>");
client.print("</html>");
delay(1);
//스근하이 서버로 본격 전송
Hsensor.set(h);
Tsensor.set((t)-1);
PIRsensor.set(val);
Lsensor.set(brightness);
Serial.println(dev.send(Hsensor,Tsensor) == OK?"OK":"NO");
// 전송완료
if (readString.indexOf("?lighton1") > 0)
{
digitalWrite(relay, LOW); // ON
}
else {
if (readString.indexOf("?lightoff1") > 0)
{
digitalWrite (relay, HIGH); // off
}
else {
if (readString.indexOf("?LOW") > 0)
{
digitalWrite(door, LOW);
value = 0;
Door_status = 0; //문상태 0
PreDoor_status = Door_status; // 문상태 0을 이전문상태에 넣음
}
else {
if (readString.indexOf("?HIGH") > 0)
{
digitalWrite(door, HIGH);
delay(250);
value = 1;
Door_status += 1;
if (value == 1) {
digitalWrite(door, LOW);
value = 0;
PreDoor_status = Door_status; //(문상태 +1 한 값을 이전문상태에 넣음)
Door_status = 0;
}
}
}
}
}
readString = "";
client.stop();
}
delay(5);
}
}
}
}
댓글
댓글 쓰기