관리 메뉴

철호의 종이모형 이야기

아두이노로 웹서버 만들고 웹페이지에서 LED 제어하기 본문

수장고/아두이노

아두이노로 웹서버 만들고 웹페이지에서 LED 제어하기

종이모형 디자이너 김철호 2010.11.28 01:02

아두이노 수업은 이제 다 끝나고, 각 조별로 프로젝트를 수행해야 합니다.
기간은 4주 정도 남았네요.

저희 조는 아두이노와 스마트폰을 활용한 홈 네트워크를 주제로 잡았습니다.
그러기 위해서는 아두이노와 웹을 연결해야겠다는 생각이 들더군요.

찾아보니, 아두이노에서 인터넷을 사용할 수 있게 하는 모듈이 있었습니다.
여러가지가 있는데, 저희 조는 아두이노 두에밀라노브에 쉽게 끼울 수 있는 아두이노 이더넷 쉴드를 사용하기로 했습니다.

plughouse에서 판매하고 있습니다.
http://plughouse.co.kr/shop/goods/Goods_view.php?G_code=102705472330

아두이노 두에밀라노브위에 끼운 모습입니다.
생김새도 비슷합니다.
10, 11, 12, 13번 핀을 이더넷 통신에 사용하기 때문에 아두이노에서 입출력핀으로는 사용하지 못합니다.
4번핀은 SD카드와 관련되어있다던데, 자세히는 모르겠네요. 이더넷 쉴드에 Micro SD카드를 꽂는 슬롯이 있긴 합니다만, 무슨 기능인지를 모르겠습니다.

아두이노와 이더넷 쉴드를 결합하고, LED를 2번핀에 연결했습니다.

LED가 꺼져있는 상태에서는 LED ON 버튼이 나타납니다.
버튼을 누르면 LED가 켜지고, LED status는 ON으로 바뀝니다.

소스는 아래와 같습니다.
4개의 라이브러리를 사용하는데, Led를 제외한 3개의 라이브러리는 기본 라이브러리입니다.

#include "Ethernet.h"
#include "SPI.h"
#include "EEPROM.h"
#include "Led.h"

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x27, 0xC3 };  // MAC address
byte ip[] = { 192,168,0,9 };  // IP address
byte gateway[] = { 192,168,0,1 };  // gateway address
byte subnet[] = { 255, 255, 255, 0 };  // subnet address

Server server(80);  // port
int ledPin = 2;
int value=0;
String readString = String(30);
boolean LEDON = false;

Led l(ledPin,HIGH,LOW);

boolean hnk_led()
{
  boolean result;
  int value;
  value=EEPROM.read(0);
  if(value==1){
    l.Control(0,LED_ON);
    result = true;
  }
  else
  {
    l.Control(0,LED_OFF);
    result = false;
  }
  return result;
}

void setup(){
  Ethernet.begin(mac, ip, gateway, subnet);
  l.initialize();
  LEDON = hnk_led(); 
 
  Serial.begin(9600);
}

void loop(){
  Client client = server.available();
  if (client) {
    while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        if (readString.length() < 30) {
          readString.concat(c);
        }

        Serial.print(c);

        if (c == '\n')
        {
          if(readString.indexOf("L=1")!=-1) {
            EEPROM.write(0,1);
          }
          else if(readString.indexOf("L=0")!=-1) {
            EEPROM.write(0,0);
          }
         
         
          LEDON = hnk_led();

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<html><body style=background-color:white>");
          client.println("<h1>LED control</h1>");
          client.println("<form method=\"GET\" name=\"LED\">");
          client.println("<input type=\"hidden\" name=\"active\" value=\"on\">");
          if (LEDON)
          {
            client.println("<input type=\"hidden\" name=\"L\" value=\"0\">LED<br><input type=\"submit\" value=\"LED OFF\">");
          }
          else
          {
            client.println("<input type=\"hidden\" name=\"L\" value=\"1\">LED<br><input type=\"submit\" value=\"LED ON\">");
          }
         
          client.println("</form>");
          client.println("<br />");
          client.print("<font size=\"5\">LED status: ");

          if (LEDON)
            client.println("<font color=\"black\" size=\"5\">ON ");
          else
            client.println("<font color=\"black\" size=\"5\">OFF ");
          client.println("<hr />");
         
          client.println("</body></html>");
          readString=" ";
          client.stop();
        }
      }
    }
  }
}

전원이 나가더라도 이전 값을 기억할 수 있게 ROM에 내용을 저장합니다.
그리고, 웹페이지를 불러올때 전달값이 없으면 ROM값이나 변수 값들을 웹페이지에 표시하지 못하더군요. 그래서, http://xxx.xxx/?active=on 이런식으로 아무 값이나 전달하는 페이지로 접속을 해야 합니다. 그냥 http://xxx.xxx 로 접속하면 LED가 켜져 있는 상태인데도 웹페이지에는 LED OFF 상태로 뜨더군요.


구동 영상 보시죠!

아래 두 블로그에서 도움 받았습니다.

아두이노-웹페이지 구현
http://jong5.tistory.com/98

공유기 설정
http://blog.oop-s.com/10
저작자 표시
71 Comments
댓글쓰기 폼
Prev 1 ... 61 62 63 64 65 66 67 68 69 ... 531 Next