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

WeMos LOLIN 보드의 무선 WiFi 성능을 확인하자!

coding art 2018. 8. 3. 17:08
728x90




WeMos LOLIN 보드의 무선 WiFi 성능에 주목해 보자. 바로 앞에 LOLIN 보드에 온습도 센서를 설치하여 측정한 값을 ThingSpeak 사물인터넷 사이트에 전송해본 경험이 있지만 타 보드에서 사용하던 코드를 살짝 수정해서 과연 무선 WiFi 가 작동하는지 여부를 단순 판가름 하였을 뿐이다.

WeMos LOLIN 보드가 최근에 출시된 보드이기 때문에 조심스럽게 보드의 기본적인 성능을 체크해 본 결과 analogWrite 명령을 제외하고 큰 문제는 없었다. 물론 analogWrite 명령이 직접 컴파일 되지는 않았으나 그 대체 명령으로 좀 번거롭긴 해도 ledcWrite 명령으로 대체가 가능하였다. 이 점에 관해서는 2개의 핀에서 ledcWrite 명령 실행이 가능한지 좀 더 확인이 필요한 듯하다.

드디어 이번 단계에서는 무선 WiFi 성능을 확인해 보도록 하겠다. 이미 ESP8266 칩을 장착한 NodeMCU/WeMos 보드와 W5100 이더넷(Ethernet) 보드에서 다양한 코딩을 해보았으나 아무래도 성능 검증 작업이므로 스스로 짠 코드가 아닌 아두이노 오픈소스 바닥에 널려있는 에제중에서 딱 마음에 드는 코드가 없어 절충으로 이 예제들을 조합하여 적절한 예제 코드를 준비하였다. 코드 준비 및 배선, 실험 시간까지 합해 1시간 정도 소요하였다.

LOLIN 보드 WiFi 성능 실험 내용은 가변저항을 VP에 배선하였다. 전원 Vcc 는 Batt 단자에 0V는 GND에 배선 한다. VP아날로그 입력 핀은 36번에 해당하며 내부 코드에서 for looping에서 한 번씩 통과하게 코딩하였다. 나머지 코딩이 되지 않은 아날로그 핀에서도 뭔가 값이 출력되어 무선 WiFi를 통해 날라와 웹에 출력되는데 자세히 몇분간 째려보면 Random 한 값임을 알 수 있다. 즉 값이 슬슬 변한다는 점이다. 반면에 가변 저항이 연결된 핀의 값은 가변저항 돌리기 전에 변동이 있으면 안된다. 가변저항을 돌려 보면 그 범위가 0∼4095임을 알 수 있다. analogRead 명령을 사용하면 항상 + 값만 나오며 4095=2**12-1임을 알수 있다. 즉 0∼1023까지 10비트 데이터를 제공하는 아두이노 우노와는 달리 12비트임을 확인할 수 있다.



WiFi 실험을 위한 코드 준비 내용을 설명하기로 한다. LOLIN 보드의 WiFi 성능 확인을 위한 코드는 아두이노 편집기에서 흔하게 볼 수 있는 이더넷 예제의 WebServer 코드를 손보았다. WebServer 예제 코드는 유선 인터넷인 이더넷 보드에서 실행이 되는 우리가 알고 있는 통신 코드 중에서 가장 후줄그레한 코드이며 얘네 코드 실행이 잘되면 아무 코드나 다 된다는 의미로 볼 수 있을 것이다.



단 코드 수정을 간단히 하기 위해서 WeMos LOLIN 32 예제 메뉴 중에서 WiFi에 포한되어 있는 SimpleWiFiServer 의 헤더부분을 참고하였다. 여러분은 그 고생마저 할 필요가 없는듯하다. 수정해서 첨부된 코드를 살펴보면 될듯하다. 수정 내용은 NodeMCU/WeMos  보드 사용시 ESP8266WiFi.h 라이브러리를 사용하다가 LOLIN 보드에 와서는 WiFi.h 로 바꾸면 그만이며 수정할 내용이 거의 없다. 이 동네 업자들 특성이 손 안되고 코풀기 좋아하는 중국식 짝퉁으로 보면 될 것이다. EthernetServer 가 WiFiServer 로 바뀌는 정도며, mac  address 따위는 필요 없는 듯하다. 자세히 살펴보면 ESP8266WiFi,h 라이브러리 명령이나 WiFi.h 라이브러리 명령이 동일한 듯한데 생각해 보니 ESP32 칩 제조하는 회사명이 Espresif로 ESP8266 칩 제조사와 동일한 회사인 듯하다.
그밖에 변경 내용으로서는 클라이언트로부터 request를 받은 후 LOLIN에서 송출해야 할 가변 저항의 값을 읽어들이는 anlogRead 명령의 핀 번호를 0∼5에서 32∼36으로 바꾸었다.

아무런 문제없이 잘 작동이 되었다. 다음 기회에는 조금씩 난이도를 올려 NodeMCU/WeMos 보드에서 작성한 코드 몇 가지를 시험해 보도록 할 예정이다.

첨부된 코드를 실행해 보기 바란다.


//WeMos_lolin_WebServer_01

#include <WiFi.h>
const char* ssid     = "android1234";
const char* password = "dddddddddd";

WiFiServer server(80);
int value = 0;
void setup() {
    Serial.begin(115200);
    pinMode(5, OUTPUT);      // set the LED pin mode
    delay(10);

    // We start by connecting to a 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.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    server.begin();
}


void loop() {
   WiFiClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close"); 
          client.println("Refresh: 5"); 
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 32; analogChannel < 37; analogChannel++) {
            //int analogChannel = 36;
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}//끝