기본 콘텐츠로 건너뛰기

#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로 교체함) 아 메가는 TFT LCD 연구용으로 쟁여둔건데 ㅠㅠ
2. 이더넷 쉴드
3. 5V릴레이 2개 (출입문용 리모컨 제어 1개, 스탠드 전원제어 1개)
4. DHT22(온습도센서)
5. 조도센서 1개
6. PIR 인체감지센서
7. 기타 점퍼 케이블 및 빵판
8. 각종 적외선 리모컨 신호를 수집하기위한 IR Receiver 1개와 수집한 신호를 뿌려줄 emission인가 하는 송신모듈(?) 1개


웹서버 페이지(2초마다 갱신)

완료된 사진. 
: 아래 릴레이는 출입문 제어 리모컨용이고 우측 어둠속 릴레이가 스탠드 전원제어용.
왼쪽 하단 흰색 블럭같은게 DHT22 온습도 센서, 그 위에 흰색 반구형태의 뭐시기가 PIR 인체감지센서
그 옆 어딘가에 콩알만한 크기로 조도센서가 저항과함께 박혀있다.

비전공자이다보니 회로도를 그릴 줄 모른다..ㅠㅠ 나중에 공부해서 올려볼 예정~! 
                 #2 가 추가 됨(http://yejinius.blogspot.kr/2016/06/2-onoff-arduino-homeautomation.html?view=magazine)


소스코드 

#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);
  }
    }
  }
}
 


저장저장저장저장

댓글

이 블로그의 인기 게시물

#1 (진행 중)아두이노 뇌파센서 헤드셋 만들기(Arduino EEG brain wave headset for psychological test) 만들어 뇌파 읽기

 15년 겨울쯤엔가 TED에서 흥미로운 동영상을 봤다. 뇌파를 통해 컴퓨터 안의 객체를 조종하는 모습을 시연하는 것이었다. 뇌파로 이런 것들이 가능하다는 것이 놀라웠다. 나는 심리학도가 아닌가. 뇌파가 더 정확한 심리검사를 만들 수 있는 도구가 될 수 있다는 생각이 들었다.  예를들어 검사문항(디지털 검사)이 100개짜리 라면 핵심 문항들(각 10번 단위)을 체크할 때마다 심경의 변화, 뇌파변화를 센서(객관적)도 기록하고 디지털검사(주관적)로도 기록해서 함께 데이터화 한다면 더 정확한 심경을 읽어 낼 수 있지 않을까? 라는 생각이었다. 2011년 대학원 다닐 때 컴공과 학부생들 겨울방학 특강으로 Objective-C를 무려1개월간 청강했고, C언어를 무려 2개월동안 학원에 다니면서 공부한 사람이기에 ! -_-;;;; 할 수 있을 것이다............  우선 뇌파센서를 구매해야겠지.  알리 익스프레스에서 구매한 EEG 뇌파센서 kit.  2개를 구매했다.비싸군 ㅠㅠ 배송이 한달정도 걸렸다. 학창시절 라디오 만들기인가..실과시간에 도전해본 납땜 이후로는 처음 해보는 납땜이어서 고생좀 했다. 뇌파를 측정해서 hex 코드로 컴퓨터로 읽어들일 수 있는 상태다. 읽어들인 hex값들을 10진수로 변환하고 유의미한 그래프로 그리거나 데이터화 하는 것이 필요 해 보이지만 아직 받은 값을 10진수로 변환하는 방법을 모르겠다. ㅠㅠ 소스코드는 그냥 단순히 hex값으로 읽어오는것이다보니.. 별거 없다;; 나중에 10진수로 변환하여 읽어들이고 자료화 하는 단계가 필요한 것 같은데 차근차근 진행 해 봐야겠다. 준비물 :  1. HM-08 블루투스 모듈 ($5.30) 2. 아두이노 나노 호환품 ($1.89) 3. direct nerosky e eg  brain...

1# (17.03.19 실패)파이썬(Python)을 활용해 사내식당 금일 메뉴 텔레그램 메세지로 전달받기

우리 사내식당 밥은 아주 맛있다. 맛이 없어서 그런건 아니고.. 그냥 미리 어떤 음식이 나오는지 알고싶을 뿐이다. 맛없는게 나오면 안먹고 라면을 먹기 위해서 만드는 것은 아니다. Brian Park 님의 블로그에서 초등학생 아들 알림장/급식메뉴를 텔레그램으로 알려주는 라즈베리파이 서버 관련 글을 읽고 처음으로 파이썬(웹프로그래밍 언어)에 도전하게 되었다. 의외로 스크립트언어? 사실 난 전문용어 잘 몰라유 ㅠㅠ 틀린게 있으면 바로잡아주세요 ㅠㅠ 처럼 순서대로 실행하고, C언어처럼 중괄호 개념이 아닌 들여쓰기로 구분..하는 것이 나에게는 심플하고 쉽게 느껴졌다. 물론 이런저런 명령어 외워야하는건 어쩔 수 없..ㅠ_ㅠ  아무튼 나의 특기인 따라하기 신공을 통해 맥에 python 2.7을 설치하고, 적절한 편집기로 eclipse를 골랐다. 나처럼 일자무식자가 단순 연습을 하기 위해서는 eclipse보다 그냥 python 기본 제공 앱(?)인 IDLE을 활용하여 코드 한 줄 한 줄이 어떻게 실행되고 왜 실행이 안되는지 확인 할 수 있어서 더 좋은 것 같다. 어쨋든, 삼성웰스토리에 신규 가입을 해서 아이디와 비밀번호를 알아 둔 뒤.. urllib, urllib2, cookielib 라는 라이브러리를 임포트하여 내가 읽어올 페이지 특정 부분에서 내 아이디와 비밀번호 전송값을 대입하여 처리하는.... 말해놓고 나니 무슨말인지...하아  뭐 그런 방식인 것 같다. urlencode가 핵심 키워드가 아닐까 싶다. 그래서~! 지금 아이디와 비번을 입력하여 접속된 화면이 출력되는 것 까지는 확인이 되었다. 이는, 아래에서  f=opener.open('https://www.samsungwelstory.com/member/login.jsp') for line in f: print line.strip() 부분에서처럼 사이트를 열고, 한줄씩 열거하여 보여달라고 요청하여 나온 값들과 사파리에서 소스보기 값들과...

#1 (완료) Auto touch와 Activator를 활용한 차량용 아이패드 미니1(탈옥) 세팅

 작년 7월 경 차를 하나 샀다. 벌써 1.6만km를 함께 달려왔구나~ 계속 중고차만 타다가 처음으로 장만한 이쁜이 우리 푸푸(골프의 애칭)에겐 아쉽게도 네비게이션이 없다. 2.0 고급형 모델과 일반형 모델이 네비게이션+가죽시트+스마트키 정도의 차이인데도 500만원 정도로 가격차이가 너무커서 사제 네비게이션을 달고 가죽시트를 포기하겠다는 생각으로(실제로 독일에서는 가죽시트보다 알칸타라 직물시트가 더 인기가 많음 - 아마 주행 중 엉덩이 미끄러짐 현상이 있기 때문인 듯.) 골랐는데 막상 네비게이션 장착점에 가니 100만원 ~ 150만원을 부른다. 아니.............. 그돈이면 아이패드 프로를 사요 아저씨. 네비로도 쓰고, 떼어서 영화도 보고 그림도 그릴 수 있다구요.... 그래서 아이패드 프로 12.9도 아닌, 아이패드 프로 9.7도 아닌, 아이패드 에어2도 아닌, 아이패드 에어1도아닌, 아이패드 미니4도 아닌, 아이패드 4도 아닌, 아이패드 미니2도 아닌, 아이패드 3도 아닌, 아이패드2 급의 아이패드 미니1을..... 그 당시 중고가 20만원가량을 주고 구입했다. 8.4.1 버전으로 탈옥이 가능했고, 탈옥 후 Auto touch(루아 스크립트 언어를 사용하는 Cydia앱) + Activator(탈옥기기엔 거의 필수인 Cydia앱) 으로 아래와 같은 아이디어를 실현해보고자 한다. 아니 이미 실현했으나.. 블로그를 만든지가 얼마 안돼 밀려서 쓰고 있다 ㅠ_ㅠ 아이디어 1.  차량에 시동을 걸면 아이패드가 자동으로 블루투스로 연결되고, 셀룰러 데이터, GPS ON 2.  음악앱(벅스 뮤직 플레이어)과 네비게이션 앱을 실행한다. 아래와 같이 코드를 입력했다. 잘 작동한다. 다만 lua명령 만으로는 와이파이나 셀룰러 on/off 제어가 안되기에 Activator 의 기능을 함께 활용 하는 방법을 택했다. 아이패드가 구형모델이다보니 다소 느린편이라 usleep 명령어를 통해 딜레이를 충분히 주었...