13. Make up the ESP32 Web Server - EnglishNo/ESP32 GitHub Wiki
HTML์ด๋?
- "HyperText Markup Language"์ ์ฝ์๋ก, ์น ๋ฌธ์๋ฅผ ๋ง๋ค๊ธฐ ์ํ์ฌ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ์น ์ธ์ด์ ํ ์ข ๋ฅ.
- ๋ฌธ์์ ๊ธ์ํฌ๊ธฐ, ๊ธ์์, ๊ธ์๋ชจ์, ๊ทธ๋ํฝ, ๋ฌธ์์ด๋(ํ์ดํผ๋งํฌ) ๋ฑ์ ์ ์ํ๋ ๋ช ๋ น์ด๋ก์ ํํ์ด์ง๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ.
- HTML์๋ ํ๊ทธ, ์์ฑ, ์ฝํ ์ธ , ์์๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, ํ๊ทธํ๊ณ ์์ฑ์ <>์์ ์์ฑ๋๊ณ , ์ฝํ ์ธ ๋ ์ฌ๋ ํ๊ทธํ๊ณ ๋ซ์ ํ๊ทธ ์ฌ์ด์ ์๋ ๋ฌธ์ฅ, ์์๋ ์ฌ๋ ํ๊ทธ, ๋ซ์ ํ๊ทธ, ์ฝํ ์ธ ๋ก ๊ตฌ์ฑ.
- ๋ฉ๋ชจ์ฅ์๋ ์์ฑํ ์ ์๋ ์ธ์ด.
-์ฐธ๊ณ ํ ์ฌ์ดํธ-
- https://terms.naver.com/entry.naver?docId=1168097&cid=40942&categoryId=32838
- https://developer.mozilla.org/ko/docs/Learn/Getting_started_with_the_web/HTML_basics
<HTML>
<HEAD>
<TITLE> DHT11 </TITLE> <!-- ์ฌ์ดํธ ์ ๋ชฉ -->
</HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=UTF-8" > <!-- ํ๊ธ์ด ๊นจ์ง ๊ฒ์ ์ฐ๋ คํด ์์ฑ. -->
<BODY>
<H1> ESP32 Web Server Reading sensor values </H1> <!-- ํฐ ์ ๋ชฉ, ์๋์ผ๋ก ๋์ด์ฐ๊ธฐ ์ ์ฉ, <H> ํ๊ทธ ์ค์์ 1์ ์ ์ผ ํฐ ๊ธ์์ ์ ๋ชฉ์ ์์ฑํ๊ฒ ํจ. -->
<h2> DHT11 </h2> <!-- ์ฌ์ฉํ DHT ์ข
๋ฅ ์์ฑ. -->
<h3> ์ ๋์ฐ ์ ์ </h3> <!-- ์ ์์ ์ด๋ฆ ์์ฑ. -->
<table width="190"> <!-- ํ ์์ฑ. -->
<tr> <!-- ์ฒซ๋ฒ์งธ ๋ผ์ธ -->
<th> MEASUREMENT </th>
<th> VALUE </th>
</tr>
<tr align="center"> <!-- ๋๋ฒ์งธ ๋ผ์ธ, align="center"๋ <tr> ํ๊ทธ ์์ ์๋ ๋ชจ๋ ๋ฌธ์ฅ์ ๊ฐ์ด๋ฐ๋ก ์ ๋ ฌํ๊ฒ ํด์ค. -->
<td> Temperature </td>
<td> ---*C </td> <!-- ์จ๋ ๊ฐ์ ๋ฃ์ ์๋ฆฌ -->
</tr>
<tr align="center"> <!-- ์ธ๋ฒ์งธ ๋ผ์ธ -->
<td> Humidity </td>
<td> ---% </td> <!-- ์ต๋ ๊ฐ์ ๋ฃ์ ์๋ฆฌ -->
</tr>
</table>
</BODY>
</HTML>
-์์ฑ ํ ์คํํ ๋์ ์ฌ์ดํธ ๋ชจ์ต-
#include <Wire.h>
#include <WiFi.h>
#include "DHT.h"
#define DHTTYPE DHT11
int Pin = 13;
DHT dht(Pin, DHTTYPE);
const char* ssid = "(์์ดํ์ด ID)";
const char* password = "(์์ดํ์ด ๋น๋ฐ๋ฒํธ)";
WiFiServer server(80); // ()์์๋ ํฌํธ๋ฒํธ ์์ฑํ๋๋ฐ, ํฌํธ ๋ฒํธ 80์ ์ผ๋ฐ์ ์ผ๋ก HTTP ํต์ ์ ์ํ ๊ธฐ๋ณธ ํฌํธ ๋ฒํธ์ด๊ธฐ์, HTTP ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๊ธฐ ์ํด 80๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉ. ("WiFiServer" ํด๋์ค๋ ESP32์ Wi-Fi ์๋ฒ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ)
float temp;
float humid;
void setup() {
Serial.begin(115200);
dht.begin();
Serial.print("Connecting to Wifi Network");
Serial.println(ssid);
WiFi.begin(ssid, password); // ์์ดํ์ด ์ค๋น.
while (WiFi.status() != WL_CONNECTED) { // ์์ดํ์ด๊ฐ ์ฐ๊ฒฐ๋ ๋๊น์ง ์งํ.
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Successfully connected to WiFi.");
Serial.print("IP address of ESP32 is : ");
Serial.println(WiFi.localIP()); // ์ฌ์ฉ์ค์ธ ์์ดํ์ด๊ฐ ์ง๊ธํ๋ IP ์ถ๋ ฅ.
server.begin(); // WiFiServer ๊ฐ์ฒด์ธ server๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ด๊ธฐํํ๋ ์ญํ . (์๋ฒ๋ฅผ ์์ํ์ฌ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋ฐ์ ์ ์๋๋ก ํ๋ฉฐ, ์ดํ์ ์ฝ๋์์ server ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์์ ํต์ ์ ๊ด๋ฆฌ)
Serial.println("Server started \n");
Serial.print("http://"); Serial.println(WiFi.localIP());
}
void loop() {
temp = dht.readTemperature();
humid = dht.readHumidity();
WiFiClient client = server.available(); // ์ฝ๋๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋ฐ์ ์ ์๋์ง ํ์ธํ๊ณ , ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ์์ ํต์ ์ ์ํ WiFiClient ๊ฐ์ฒด๋ฅผ ์์ฑ (server.available() ํจ์๋ ํ์ฌ ์๋ฒ์ ๋๊ธฐ ์ค์ธ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ด ์๋์ง ํ์ธํ๊ณ , ๋ง์ฝ ๋๊ธฐ ์ค์ธ ํด๋ผ์ด์ธํธ๊ฐ ์์ผ๋ฉด, ์๋ก์ด WiFiClient ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋น ํด๋ผ์ด์ธํธ์์ ํต์ ์ ์ํด ์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ)
if(client) { // "client"๋ผ๋ WiFiClient ๊ฐ์ฒด๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ๋ผ๋ฉด if์ {}์์ ์ฝ๋๊ฐ ์๋ํ๊ฒ ํจ.
Serial.println("Web Client connected ");
String request = client.readStringUntil('\r'); // ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฝ๋ ์ญํ ์ ํจ. ์๋ฅผ ๋ค์ด, "GET /index.html HTTP/1.1"๊ณผ ๊ฐ์ GET ์์ฒญ์ ๋ณด๋๋ค๋ฉด ํด๋น ๋ณ์์๋ "GET /index.html HTTP/1.1"๋ผ๊ณ ์ ์ฅ.
client.println("http://192.168.35.107 OK");
client.println("Content-type:text/html");
client.println("Connection : close");
client.println("");
// HTML ์น ์ฌ์ดํธ ์ ์ํ ๊ฒ
client.println("<html>");
client.println("<head> <title> DHT11 </title> </head>");
client.println("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;CHARSET=UTF-8\" name=\"SmartDevice\" >"); // ์๋ฒ์ ๋์ค๋ ํ๊ธ์ด ๊นจ์ ธ ๋์์ ์ฌ์ฉํจ.
client.println("<body>");
client.println("<H1> ESP32 Web Server Reading sensor values </H1>");
client.println("<h2> DHT11 </h2>");
client.println("<h3> ์ ๋์ฐ ์ ์ </h3>");
client.println("<table width=\"190\">");
client.println("<tr> <th> MEASUREMENT </th> <th> VALUE </th> </tr>");
client.print("<tr align=\"center\"> <td> Temperature </td> <td>");
client.print(temp);
client.println("*C </td> </tr>");
client.print("<tr align=\"center\"> <td> Humidity </td> <td>");
client.print(humid);
client.println("% </td> </tr>");
client.println("</table>");
client.println("</body>");
client.println("</html>");
}
}
-ํด๋น ์ฝ๋ ์์ฑ ํ ์คํ ๊ฒฐ๊ณผ-
(*์ฃผ์ - ๋ช๋ช ์ฝ๋๋ฅผ ์ค๋ช ํ๋ ์ฃผ์์ Chat GPT๋ฅผ ํตํด ์ฐพ์ ๊ฒ์ด๋ฏ๋ก ํ๋ฆฐ ์ ๋ณด์ผ ๊ฐ๋ฅ์ฑ๋ ์์.)๊ณ ๊ธ ์นํ์ด์ง ๋ง๋ค๊ธฐ(์ด๋ฏธ์ง ์ถ๊ฐ, ์๋ ์๋ก๊ณ ์นจ, ํฐ ์ ๋ชฉ ์ถ๊ฐ, ์ฌ์ดํธ ๊ฐ๋ตํ)
<HTML>
<HEAD>
<TITLE> DHT11 </TITLE>
<!-- css ์ฌ์ฉ -->
<style type="text/css">
.title {text-align: center; font-size: 60px;}
th, td {font-size: xx-large;}
sup {font-size: 18px;}
</style>
</HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=UTF-8">
<META HTTP-EQUIV="refresh" CONTENT="10"> <!-- 10์ด๋ง๋ค ์ฌ์ดํธ ์๋ก๊ณ ์นจ -->
<BODY>
<H1 class="title"> ESP32 DHT11 Web Server </H1> <!-- "title" ํด๋์ค ์ฌ์ฉ -->
<table width="400" height="200" align="center"> <!-- ํ ์์ฑ. "align" ์์ฑ์ ํตํด ์ฌ์ดํธ ๊ฐ์ด๋ฐ๋ก ์ ๋ ฌ -->
<tr>
<th> MEASUREMENT </th>
<th> VALUE </th>
</tr>
<tr align="center">
<td>
<sub><svg xmlns="http://www.w3.org/2000/svg" height="1.5em" viewBox="0 0 320 512"><style>svg{fill:#ff2e2e}</style><path d="M160 64c-26.5 0-48 21.5-48 48V276.5c0 17.3-7.1 31.9-15.3 42.5C86.2 332.6 80 349.5 80 368c0 44.2 35.8 80 80 80s80-35.8 80-80c0-18.5-6.2-35.4-16.7-48.9c-8.2-10.6-15.3-25.2-15.3-42.5V112c0-26.5-21.5-48-48-48zM48 112C48 50.2 98.1 0 160 0s112 50.1 112 112V276.5c0 .1 .1 .3 .2 .6c.2 .6 .8 1.6 1.7 2.8c18.9 24.4 30.1 55 30.1 88.1c0 79.5-64.5 144-144 144S16 447.5 16 368c0-33.2 11.2-63.8 30.1-88.1c.9-1.2 1.5-2.2 1.7-2.8c.1-.3 .2-.5 .2-.6V112zM208 368c0 26.5-21.5 48-48 48s-48-21.5-48-48c0-20.9 13.4-38.7 32-45.3V144c0-8.8 7.2-16 16-16s16 7.2 16 16V322.7c18.6 6.6 32 24.4 32 45.3z"/></svg></sub> <!-- ์ด๋ฏธ์ง ์ถ๋ ฅ, "sub" ํ๊ทธ๋ฅผ ํตํด ์ด๋ฏธ์ง๋ฅผ ์๋์ฒจ์๋ก ์ถ๋ ฅ -->
Temperature
</td>
<td> ---<sup>*C</sup> </td> <!-- "sup" ํ๊ทธ๋ฅผ ํตํด ์์ฒจ์๋ก ์ถ๋ ฅ. -->
</tr>
<tr align="center">
<td>
<sub><svg xmlns="http://www.w3.org/2000/svg" height="1.5em" viewBox="0 0 384 512"><style>svg{fill:#3881ff}</style><path d="M192 512C86 512 0 426 0 320C0 228.8 130.2 57.7 166.6 11.7C172.6 4.2 181.5 0 191.1 0h1.8c9.6 0 18.5 4.2 24.5 11.7C253.8 57.7 384 228.8 384 320c0 106-86 192-192 192zM96 336c0-8.8-7.2-16-16-16s-16 7.2-16 16c0 61.9 50.1 112 112 112c8.8 0 16-7.2 16-16s-7.2-16-16-16c-44.2 0-80-35.8-80-80z"/></svg></sub>
Humidity
</td>
<td> ---<sup>%</sup> </td>
</tr>
</table>
</BODY>
</HTML>
-ํด๋น ์ฝ๋ ์์ฑ ํ ์คํํ ๊ฒฐ๊ณผ-
#include <Wire.h>
#include <WiFi.h>
#include "DHT.h"
#define DHTTYPE DHT11
int Pin = 13;
DHT dht(Pin, DHTTYPE);
const char* ssid = "(์์ดํ์ด ID)";
const char* password = "(์์ดํ์ด ๋น๋ฐ๋ฒํธ)";
WiFiServer server(80);
float temp;
float humid;
void setup() {
Serial.begin(115200);
dht.begin();
Serial.print("Connecting to Wifi Network");
Serial.println(ssid);
WiFi.begin(ssid, password); // ์์ดํ์ด ์ค๋น.
while (WiFi.status() != WL_CONNECTED) { // ์์ดํ์ด๊ฐ ์ฐ๊ฒฐ๋ ๋๊น์ง ์งํ.
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Successfully connected to WiFi.");
Serial.print("IP address of ESP32 is : ");
Serial.println(WiFi.localIP()); // ์ฌ์ฉ์ค์ธ ์์ดํ์ด๊ฐ ์ง๊ธํ๋ IP ์ถ๋ ฅ.
server.begin();
Serial.println("Server started \n");
Serial.print("http://"); Serial.println(WiFi.localIP());
}
void loop() {
temp = dht.readTemperature();
humid = dht.readHumidity();
WiFiClient client = server.available();
if(client) {
Serial.println("Web Client connected ");
String request = client.readStringUntil('\r');
client.println("http://192.168.35.107 OK");
client.println("Content-type:text/html");
client.println("Connection : close");
client.println("");
// HTML ์น ์ฌ์ดํธ ์ ์ํ ๊ฒ
client.println("<html>");
client.println("<head>");
client.println("<title> DHT11 </title>");
client.println("<style type=\"text/css\">");
client.println(".title {text-align: center; font-size: 60px;}"); // HTML์ CSS์์ ํด๋์ค ์์ฑ ๋ชจ์ต์.
client.println("th, td {font-size: xx-large;}"); // HTML์ ํ๊ทธ๋ฅผ ์์ฑ ์, ๋ชจ๋ ํด๋น ํ๊ทธ์ CSS ์ ์ฉ.
client.println("sup {font-size: 18px;}");
client.println("</style>");
client.println("</head>");
client.println("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;CHARSET=UTF-8\" name=\"SmartDevice\" >"); // ์๋ฒ์ ๋์ค๋ ํ๊ธ์ด ๊นจ์ ธ ๋์์ ์ฌ์ฉํจ.
client.println("<META HTTP-EQUIV=\"refresh\" CONTENT=\"10\">");
client.println("<body>");
client.println("<H1 class=\"title\"> ESP32 DHT11 Web Server </H1>");
client.println("<table width=\"400\" height=\"200\" align=\"center\">");
client.println("<tr> <th> MEASUREMENT </th> <th> VALUE </th> </tr>");
client.println("<tr align=\"center\"> <td>");
client.println("<sub><svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1.5em\" viewBox=\"0 0 320 512\"><style>svg{fill:#ff2e2e}</style><path d=\"M160 64c-26.5 0-48 21.5-48 48V276.5c0 17.3-7.1 31.9-15.3 42.5C86.2 332.6 80 349.5 80 368c0 44.2 35.8 80 80 80s80-35.8 80-80c0-18.5-6.2-35.4-16.7-48.9c-8.2-10.6-15.3-25.2-15.3-42.5V112c0-26.5-21.5-48-48-48zM48 112C48 50.2 98.1 0 160 0s112 50.1 112 112V276.5c0 .1 .1 .3 .2 .6c.2 .6 .8 1.6 1.7 2.8c18.9 24.4 30.1 55 30.1 88.1c0 79.5-64.5 144-144 144S16 447.5 16 368c0-33.2 11.2-63.8 30.1-88.1c.9-1.2 1.5-2.2 1.7-2.8c.1-.3 .2-.5 .2-.6V112zM208 368c0 26.5-21.5 48-48 48s-48-21.5-48-48c0-20.9 13.4-38.7 32-45.3V144c0-8.8 7.2-16 16-16s16 7.2 16 16V322.7c18.6 6.6 32 24.4 32 45.3z\"/></svg></sub>");
client.println("Temperature </td> ");
client.println("<td>");
client.print(temp);
client.println("<sup>*C</sup> </td> </tr>");
client.println("<tr align=\"center\"> <td>");
client.println("<sub><svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1.5em\" viewBox=\"0 0 384 512\"><style>svg{fill:#3881ff}</style><path d=\"M192 512C86 512 0 426 0 320C0 228.8 130.2 57.7 166.6 11.7C172.6 4.2 181.5 0 191.1 0h1.8c9.6 0 18.5 4.2 24.5 11.7C253.8 57.7 384 228.8 384 320c0 106-86 192-192 192zM96 336c0-8.8-7.2-16-16-16s-16 7.2-16 16c0 61.9 50.1 112 112 112c8.8 0 16-7.2 16-16s-7.2-16-16-16c-44.2 0-80-35.8-80-80z\"/></svg></sub>");
client.println("Humidity </td>");
client.println("<td>");
client.print(humid);
client.println("<sup>%</sup> </td> </tr>");
client.println("</table>");
client.println("</body>");
client.println("</html>");
}
}
-ํด๋น ์ฝ๋ ์์ฑ ํ ์คํํ ๋ชจ์ต-
-
"img" ํ๊ทธ๋ฅผ ์ฌ์ฉ.
- HTML์์ ๋ผ๊ณ ์์ฑํ๊ณ , src์ ""์์ ๊ฐ์ ํด๋ ์์ ์๋ ์ด๋ฏธ์ง ์ด๋ฆ(ํ์ผํ์๊น์ง ํฌํจ!)์ ์์ฑ.
- ๋จ์ : ํ๊ทธ๋ฅผ ์ฌ์ฉํ HTML๋ฅผ ESP32 ์๋ฒ์ ์ ์ฉํ ๋ ค๊ณ ํ๋ฉด, ํด๋น ์ด๋ฏธ์ง๊ฐ ํ์ ์ ๋จ.
-
"svg" ํ๊ทธ๋ฅผ ์ฌ์ฉ.
- ์ด ์ฌ์ดํธ์ ๋ค์ด๊ฐ, ๋ง์ ๋๋ ์ด๋ฏธ์ง ํด๋ฆญํ๊ณ , ํ๋จ์ "SVG" ํด๋ฆญํด์ ํด๋น ์ฝ๋๋ฅผ ๋ณต์ฌํด HTML ํ์ผ์ ๋ถ์ด๋ฃ๊ธฐ.
- ๋จ์ 1: ๋ถ์ด๋ฃ๊ธฐํ ์ฝ๋์ ๊ธธ์ด๊ฐ ๋๋ฌด ๊ธธ์ด ๊ฐ๋ ์ฑ์ ์ ์ข์.
- ๋จ์ 2: ์ด๋ฏธ์ง๊ฐ ์ถ๋ ฅ๋ ๋, ์ด๋ฏธ์ง์ ์์ด ์ํ๋ ์๊น๋ก ์ ๋์ฌ ์๋ ์์.
-
์น์๋ฒ๋?
- ์น ํ์ด์ง๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ณ ๊ฐ์ ธ์ค๊ณ ์น ํด๋ผ์ด์ธํธ์ ์ ๊ณตํ๋ ์ญํ ์ ํ๋ ํ๋์จ์ด์ ์ํํธ์จ์ด์ ์กฐํฉ.
- Hyper Text Transfer Protocol ๋๋ ๊ฐ๋จํ HTTP๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ๋ด๋นํ๋ ํ๋กํ ์ฝ๋ก, ์ด๋ฌํ ์ ํ์ ํต์ ์์ ์น ํด๋ผ์ด์ธํธ๋ HTTP๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์ ๋ณด๋ฅผ ์์ฒญ. (๋ง์ฝ ์์ฒญํ ํ์ด์ง๋ฅผ ์ฐพ์ ์ ์์ผ๋ฉด ์๋ฒ๋ HTTP 404 ์ค๋ฅ๋ก ์๋ต.)
-
ESP32์ WiFi ์๋ ๋ชจ๋ ์ข
๋ฅ
- ์คํ
์ด์
๋ชจ๋(STA)
- ESP32 ๋ชจ๋์ ๋ฌด์ ๋ผ์ฐํฐ์ ์ํด ์ค์ ๋ ๊ธฐ์กด WiFi ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋จ.
- ESP32 Wi-Fi ๋ชจ๋์ ๋ผ์ฐํฐ์ SSID, ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํด ๋ผ์ฐํฐ์ WiFi ๋คํธ์ํฌ์ ์ฐ๊ฒฐ, ๋ผ์ฐํฐ๋ ESP32์ ๋ก์ปฌ IP ์ฃผ์ ํ ๋น.
- ์์ธ์ค ํฌ์ธํธ ๋ชจ๋(AP)
- ํด๋น ๋ชจ๋๋ก ์ ํ ์, ESP32 ๋ชจ๋์ ๋ฌด์ ๋ผ์ฐํฐ์ ๊ฐ์ ์์ฒด WiFi ๋คํธ์ํฌ ์์ฑ.
- ํด๋ํฐ, ๋ฉํฑ ๋ฐ ๊ธฐํ ESP32 ๋ชจ๋(STA ๋ชจ๋)์ ๊ฐ์ ๋ค๋ฅธ ์คํ ์ด์ ์ด ํด๋น ๋คํธ์ํฌ์ ์ฐ๊ฒฐ ๊ฐ๋ฅ.
- ESP32๋ ์ ์ ์ด๋๋ท์ด ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ์ด AP๋ชจ๋๋ฅผ ์ํํธ AP ๋ชจ๋๋ผ๊ณ ํ๋ฉฐ, AP ๋ชจ๋์์ ESP32๋ฅผ ๊ตฌ์ฑํ๋ ๋์ ๋คํธ์ํฌ์ ๋ํ SSID ๋ฐ ์ํธ๋ฅผ ์ค์ ํด์ผ ๋ค๋ฅธ ์ฅ์น๊ฐ ํด๋น ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ํด๋น ๋คํธ์ํฌ์ ์ฐ๊ฒฐ ๊ฐ๋ฅ.
- ์คํ
์ด์
+ ์ํํธ AP ๋ชจ๋
- ์คํ ์ด์ ๋ชจ๋์ ์ํํธ AP ๋ชจ๋์ ์กฐํฉ.
- ์ฌ๊ธฐ์ ESP32๋ ์คํ ์ด์ ๋ฐ ์์ธ์ค ํฌ์ธํธ ์ญํ ์ ํจ.
- ์คํ
์ด์
๋ชจ๋(STA)
-์ฐธ๊ณ ํ ์ฌ์ดํธ-
#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "SK_WiFiGIGA1AA7"; // WiFi ๋คํธ์ํฌ SSID
const char* password = "2006085191"; // WiFi ๋คํธ์ํฌ ๋น๋ฐ๋ฒํธ
const int ledPin = 21; // LED๊ฐ ์ฐ๊ฒฐ๋ ํ ๋ฒํธ
WebServer server(80); // ์น ์๋ฒ ๊ฐ์ฒด ์์ฑ
void setup() {
pinMode(ledPin, OUTPUT); // LED ํ์ ์ถ๋ ฅ์ผ๋ก ์ค์
digitalWrite(ledPin, LOW); // LED ์ด๊ธฐ ์ํ๋ฅผ OFF๋ก ์ค์
Serial.begin(115200); // ์๋ฆฌ์ผ ํต์ ์ด๊ธฐํ
WiFi.begin(ssid, password); // WiFi ๋คํธ์ํฌ์ ์ฐ๊ฒฐ
while (WiFi.status() != WL_CONNECTED) { // WiFi ์ฐ๊ฒฐ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // ํ ๋น๋ IP ์ฃผ์ ์ถ๋ ฅ
// "/on"๊ณผ "/off"๋ ์๋ฒ ๊ฒฝ๋ก
server.on("/", handleRoot); // ๋ฃจํธ ๊ฒฝ๋ก์ ๋ํ ์์ฒญ ํธ๋ค๋ฌ ๋ฑ๋ก
server.on("/on", handleOn); // "/on" ๊ฒฝ๋ก์ ๋ํ ์์ฒญ ํธ๋ค๋ฌ ๋ฑ๋ก
server.on("/off", handleOff); // "/off" ๊ฒฝ๋ก์ ๋ํ ์์ฒญ ํธ๋ค๋ฌ ๋ฑ๋ก
server.begin(); // ์น ์๋ฒ ์์
Serial.println("Server started");
}
void loop() {
server.handleClient(); // ํด๋ผ์ด์ธํธ ์์ฒญ ์ฒ๋ฆฌ.
// 1. ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ด ๋์ฐฉํ๋ฉด, ํด๋น ์์ฒญ์ ์ฝ๊ณ ํ์ฑ.
// 2. ์์ฒญ๋ ๊ฒฝ๋ก์ ์ผ์นํ๋ ๋ฑ๋ก๋ ๊ฒฝ๋ก ํธ๋ค๋ฌ ํ์.
// 3. ํด๋น ๊ฒฝ๋ก ํธ๋ค๋ฌ ํจ์๋ฅผ ์คํํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ์์ฑ.
// 4. ์์ฑ๋ ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก.
// 5. ํด๋ผ์ด์ธํธ์์ ์ฐ๊ฒฐ์ ๋ซ๊ฑฐ๋ ๋ค์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋๊ธฐ.
}
void handleRoot() {
String html = "<html><body>";
html += "<h1>ESP32 LED Control</h1>";
html += "<p>LED Status: ";
if (digitalRead(ledPin) == HIGH) {
html += "ON";
}
else {
html += "OFF";
}
html += "</p>";
html += "<p><a href='/on'>Turn On</a></p>"; // ํด๋น ๋ฒํผ์ ํด๋ฆญ ์, ํ์ฌ ์ฃผ์์ "/on"์ด ์ถ๊ฐ๋๋ฉด์ LED ๋ถ์ด ์ผ์ง.
html += "<p><a href='/off'>Turn Off</a></p>"; // ํด๋น ๋ฒํผ์ ํด๋ฆญ ์, ํ์ฌ ์ฃผ์์ "/off"์ด ์ถ๊ฐ๋๋ฉด์ LED ๋ถ์ด ๊บผ์ง.
html += "</body></html>";
server.send(200, "text/html", html); // ํด๋ผ์ด์ธํธ์ ์๋ต ์ ์ก, "text/html"๋ HTML ํ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํด.
}
void handleOn() { // /on ๊ฒฝ๋ก๊ฐ ์ฌ์ฉ๋ ์, ์ค์ค๋ก ์๋.
digitalWrite(ledPin, HIGH); // LED๋ฅผ ์ผฌ
// "text/plain"๋ ์ผ๋ฐ ํ
์คํธ ๋ฐ์ดํฐ
server.send(200, "text/plain", "LED turned on"); // ํด๋ผ์ด์ธํธ์ ์๋ต ์ ์ก
}
void handleOff() { // /off ๊ฒฝ๋ก๊ฐ ์ฌ์ฉ๋ ์, ์ค์ค๋ก ์๋.
digitalWrite(ledPin, LOW); // LED๋ฅผ ๋
server.send(200, "text/plain", "LED turned off"); // ํด๋ผ์ด์ธํธ์ ์๋ต ์ ์ก, "200"๋ OK ์ํ๋ฅผ ์๋ฆฌ๋ HTTP ์๋ต.
}
-์ฝ๋ ์์ฑ ํ ์คํํ ๊ฒฐ๊ณผ-
(*์ฃผ์ - ์ด ์ฝ๋์ ์ฃผ์๋ค ์ญ์ Chat GPT๋ฅผ ํตํด ์ฐพ์ ๊ฒ์ด๋ฏ๋ก ํ๋ฆฐ ์ ๋ณด์ผ ๊ฐ๋ฅ์ฑ๋ ์์.)-"Turn On" ๋ฒํผ์ ํด๋ฆญ ์์ ๋ชจ์ต-
-"Turn Off" ๋ฒํผ์ ํด๋ฆญ ์์ ๋ชจ์ต-
- ์๋์ด๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ HTML๋ฅผ ํตํด ๋ง๋ ์น ํ์ด์ง๋ฅผ ๊ตฌํํ ๋ WiFiServer, WebServer, WiFiClient ๊ฐ์ฒด์ ํจ์๋ค(println, print, send((์๋ต ์ํ), "(๋ฐ์ดํฐ ํ์)", "(๋ณด๋ผ ๋ฐ์ดํฐ)"))์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๊ฒ ๋จ.
- ํ๊ทธ์ "href" ์์ฑ์ "/(์๋ฌด ๋ฌธ์ฅ)" ์ด๋ฐ ์์ผ๋ก ์์ฑํ๋ฉด, ํ์ฌ ์ฃผ์์์ "/(์๋ฌด ๋ฌธ์ฅ)" ์ด๋ฐ ์์ผ๋ก ์์ฑ๋ ๊ฒ์ด ์ถ๊ฐ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋จ.
- "WebServer"๋ก ๋ง๋ ๊ฐ์ฒด์ "on()"ํจ์๋ ํด๋น ์ฃผ์๊ฐ ์์ฒญ๋๋ฉด ๋ ๋ค๋ฅธ ํจ์๋ฅผ ๋ฐ์์ํจ๋ค๋ ๊ฒ์ ์๊ฒ ๋จ.
- DHT11๋ก ์ธก์ ํ ์จ์ต๋ ๊ฐ์ ์๋ ค์ฃผ๋ ์๋ฒ๋ฅผ ๋ง๋ค ๋, ํ๊ทธ๋ก ๋ง๋ ์ด๋ฏธ์ง๊ฐ ํ์๊ฐ ์๋ ์ ์ด ์์์ง๋ง, ํ๊ทธ๋ฅผ ์ฌ์ฉํด ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ HTML๋ก ๋ง๋ ์น ํ์ด์ง๋ฅผ ์๋ฒ์์ ์ฌ์ฉํ๊ณ ์ ํ๋ ์ ์์ ์ผ๋ก ์ด๋ฏธ์ง๊ฐ ํ์๋จ.
- LED ๋ฑ์ ์ ๋ฉธ์ํค๋ ์๋ฒ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ ๋, ํ์ ๋ค ๋ง๋ค์์ง๋ง, ๋ง์ ์๋ฒ์ ์ ์ฉ์ํค๋ ค๊ณ ํ๋๊น ์ ๋๋ก ๋ ์ ์ด ์์๋ค. ํ์ง๋ง Chat GPT๋ฅผ ํตํด ์ง๋ฌธ์ ํ๋ ์ ์์ ์ผ๋ก LED ๋ฑ์ ์ ๋ฉธ์ํค๋ ์๋ฒ๊ฐ ๋ง๋ค์ด์ง.
- send(), on() ๋ฑ์ ํจ์์ ์ฌ์ฉ์ฒ๋ฅผ ์ ๋ชฐ๋์ผ๋, GPTํํ ๋ฌผ์ด๋ณด๋ ๊ทธ๋๋ง ์๊ฒ ๋จ.