아두이노로 만드는 수경재배 장치 목차
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프로그램을 복사한다.
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 하면 다음과 같이 광센서의 정보를 확인할 수 있다.
'IoT 자동화' 카테고리의 다른 글
아두이노 IDE 호환 ESP32 개발 보드 사용하기 (5) | 2024.11.09 |
---|---|
ESP 01 와이파이 펌웨어 업그레이드 (꼭 해야 한다면 성공 방법으로) (0) | 2023.04.30 |
아두이노로 만드는 수경재배 장치; 8. 와이파이 연결 (ESP 01) - 1 (2) | 2023.03.26 |
아두이노와 순수 릴레이를 사용한 시간 지연 릴레이 (자동 스위치) (1) | 2023.03.23 |
아두이노로 만드는 수경재배 장치; 7. 시간 지연 릴레이 (자동 스위치) (2) | 2023.03.21 |