관리 메뉴

Back Ground

아두이노 - 이더넷쉴드 본문

아두이노

아두이노 - 이더넷쉴드

사용자 Back 2016. 6. 21. 14:54




1.이더넷 쉴드를 사용하여, 웹서버 만들기


▪ 이더넷

유선 인터넷 연결

https://www.temboo.com/arduino

사이트를 참조하여, 아두이노와 이더넷의 연결을 쉽게 하자!










2-1.웹 클라이언트를 켜서, 시리얼모니터에 구글사이트로 접근을 해보자.








2-2.웹 서버를 켜서,자신의 아이피를 확인하고, IP수정후 웹서버에 접근을 해보자!





브라우저로 접근을 하면, 아날로그 값 5개를 볼 수 있다.

스케치

예제 코드 수정을 해보자! (녹색부분을 넣을 것)


1. 63번 라인부터 80번 라인까지 주석처리를 한다.


2. 아래 구문을 입력하여 보자!



if (c == ' \n' && currentLineIsBlank) {

client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println("Connection: close");

client.println();

client.println("<!DOCTYPE html>");

client.println("<html>");

client.println("<head>");

client.println("<meta = charset= \"utf-8 \">");

client.println("<title>아두이노 배우기</title>");

client.println("</head>");

client.println("<body><center>");

client.println("<h1>아두이노 배우기 - 사물인터넷 장치 만들기</h1><br>");

client.println("<font size = 5 color = red > 첫번째 만든 아두이노 웹 서버 </font>");

client.println("</center></body>");

client.println("</html>");

break;

}



결과를 확인하여 보자!!

2-3.아두이노에서 버튼을 누르면 인터넷에 결과가 나오는 예제





스케치


웹서버의 예제에서 56번 라인부터 91번 라인까지 주석처리한다.(소스수정)

if (client.available()) {

char c = client.read();

if (c == '\n' && currentLineIsBlank) {

client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println();

if ( digitalRead(2) ) {

client.println("<html><body> Pressed!</body></html>");

} else {

client.println("<html><body>Not Pressed!</body></html>");

}

break;

}

if (c == '\n') {

currentLineIsBlank = true;

} else if (c != '\r') {

currentLineIsBlank = false;

}

}






이더넷 예제파일을 참조할 것

기타 참고자료는 네이버 카페 아두이노스토리를 활용할것!

http://cafe.naver.com/arduinostory/3415





----- 이더넷 쉴드  서버로 만드는 법 -----


ping 으로 없는 주소를 찾아서 확인해본다



예제







PC인터넷 local로 들어가보면




이더넷 쉴드 시리얼 모니터를보면 서버로 설정 된 걸 알수있다.
















- 이더넷 쉴드 예제 모음 -

다운로드


이더넷예제파일.zip




서버 예제 중 

아두이노 아이피로 출력하기









결과










소스





#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x67, 0xCB };
EthernetServer server(80); 
void setup() {
    Serial.begin(9600);
    Ethernet.begin(mac); 
    Serial.print("This IP address : ");
    IPAddress ip = Ethernet.localIP();
    Serial.println(ip);
    server.begin();                 
}
void loop() {
    EthernetClient client = server.available(); 
    if (client) { 
        boolean currentLineIsBlank = true;
        while (client.connected()) { // while - start
            if (client.available()) {   //if - begin
                char c = client.read();
                if (c == '\n' && currentLineIsBlank) {
                    makeHTMLPage(client);
                    break;
                }
                if (c == '\n') { currentLineIsBlank = true;  }
                else if (c != '\r') {  currentLineIsBlank = false;   }
            } // if - end
        } // while - end
        delay(1);     
        client.stop();
    }
}

void makeHTMLPage(EthernetClient client)
{
   client.println("HTTP/1.1 200 OK");
   client.println("Content-Type: text/html");
   client.println("Connection: close");
   client.println();
   client.println("<!DOCTYPE html>");
   client.println("<html>");
   client.println("<head>");
   client.println("<meta = charset=\"utf-8\">");
   client.println("<title>아두이노 배우기</title>");
   client.println("</head>");
   client.println("<body><center>");
   client.println("<h1>아두이노 배우기 - 사물인터넷 장치 만들기</h1><br>");
   client.println("<font size = 5 color = red > 첫번째 만든 아두이노 웹 서버 </font>");
   client.println("</center></body>");
   client.println("</html>");
   client.println("HTTP/1.1 200 OK");
   client.println("Content-Type: text/html");
   client.println("Connection: close");
   client.println();
   client.println("<!DOCTYPE html>");
   client.println("<html>");
   client.println("<head>");
   client.println("<meta = charset=\"utf-8\">");
   client.println("<title>아두이노 배우기</title>");
   client.println("</head>");
   client.println("<body><center>");
   client.println("<h1>아두이노 배우기 - 사물인터넷 장치 만들기</h1><br>");
   client.println("<font size = 5 color = red > 첫번째 만든 아두이노 웹서버입니다. 홍길동닷컴  </font>");
   client.println("</center></body>");
   client.println("</html>");

}




----- 예제 PDF 다운로드 -------

아두이노 기반 사물인터넷 장치 만들기(네이버카페아두이노스토리).pdf





------------------------------------------------------------------------------------------------------------




Switch 체크시 

웹 브라우져의 OFF/ON이 바꾸는 -예제-


- EX3-1_Arduino_Web_Server_with_switch.ino -


주의

아두이노엔 Pin이3 이라면 그 위에 겹치는 쉴드는 D2 다

이런식으로 마춰서 꼽으면 된다.




소스


#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x67, 0xCB };
EthernetServer server(80); 

void setup()
{
    Serial.begin(9600);
    Ethernet.begin(mac);
    Serial.print("This IP address : ");
    Serial.println( Ethernet.localIP() );
    server.begin();      
    pinMode(2, INPUT); 
}

void loop()
{
    EthernetClient client = server.available(); 
    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {  
                char c = client.read();
                if (c == '\n' && currentLineIsBlank) {
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connnection: close");
                    client.println();
                    client.println("<!DOCTYPE html>");
                    client.println("<html>");
                    client.println("<head>");
                    client.println("<title>Arduino Read Switch State</title>");
                    client.println("<meta http-equiv=\"refresh\" content=\"1\">");
                    client.println("</head>");
                    client.println("<body>");
                    client.println("<h1>Switch</h1>");
                    client.println("<p>State of switch is:</p>");
                    GetSwitchState(client);
                    client.println("</body>");
                    client.println("</html>");
                    break;
                }
                if (c == '\n') { currentLineIsBlank = true;  }
                else if (c != '\r') { currentLineIsBlank = false;  }
            }
        }
        delay(1);     
        client.stop();
    }
}

void GetSwitchState(EthernetClient cl)
{
    if (digitalRead(2)) {
        cl.println("<p>ON</p>");
    }
    else {
        cl.println("<p>OFF</p>");
    }
}



웹 브라우져에 이런식으로 뜨게 된다.








버튼을 연결해서 누르고 있을때





버튼을 눌렀을 시

이렇게 ON 으로 바뀐다







-------------------------------------------------------------------------------------------







IP 주소에 따른 신호 주기 -예제-



IP 주소 에     /$1 이 있을 경우 LED에 불이 들어 오고

 /$2에 LED불이 꺼진다 






불이 들어오고 나오고를 알수 있다

(이 예제가 좀 이상한지 $1도 불이 오고 $2도 불이 들어온다.)





9번 Pin에 연결




시리얼 모니터 (IP 주소 확인)






소스



#include <SPI.h>
#include <Ethernet.h>
boolean Ready = false;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x24, 0x5E };
EthernetServer server(80);
String HTTP_req;

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac);
  Serial.print("My IP address: "); 
  Serial.println( Ethernet.localIP() );
  server.begin();
  pinMode(9, OUTPUT);
}
void loop()
{
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        HTTP_req += c;
        Serial.print(c);
        if (c == '\n' && currentLineIsBlank) {
            if ( HTTP_req.indexOf("$1") > -1 ) {
              digitalWrite(9, HIGH);
            }
            if ( HTTP_req.indexOf("$2") > -1 ) {
              digitalWrite(9, LOW);
            }
            break;
        }

        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}





---------------------------------------------------------------



 웹 브라우져로 LED 불 켜기 끄기  - 예제 -












소스



#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x67, 0xCD };
EthernetServer server(80); 

String HTTP_req;         
boolean LED9_status = 0;  
boolean LED8_status = 0; 

#define LED9_PIN  9
#define LED8_PIN  8

void setup() {
    Serial.begin(9600);
    Ethernet.begin(mac); 
    Serial.print("This IP address : ");
    IPAddress ip = Ethernet.localIP();
    Serial.println(ip);

    server.begin();             
    pinMode(LED9_PIN, OUTPUT);   
    pinMode(LED8_PIN, OUTPUT);   
}

void loop()
{
    EthernetClient client = server.available(); 
    if (client) { 
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {  
                char c = client.read();
                HTTP_req += c; 
                if (c == '\n' && currentLineIsBlank) {
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close");
                    client.println();
                    client.println("<!DOCTYPE html>");
                   
                    client.println("<meta charset=\"utf-8\"/>");
                    //<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />");
                    client.println("<html>");
                    client.println("<head>");
                    client.println("<title>Arduino LED Control</title>");
                    client.println("</head>");
                    client.println("<body>");
                    client.println("<h1><center> 네이버 카페,\"아두이노 배우기\"<br>");
                    client.println("사물인터넷 장치 만들기 - LED 제어</center><br>");
                    client.println("<p>Click to switch LEDs on and off.</p>");
                    client.println("<form method=\"get\">");
                    ProcessCheckbox(client);
                    client.println("</form></h1>");
                    client.println("</body>");
                    client.println("</html>");
                    Serial.print(HTTP_req);
                    HTTP_req = "";   
                    break;
                }
                if (c == '\n') {        currentLineIsBlank = true;      }
                else if (c != '\r') {   currentLineIsBlank = false;     }
            }
        }
        delay(1);   
        client.stop();
    }
}

// switch LED and send back HTML for LED checkbox
void ProcessCheckbox(EthernetClient cl)
{
/*
   Serial.print("HTTP_req.indexOf(\"LED9=1\") -> "); Serial.println( HTTP_req.indexOf("LED9=1") );
   Serial.print("HTTP_req.indexOf(\"LED8=1\") -> "); Serial.println( HTTP_req.indexOf("LED8=1") );
   Serial.print("HTTP_req.indexOf(\"LED9=0\") -> "); Serial.println( HTTP_req.indexOf("LED9=0") );
   Serial.print("HTTP_req.indexOf(\"LED8=0\") -> "); Serial.println( HTTP_req.indexOf("LED8=0") );
*/
    if (HTTP_req.indexOf("LED9=1") > -1 ) {
      LED9_status = ( HTTP_req.indexOf("LED9=1") < 20  ) ? 1 : 0;
    }

    if (HTTP_req.indexOf("LED8=1") > -1 ) {
      LED8_status = ( HTTP_req.indexOf("LED8=1") < 20  ) ? 1 : 0;
    }
   
    if (LED9_status) {    // switch LED on
        digitalWrite(LED9_PIN, HIGH);
        cl.println("<input type=\"checkbox\" name=\"LED9\" value=\"1\" onclick=\"submit();\" checked>LED9<br>");
    } else {             
        digitalWrite(LED9_PIN, LOW);
        cl.println("<input type=\"checkbox\" name=\"LED9\" value=\"1\" onclick=\"submit();\">LED9<br>");
    }

    if (LED8_status) {    // switch LED on
        digitalWrite(LED8_PIN, HIGH);
        cl.println("<input type=\"checkbox\" name=\"LED8\" value=\"1\" onclick=\"submit();\" checked>LED8<br>");

    } else {              // switch LED off
        digitalWrite(LED8_PIN, LOW);
        cl.println("<input type=\"checkbox\" name=\"LED8\" value=\"1\" onclick=\"submit();\">LED8<br>");
    }
}