기본 콘텐츠로 건너뛰기

#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 sensor kit ($50.05) 4. 기타 빵판과

#1 (완료) 아두이노 음주 측정기(Alcohol tester with Arduino)

음주운전을 하지 않는 가장 좋은방법은 대리운전 비용 1만원~1.2만원이 아깝지 않으면서 대리운전 전화번호를 누를 수 있는 정도의 취함 상태인 것 같다. 그래서 생각해본 아이디어가 아예 법적으로 차량에 의무적으로 장치를 설치하도록 하는데 이 장치는 차에 시동을 걸기 전 음주측정을 해야하고 정상 수치내에 있을때만 시동이 걸리는 장치!  물론 조수석에 앉을 누군가가 음주운전을 돕기 위해 대신불어준다면 안되겠지만..ㅠㅠ 아침 출근을 위해 정말 급하게 가글을 하고 나와 출근하려 시동을 걸었는데..가글액에 섞인 알코올 성분때문에 지각을 하는 경우도 생길 수 있겠다만.. 그래도 한번 만들어 보자. 어차피 내게는 차량과 연동할 기술적 지식이 아직 없으므로! 하하하하 06.13 진행 중이나 아직 정리가 안됨 07.01 에 05.28 진행 내용 추가 실제 경찰들 처럼 더더더~ 멘트로 몰입감+정확성(3회 불어서 나온수치의 평균을 활용하는 벙법)을 높일 수 있도록 개선하였다. -_-; Ready 상태. 이후 3,2,1 카운트 후 blow! 그리고 수치를 반복하여 깜빡이며 한다. 이하 소스코드 #include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() {   // set up the LCD's number of columns and rows:   lcd.begin(16, 2); } void loop() { lcd.setCursor(1, 0); //라인1로 커서 위치   lcd.print("Ready...");   delay(4000); lcd.clear();   // set the cursor to column 0, line 1   // (note: line 1 is t

(완료)라즈베리파이와 + Homebridge API로 Siri를 통한 Arduino Web server 제어하기!

 예전에 해외 사이트( https://sourceforge.net/projects/siriproxyrpi/) 에서 siriproxyrpi에 대해서 본 적이 있다. 아이폰 빌트인 Siri로 전자제품을 자유롭게 제어하는 것.. 당연히 해보고 싶었기에 이 때 라즈베리파이를 구매하게 되었으나, 회사홈페이지때문에 바쁘다는 핑계로 묵혀두었던 나의 홈오토메이션 열정에 기름을 붓게 된 분이 계셨으니 바로 클리앙 이라는 IT  커뮤니티의 '채플린'님 이다.  클리앙 팁과 강좌 게시판에서 homebridge 와 NEST API + esp8266 + mutt broker + app 조합으로 홈 오토메이션을 멋드러지게 소화해 내신 '채플린'님(   https://github.com/chaeplin/neptune  ) 의 사례를 보고 리알못(리눅스를 전혀 알지 못함 ㅠ_ㅠ)인 내가 먼지가 내려 앉은 라즈베리파이를 꺼내들고 용기내어 도전하게 되었다.  우선 아두이노 웹서버는 철거 하기 귀찮을 뿐만 아니라.. 라즈베리파이에서 Python 으로 대체하는데에는 다소 시간이 걸릴것으로 생각되기 때문에! 기존 http GET 주소를 그대로 사용한다. (파알못이라 ㅠ_ㅠ)  라즈베리 파이3 모델B에 우선 최신 운영체제인 Jessie를 설치! http://www.raspberrypi.org 위 사이트에 방문해서 상단 Downloads-Raspbian-Raspbian  Jessie-Download  ZIP 파일을 다운받고.. micro SD 카드를 FAT32로 우선 포맷-SDformatter앱(sd카드는 포맷할때 이 앱을 써야한다고 한다-) 으로 포맷을 하고 win32diskimager( https://sourceforge.net/projects/win32diskimager/ ) 를 통해 img파일을 부팅가능하도록 micro SD카드에 굽는다. 나는 맥북에 있는 빌트인 SD카드리더에 항상 Tardisk(Kickstarter에서 구매한 256