본문 바로가기

IoT 자동화

아두이노로 만드는 수경재배 장치; 8. 와이파이 연결 (ESP 01) - 2

아두이노로 만드는 수경재배 장치 목차

1. 아두이노 시작하기

2. 아두이노 IDE

3. 첫 번째 아두이노 개발

4. 온도, 습도계 v 1.0

5. 온도, 습도계 v 2.0

6. 조도계 (광센서)

7. 시간 지연 릴레이 (자동 스위치)

8. 와이파이 연결 (ESP 01) - 1

9. 와이파이 연결 (ESP 01) - 2

이제 ESP 01이 아두이노와 연결되었고 잘 작동되는지도 확인했으니 앞에서 테스트한 센서를 연결하고 값을 읽어 브라우저로 표시하도록 만들어 본다.

3. ESP 01 프로그램

와이파이 인터넷을 아두이노와 연결하기 위한 모듈이 다양하듯이, 선택한 모듈에 따라 아두이노가 사용할 수 있는 라이브러리도 다양하다. 불행히도 아두이노의 서로 다른 와이파이 모듈 라이브러리는 호환되지 않기 때문에 그에 맞는 라이브러리를 찾아서 사용해야 한다. ESP 01모듈의 경우 Adafruit에서 만든 ESP 8266 라이브러리를 많이 사용하는데, 나는 지금은 HTTP Server기능을 가진 라이브러리를 사용하여 브라우저로 센서 정보를 전송하는 테스트를 간단하게 해보려 하기 때문에 HTTP Server Example이 있는 WiFiEsp라이브러리를 사용했다. 사실 내가 원하는 아두이노 라이브러리는 HTTP Server 기능으로, Get과 Post Handler를 Python의 Flask나 Node의 Express에 정도 수준으로 보기 쉽게 만들 수 있는 라이브러리를 원했는데 이런 라이브러리는 아두이노에 연결하는 ESP 01 모듈에서는 찾을 수 없었다. 덕분에 나중에 센서, 릴레이, PWM을 모두 연결하고 정보조회와 장치제어를 위한 모든 기능을 구현하기 위해 몇 시간 동안 HTTP Server기능을 만드는데 시간을 보내야만 했다. 하여간...

 

먼저 WiFiEsp라이브러리를 설치한다.

 

이제 More info를 눌러 라이브러리 소스가 있는 GitHub의 Examples에서 WebServer프로그램을 복사한다.

 

GitHub - bportaluri/WiFiEsp: Arduino WiFi library for ESP8266 modules

Arduino WiFi library for ESP8266 modules. Contribute to bportaluri/WiFiEsp development by creating an account on GitHub.

github.com

WebServer.ino에서 ESP 01을 연결한 디지털 핀 번호, ssid와 pass를 내 환경에 맞춰 고치고, 내 아두이노 IDE의 환경에 맞도록 "Serial.begin(9600)"처럼 함수의 인자를 바꾼다.

 

...

#include "WiFiEsp.h"

// Emulate Serial1 on pins 6/7 if not present
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // RX, TX	=> 요거를 SoftwareSerial Serial1(2, 3);
#endif

char ssid[] = "Twim";            // your network SSID (name)    => 요것과
char pass[] = "12345678";        // your network password       => 요것
int status = WL_IDLE_STATUS;     // the Wifi radio's status
int reqCount = 0;                // number of requests received

WiFiEspServer server(80);

...

 

아두이노 IDE에서 Upload 하고 실행할 때 나오는 IP를 확인해서 브라우저로 접속한다.

 

 

이제 "Analog input A0: 485"대신 아두이노의 센서 정보를 표시하도록 바꾸기 위해 WebServer.ino 프로그램에서 한글로 된 부분만 수정한다.

 

/*
 WiFiEsp example: WebServer
 A simple web server that shows the value of the analog input 
 pins via a web page using an ESP8266 module.
 This sketch will print the IP address of your ESP8266 module (once connected)
 to the Serial monitor. From there, you can open that address in a web browser
 to display the web page.
 The web page will be automatically refreshed each 20 seconds.
 For more details see: http://yaab-arduino.blogspot.com/p/wifiesp.html
*/

#include "WiFiEsp.h"
// 광센서 헤더파일을 추가하고
#include <BH1750FVI.h>

// 광센서 오브젝트를 만들고
BH1750FVI LightSensor(BH1750FVI::k_DevModeContLowRes);

// Emulate Serial1 on pins 6/7 if not present
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(2, 3); // RX, TX      => 디지털 핀이 2,3번인지 확인하고
#endif

char ssid[] = "Twim";            // your network SSID (name)  => 요것과
char pass[] = "12345678";        // your network password     => 요것을 바꿔야 한다.
int status = WL_IDLE_STATUS;     // the Wifi radio's status
int reqCount = 0;                // number of requests received

WiFiEspServer server(80);


void setup()
{

  // 광센서를 시작하고
  LightSensor.begin();

  // initialize serial for debugging
  Serial.begin(9600);                         // => 아두이노 IDE의 Serial Monitor속도와 일치하게
  // initialize serial for ESP module
  Serial1.begin(9600);
  // initialize ESP module
  WiFi.init(&Serial1);

  // check for the presence of the shield
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue
    while (true);
  }

  // attempt to connect to WiFi network
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network
    status = WiFi.begin(ssid, pass);
  }

  Serial.println("You're connected to the network");
  printWifiStatus();
  
  // start the web server on port 80
  server.begin();
}


void loop()
{
  // listen for incoming clients
  WiFiEspClient 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 you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          Serial.println("Sending response");
          
          // send a standard http response header
          // use \r\n instead of many println statements to speedup data send
          client.print(
            "HTTP/1.1 200 OK\r\n"
            "Content-Type: text/html\r\n"
            "Connection: close\r\n"  // the connection will be closed after completion of the response
            "Refresh: 20\r\n"        // refresh the page automatically every 20 sec
            "\r\n");
          client.print("<!DOCTYPE HTML>\r\n");
          client.print("<html>\r\n");
          client.print("<h1>Light sensor</h1>\r\n");      // 제목을 바꾸고
          client.print("Requests received: ");
          client.print(++reqCount);
          client.print("<br>\r\n");
          client.print("Light : ");                       // 표시할 내용이 Light라고 쓰고
          client.print(LightSensor.GetLightIntensity());  // 광센서에서 읽은 정보를 쓴다.
          client.print("<br>\r\n");
          client.print("</html>\r\n");
          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(10);

    // close the connection:
    client.stop();
    Serial.println("Client disconnected");
  }
}


void printWifiStatus()
{
  // print the SSID of the network you're attached to
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  
  // print where to go in the browser
  Serial.println();
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
  Serial.println();
}

 

다시 아두이노 IDE에서 Upload 하면 다음과 같이 광센서의 정보를 확인할 수 있다.