아두이노프로세싱 프로그래밍

weMos의 LED 및 DHT11 사물인터넷 와이파이 제어를 위한 HTML 코딩

coding art 2017. 11. 22. 14:50
728x90


                                        




ESP8266 WiFi 12 칩이 장착된 아두이노 weMos 보드에 LED, 온습도 센서 DHT11을 설치하고 무선공유기가 부착된 PC의 웹화면에서 weMos 보드를 사물인터넷 제어를 해보자.

330옴 전류제한 저항과 연결된 LED는 별도의 빵판없이 디지털 데이터 핀 12번과 바로 인근의 GND 선을 이용하기로 한다. DHT11 센서는 5V 전원과 GND 및 디지털 데이터 핀 5번을 사용하기로 한다.



weMos 보드의 코딩은 아두이노 NodeMCU 보드의 코딩과 핀 배치상의 위치만 제외하고는 거의 유사하다. 따라서 NodeMCU 코딩이 있으면 조금 손만 보면 충분하다. weMos 보드 코딩에서 주의할 점은 디지털 데이터 핀 지정에 아두이노 우노 보드와 핀 배치는 거의 동일하지만 핀 번호 지정 시 D0, D1,⚫⚫⚫ 와 같이 작성해야 한다.

ESP8266WiFi.h는  와이파이지원 라이브러리이며 DHT11.h는 온습도 센서 지원 라이브러리이다. DHT11의 데이터 핀은 weMos 보드의 핀 5번에 설치한다. 전류제한 저항이 연결된 LED는 그림과 같이 제작하여 12번 핀과 인접한 GND 에 설치한다.

와이파이서버를 클라스 즉 server로 명명하고 포트 번호는 아두이노 ESP8266 와이파이 응용의 경우 80 으로 고정 설정한다. 온습도 센서 루틴을 불러오기 위한 클라스 명령도 dht11() 으로 설정한다.




setup()에서 통신속도 설정은 weMos 의 경우 기본이 115200 이지만 원한다면 9600으로 설정해도 무방하며 단 시리얼 모니터 사용 시에 통신 속도를 맞춰주어야 한다. 이어지는 와이파이 연결을 위한 코드 내용은 NodeMCU 와 아무런 차이가 없으며 블로그에 첨부된 코드를 참조하기 바란다.

컴파일 업로딩 후 시리얼 모니터에서 가상 ip를 확인하도록 한다.

툴 메뉴에서 weMos(D1)을 선택하고 포트 번호를 지정하도록 한다. 만약 툴 메뉴에서 weMos 보드를 찾을 수 없으면 별도의 Install 작업이 필요하다.


이 가상 ip를 인터넷 url 주소창에 입력 후 엔터를 실행하면 와이파이 망에 잡히는 웹서버 코드에  request 가 전달되어 반응하게 된다.


그림과 같은 웹서버 코드를 볼 수 있다. 2개의 버튼을 클릭하고 weMos에 설치된 LED의 반응을 살펴보기 바란다. 특히 Turn on  버튼 클릭 시에는 온도와 습도 데이터를 업데이트하여 디스플레이 하게끔 코딩되어 있다.








Webserver_weMos_IOT_01


#include <ESP8266WiFi.h>
 #include <DHT11.h> //라이브러리 불러오기
 
 const char* ssid = "android1234";
 const char* password = "dddddddddd";
 int pin = D5;            //온습도 센서 data signal 핀번호
 int ledPin = D12; //
 
 WiFiServer server(80);
 DHT11 dht11(pin);
 
 void setup() {
   Serial.begin(115200);
   delay(10);

   pinMode(ledPin, OUTPUT);
   digitalWrite(ledPin, LOW);

   // Set WiFi to station mode and disconnect from an AP if it was previously connected
   WiFi.mode(WIFI_STA);
   WiFi.disconnect();
   delay(100);

   Serial.println("Setup done");

   // Connect to WiFi network
   Serial.println();
   Serial.println();
   Serial.print("Connecting to ");
   Serial.println(ssid);

   WiFi.begin(ssid, password);

   while (WiFi.status() != WL_CONNECTED) {
     delay(500);
     Serial.print(".");
   }
   Serial.println("");
   Serial.println("WiFi connected");

   // Start the server
   server.begin();
   Serial.println("Server started");

   // Print the IP address
   Serial.print("Use this URL to connect: ");
   Serial.print("http://");
   Serial.print(WiFi.localIP());
   Serial.println("/");

 }

 void loop() {
   // Check if a client has connected
   WiFiClient client = server.available();
   if (!client) {
     return;
   }

   // Wait until the client sends some data
   Serial.println("new client");
   while(!client.available()){
     delay(1);
   }

   // Temperature & Humidity Sensing
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))==0) //온도, 습도 읽어오기
  {
    Serial.print("temperature:");
    Serial.print(temp);
    Serial.print(" humidity:");
    Serial.print(humi);
    Serial.println();
  }
  else                               
  {
    Serial.println();
    Serial.print("Error No :");
    Serial.print(err);
    Serial.println();   
  }
  delay(2000);                        //2초마다 측정

   // Read the first line of the request
   String request = client.readStringUntil('\r');
   Serial.println(request);

   if( request.substring(5,16) != "favicon.ico") {
   client.flush();

   // Match the request

   int value = LOW;
   if (request.indexOf("/LED=ON") != -1)  {
     digitalWrite(ledPin, HIGH);
     delay(1000);
     value = HIGH;
   }
   if (request.indexOf("/LED=OFF") != -1)  {
     digitalWrite(ledPin, LOW);
     delay(1000);
     value = LOW;
   }

   // Return the response
   client.println("HTTP/1.1 200 OK");
   client.println("Content-Type: text/html");
   client.println(""); //  do not forget this one
   client.println("<!DOCTYPE HTML>");
   client.println("<html>");
   client.println("<head>");
//배경 색 문자 색 사이즈 HTML CSS 설정  
   client.println("<style>");
   client.println("body {");
   client.println("background-color: lightblue;");
   client.println("}");
   client.println("p {");
   client.println("color:red;");
   client.println("font-size:100%;");
   client.println("}");
  
//버튼 HTML CSS 설정  
client.println(".button {");
    client.println("background-color: green;");
    client.println("border: none;");
    client.println("color: white;");
    client.println("padding: 15px 32px;");
    client.println("text-align: center;");
    client.println("text-decoration: none;");
    client.println("display: inline-block;");
    client.println("font-size: 20px;");
    client.println("margin: 14px 20px;");
    client.println("cursor: pointer;");
client.println("}");
   
   client.println("</style>");
   client.println("</head>");
   client.println("<body>");
   client.println("<p>");
   client.print("Led pin is now: ");

   if(value == HIGH) {
     client.print(on");
     client.println("<br><br>");
     client.print(" Temperature = ");
     client.print(temp);
     client.println("<br><br>");
     client.print(" Humidity = ");
     client.print(humi);
     client.print(" % ");
   } else {
     client.print("Off");
   }
   client.println("<br><br>");
   client.println("<a href=\"/LED=ON\"\" class='button'>Turn on </button></a>");
   client.println("<a href=\"/LED=OFF\"\" class='button'>Turn Off </button></a>");

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

   delay(1);
   Serial.println("Client disonnected");
   Serial.println("");
 }// if문 괄호 닫기
 }//프로그램 끝