고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

아두이노 WIFI 실드-(2) wifi 응용

2014-08-12 14:40:57

개요


이 컨텐츠를 보시기 전에 "아두이노 WIFI실드를 사용하여 WIFI 연결하기"를 먼저 보시는 것을 권장합니다.

 

 

지난번에 올렸던 "아두이노 WIFI실드를 사용하여 WIFI 연결하기"에서 아두이노에 WIFI 실드를 올려서 연결하는 것을 해 보았습니다.

이번에는 WIFI 실드에 웹서버를 올려 다른 곳에서 이 웹에 접속 할 수 있도록 합니다. (같은 공유기에 있을 경우에만 접속 됩니다.)

아두이노에서 센서를 연결하여 센서값을 받아서 WIFI실드에서 센서 측정값을 출력하고, 컴퓨터나 스마트폰으로 웹에 접속하여 센서값을 볼 수 있도록 해봅시다.
 

 

 

 

 

미리 보기 동영상

 

 

 

 

부품 목록

 

 

NO 부품명 수량 상세설명
1 아두이노 우노 R3 1 아두이노
2 아두이노 WIFI 실드 1 WIFI 실드
3 flex 센서 1 flex sensor
4 조도센서 1  
5 저항 10KΩ 2 저항이 클 수록
센서값이 작게 나옵니다.
6 브레드보드 1  
7 점퍼케이블 8  

 

 

 

부품명 아두이노 우노 R3 아두이노 WIFI 실드 flex센서
파트 x1 x1 x1

 

 

 

부품명 조도센서 저항 10kΩ 브레드보드 점퍼케이블
파트 x1 x2 x1 x8

하드웨어 Making

회로도


 

 

 

브레드보드 레이아웃


 

 

 

소프트웨어 Coding

#include <SPI.h>
#include <WiFi.h>

char ssid[] = "AndroidHotspot6971";      //  연결하실 와이파이 SSID
char pass[] = "00001111";   // 네트워크 보안키

int status = WL_IDLE_STATUS;

WiFiServer server(80);  // 80포트를 사용하는 웹서버 선언

void setup() {
  Serial.begin(9600); 

  if (WiFi.status() == WL_NO_SHIELD) { // 현재 아두이노에 연결된 실드를 확인
    Serial.println("WiFi shield not present"); 
    while (true);  // 와이파이 실드가 아닐 경우 계속 대기
  } 

  // 와이파이에 연결 시도
  while ( status != WL_CONNECTED) { //연결될 때까지 반복
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);  // WPA/WPA2 연결
  } 

  server.begin();

  printWifiStatus();  // 연결 성공시 연결된 네트워크 정보를 출력
}


void loop() {
  int flexval = analogRead(A5);
  int ldrval = analogRead(A0);
  // flex 센서와 조도센서에서 값을 가져옴

  WiFiClient client = server.available();  // 들어오는 클라이언트를 수신한다.
  if (client) {  // 클라이언트를 수신 시
    Serial.println("new client");  // 클라이언트 접속 확인 메시지 출력
    boolean currentLineIsBlank = true;

    while (client.connected ()) { 
      if (client.available()) {
        char c = client.read();
        // 문자의 끝을 입력 받으면 http 요청이 종료되고, 답신을 보낼 수 있습니다.
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 1"); // 1초당 페이지 refresh
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<meta charset=utf-8/>");
          client.print("<meta name=view content=width=device-width, ");
          client.println("initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no />");
          client.println("<html>");
          client.println("<head>");  
          client.println("<title>Many Sensor</title>");
          client.println("</head>");
          client.println("<h1>Many Sensor</h1>");
          client.println("<div data-role=content>");
          client.print("Flex Sensor value : ");
          client.println(flexval);  // flex 센서 값 출력
          client.println("<br>");
          client.println("<br>");
          client.print("Ldr Sensor value : ");
          client.println(ldrval);  // 조도 센서 값 출력
          client.println("<br>");
          client.println("</div>");
          client.println("</body>");
          client.println("</html>");
          break;
        }
        if (c == '\n') { 
          currentLineIsBlank = true;
        }

        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
    Serial.println("client disonnected");
    // 클라이언트와 연결을 끊는다.
  }
}

void printWifiStatus() {  // 연결된 네트워크 정보 출력
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  // 네트워크 SSID 출력

  IPAddress ip = WiFi.localIP(); 
  Serial.print("IP Address: ");
  Serial.println(ip);
  // 네트워크 ip 출력

  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
  // 수신 강도 출력
}

 

소프트웨어 설명 

 * 본 코드는 스케치를 사용하여 작성 / 업로드 합니다. 스케치에 대한 사용법은 링크를 참고 하시기 바랍니다.

 

 

#include <SPI.h>
#include <WiFi.h>

char ssid[] = "AndroidHotspot6971";      //  연결하실 와이파이 SSID
char pass[] = "00001111";   // 네트워크 보안키

int status = WL_IDLE_STATUS;

WiFiServer server(80);  // 80포트를 사용하는 웹서버 선언

 

ssid[]와 pass[] 에는 각각 네트워크 SSID와 네트워크 보안키를 적어 주시면 됩니다.(자신이 연결 하고자 하는 네트워크)

이부분을 맞게 쓰지 않았을 경우는 접속이 되지 않으며 시리얼 모니터에서 Attempting to connect to WPA SSID : 네트워크  SSID 이 글이 계속 뜨게 됩니다.
(여기서는 WAP 형식만 가능 합니다.)

WiFiServer server(80)을 통해서 80포트를 사용하는 웹서버임을 선언 합니다.
 

void setup() {
  Serial.begin(9600); 

  if (WiFi.status() == WL_NO_SHIELD) { // 현재 아두이노에 연결된 실드를 확인
    Serial.println("WiFi shield not present"); 
    while (true);  // 와이파이 실드가 아닐경우 계속 대기
  } 

  // 와이파이에 연결 시도
  while ( status != WL_CONNECTED) { //연결이 될 때 까지 반복
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);  // WPA/WPA2 연결
  } 

  server.begin();

  printWifiStatus();  // 연결 성공시 연결된 네트워크 정보를 출력
}

현재 연결된 실드를 확인 하고, 와이파이 실드가 장착 되는 경우 위에서 적은 SSID 와 보안키로 와이파이에 연결을 시도합니다.(연결이 될 때 까지 계속 반복 합니다.)

연결에 성공 하면 연결된 네트워크의 정보를 출력 합니다.
 

 

  int flexval = analogRead(A5);
  int ldrval = analogRead(A0);
  // flex 센서와 조도센서에서 값을 가져옴

  WiFiClient client = server.available();  // 들어오는 클라이언트를 수신한다.
  if (client) {  // 클라이언트를 수신 시
    Serial.println("new client");  // 클라이언트 접속 확인 메세지 출력
    boolean currentLineIsBlank = true;

아날로그 5번핀에 꽂혀 있는 flex 센서와 아날로그 0번 핀에 꽂혀있는 조도 센서에서 값을 받아옵니다.

그 다음 클라이언트에서 접속 할 때 까지 대기 합니다. 클라이언트가 접속을 하면 클라이언트가 접속 했음을 알리는 메세지를 출력 합니다.
 

 

    while (client.connected ()) { 
      if (client.available()) {
        char c = client.read();
        // 문자의 끝을 입력 받으면 http 요청이 종료되고, 답신을 보낼 수 있습니다.
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 1"); // 1초당 페이지 refresh
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<meta charset=utf-8/>");
          client.print("<meta name=view content=width=device-width, ");
          client.println("initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no />");
          client.println("<html>");
          client.println("<head>");  
          client.println("<title>Many Sensor</title>");
          client.println("</head>");
          client.println("<h1>Many Sensor</h1>");
          client.println("<div data-role=content>");
          client.print("Flex Sensor value : ");
          client.println(flexval);  // flex 센서 값 출력
          client.println("<br>");
          client.println("<br>");
          client.print("Ldr Sensor value : ");
          client.println(ldrval);  // 조도 센서 값 출력
          client.println("<br>");
          client.println("</div>");
          client.println("</body>");
          client.println("</html>");
          break;
        }


 

<!DOCTYPE HTML>
<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 />
<html>
<head>
<title>Many Sensor</title>
</head>
<h1>Many Sensor</h1>
<div data-role=content>
	Flex Sensor value : "Flex Sensor value"
	<br>
	<br>
	Ldr Sensor value : "Ldr Sensor value"
	<br>
</div>
</body>
</html>

클라이언트에게 웹 페이지를 보내는 부분입니다. 바로 위에 소스는 우리가 보여주고자 하는 웹페이지의 HTML 소스 입니다. 이 HTML 소스를 한줄 씩 client.print() 를 써서 출력 하게 됩니다.

<!DOCTYPE HTML> 이 한줄을 아두이노 에서는 client.println("<!DOCTYPE HTML>") 이런 식으로 써주시면 됩니다.
센서 값 입력 해주시는 방법은 client.print("Flex Sensor value : "); client.println(flexval); 이런식으로 print() 를 쓰셔서 한줄에 다 들어 갈수 있도록 합니다.



(왼쪽이 HTML 문서를 바로 열었을 때(센서 값은 임의로 넣었습니다), 오른쪽이 아두이노 WiFi 실드를 통해 웹페이지를 열었을 때(센서 값은 제대로 측정 된 값입니다.))

 

void printWifiStatus() {  // 연결된 네트워크 정보 출력
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  // 네트워크 SSID 출력

  IPAddress ip = WiFi.localIP(); 
  Serial.print("IP Address: ");
  Serial.println(ip);
  // 네트워크 ip 출력

  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
  // 수신 강도 출력
}

void printWifiStatus() 함수는 연결 된 네트워크의 정보를 출력 하는 함수 입니다. 연결 성공시 연결된 네트워크의 SSID, ip, 신호 강도를 출력 합니다.

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

WIFI쉴드, 아두이노

SaBo 2015-03-15 14:31:09

컨텐츠 감사히 잘 봤습니다. 아두이노로부터 전송된 html 소스는 어디서 확인하고 어디서 열어볼수 있는건가요???

판다마니아 2015-03-30 13:11:28

https://learn.sparkfun.com/tutorials/pushing-data-to-datasparkfuncom/arduino--cc3000-shield

김치윤 2015-05-21 00:06:25

혹시 웹으로 센서의 정보를 받는 것돠 웹에서 아두이노에 달린 led센서를 조종할수도 있을까요?

판다마니아 2015-05-21 11:11:33

HTML을 사용하실수 있으시면 client.println() 함수를 이용하여 웹페이지에 radio버튼을 만든 후 get /?status 값을 이용하여 LED를 조종할수 있습니다.

간단한 예제를 통해서 웹페이지에서 LED를 제어하실려면 breakout.js를 이용해서 사용해보세요 Wifi쉴드가 아닌 무선 네트워크가 가능한 노트북이나 컴퓨터에 usb로 연결하여 원격 제어를 하는 방법입니다.

breakout.js 에 대한 예제는 http://kocoafab.cc/tutorial/view/438 튜토리얼을 확인해 보시길 바랍니다.

김치윤 2015-05-23 22:22:43

다른 아두이노에서 xbee통신을 통해 받은 정보를 다시와이파이 통신을 이용해 pc로 정보를 보내고 싶습니다.
즉 아두이노1(xbee)---> 아두이노2--->pc(와이파이)
여기서 궁금한점이 한아두이노에서 xbee와 와이파이통신을 둘다구현간능한가요?
소프트웨어시리얼을 이용하면 된다는 글을 본것같은데 적확히하고싶어서 질문드립니다.

또한 질문2
xbee통신을 사용하기 위해선 쉴드와 모듈을 둘다구매해야하던데
와이파이는 와이파이 쉴드하나만사면 되나요?

김치윤 2015-06-25 15:23:55

안녕하세요
쓰신글중에
WIFI 실드에 웹서버를 올려 다른 곳에서 이 웹에 접속 할 수 있도록 합니다. (같은 공유기에 있을 경우에만 접속 됩니다.)
이 글에 관해 궁금한 점이 있어 질문드립니다.
저말대로라면 wifi쉴드에서 올린 웹서버는 다른공유기 즉 와이파이쉴드와 같은공유기를 쓰지 않으면 접속이 불간으하다는 건가요? ..
가능한 방법은 없을까요?

윤민규 2016-05-11 20:32:15

안녕하세요 안드로이드를 공부하고있는 학생입니다. 와이파이 통신을 통하여 센서값을 받아보는 것을 해보려고하는데
해당 소스코드를 받아볼수 있을가요.. 도움이 필요합니다..

kocoafab 2016-05-11 23:20:55

모바일 폰 상의 화면은 앱이 아닌, 웹 브라우저로 접속했을때, 아두이노에서 보낸 페이지입니다. 즉 아두이노가 웹 서버형태로 동작하고 있어 별도의 앱은 필요하지 않습니다.

김상덕 2016-05-12 10:54:57

안녕하세요
제가 환풍기를 스마트폰앱을 만들어서 작동하고 싶은데
wifi를 이용하여 할수있는건가요?

윤민규 2016-05-12 17:38:18

아... 댓글 정말 감사합니다.. 저희가 센서에 의해 측정된(온도/습도) 값을 닷홈서버 DB에 값을 저장시키고
어플리케이션을 통해 받아 보려고하는데.. 조언을 구할수가 있을가요 ?
xml 파싱, json 파싱 중 어떤게더 좋을까요?

윤민규 2016-05-12 18:04:27

죄송하지만 하나 더 질문 하겠습니다.
아두이노자체가 웹서버라는게 이해가 잘안가서 질문합니다... PC에 서버를 생성하고 위의 코딩된 소스에 의해 서버에 접속하고 값을 저장하여 HTML으로 생성하는 것인가요?

원기옥 2016-05-12 18:10:21

#윤민구 xml 보다는 json 이 빠르고 구성하기도 좋습니다. 그리고 아두이노가 일반적인 웹서버 역할을 한다기 보다는, 간단히 리스닝 할 수 있는 서버 소켓 정도를 열 수 있다고 생각하시면 될 것 같은데요 ㅎ

원기옥 2016-05-12 18:13:59

#김상덕 중간에 환풍기와 스마트폰이 같이 붙을 수 있는 WiFi AP가 있다면 가능하고요, 스마폰에서 WifI 테더링을 통해서도 가능할 거에요.

정후민 2016-05-13 23:34:08

질문이 있습니다.
아두이노가 LIN 같은 버스를 통해 여러개의 센서로 부터 데이터를 모아서 클라이언트에게 보내는 것이 가능한가요?

김종민 2016-10-14 04:34:24

웹서버를 만들고 웹서버를 refresh하는데 이 시간을 더 줄이는게 가능 한가요?

chaliha 2017-04-04 16:45:26

오렌지보드 ble와 오렌지보드 wifi를 같이 연결할수 있나요??

dkendlsh 2018-05-22 21:51:35

아두이노 초보자입니다 ㅠㅠ Phpoc wifi 쉴드를 이용해서 웹서버에 잠시 저장하려고 하는데 이 코드 그대로 쓰면 되나요??
자세하게 설명 좀 부탁드립니다ㅠㅠ

꼬꼬 2018-12-27 19:01:51

UNO + wifi shield에서 어떻게 analog 값을 입력 받는거죠?
일반 ESP8266 WiFi 보드에서 아날로그를 선언 할 수 없다고 떠서요;;