๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์‹œ์Šคํ…œ๊ฐœ๋ฐœ/์•„๋‘์ด๋…ธ&๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด

nodeMCU ์™€์ดํŒŒ์ด ์Šค์บ”ํ•ด์„œ AP์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•Œ์•„์˜ค๊ธฐ

by ์ด๋…ธํ‚ค_ 2019. 5. 24.

์ฐฝํ‹€์— ์•‰์€ ์–‘๊ฐฑ์ด

nodeMCU๋Š” ESP8266 ๋ชจ๋“ˆ์ด๋ผ WiFi์— ์ ‘์†๋„ ๊ฐ€๋Šฅํ•˜๊ณ (Station mode), ์Šค์Šค๋กœ๊ฐ€ WiFi๋ฅผ ํ„ฐ๋œจ๋ฆด ์ˆ˜๋„(Soft AP mode) ์žˆ๋‹ค. 

 

๋ชฉํ‘œ ๊ธฐ๋Šฅ

(1) ์™€์ดํŒŒ์ด ์Šค์บ”์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

(2) ์Šค์บ”ํ•œ ์™€์ดํŒŒ์ด ๋ชฉ๋ก ์ค‘์—์„œ ์™€์ดํŒŒ์ด๋ฅผ ์„ ํƒํ•œ ํ›„, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

(3) ์•„๋‘์ด๋…ธ IDE, ์ฆ‰ sktech์—์„œ ์„ ํƒํ•œ ์™€์ดํŒŒ์ด์˜ ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Step1. ์™€์ดํŒŒ์ด ์Šค์บ”ํ•˜๊ธฐ.

(1) ๊ด€๋ จ ํ—ค๋”ํŒŒ์ผ ์ถ”๊ฐ€

#include "ESP8266WiFi.h"
#include <ESP8266WebServer.h>

(2) ์Šค์บ” ๊ธฐ๋Šฅ ์ถ”๊ฐ€

void scanWiFiList()
{
  int numberOfNetworks = WiFi.scanNetworks();
 
  for(int i =0; i<numberOfNetworks; i++){
      Serial.println(WiFi.SSID(i));
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  scanWiFiList();

}

void loop() {
  // put your main code here, to run repeatedly:

}

<์ถœ๋ ฅ๊ฒฐ๊ณผ>

 

 

 

 

 

 

 

 

 

 

 

๊ทผ์ฒ˜์—์„œ ์žกํžˆ๋Š” ๋ชจ๋“  ์™€์ดํŒŒ์ด๊ฐ€ ๊ฒ€์ƒ‰๋˜์–ด์„œ ์ถœ๋ ฅ์ด ๋˜๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋ชฉํ‘œ๊ธฐ๋Šฅ (1) ํด๋ฆฌ์–ด.

 

Step2. ์›นํŽ˜์ด์ง€ ๋„์šฐ๊ธฐ.

ํ˜„์žฌ ์•„๋‘์ด๋…ธ์—์„œ๋งŒ ์ถœ๋ ฅ ๋˜์—ˆ์„ ๋ฟ, ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. 

๋”ฐ๋ผ์„œ ์›นํŽ˜์ด์ง€๋ฅผ ๋„์›Œ AP๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•œ๋‹ค. 

(1) softAP ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ssid์™€ ํŒจ์Šค์›Œ๋“œ ์ •ํ•˜๊ธฐ

#define WIFI_MAX_SIZE 30 //์ตœ๋Œ€ 30๊ฐœ์˜ AP ๋ชฉ๋ก๋งŒ ๋ฐ›์•„์˜จ๋‹ค. 
const char* ssid = "KWE_Solution";
const char* password = "12345678";

(2) ์„œ๋ฒ„ ๋ฐ AP ๋ชฉ๋ก์„ ๋‹ด์„ ๋ฐฐ์—ด ์„ ์–ธ

ESP8266WebServer server(80);
String wifiList[WIFI_MAX_SIZE];

(3) Soft AP ๋ชจ๋“œ ์‹คํ–‰

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  scanWiFiList();

  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");
}

void loop() { 
    server.handleClient();
}
  

(4) scanWifiList ํ•จ์ˆ˜ ๋ณ€๊ฒฝ

void scanWiFiList()
{
  int numberOfNetworks = WiFi.scanNetworks();
 
  for(int i =0; i<numberOfNetworks; i++){
      wifiList[i] = WiFi.SSID(i);
  }
}

(5) ์›นํŽ˜์ด์ง€ ๋„์šฐ๊ธฐ

void handleRoot()
{
  server.send(200, "text/html", prepareSelectWifiListPage());
}

String prepareSelectWifiListPage(){
  
  String strList ="<ul>";
  for(int i =0; i< WIFI_MAX_SIZE; i++){
      if(wifiList[i] != "")
      {
       strList += "<li><a name='" + wifiList[i] + "' onclick='select(this.name)'>" + wifiList[i] + "</a> </li>";
      }
  }
  strList += "</ul>";
  String apName = "";
  String apPw = "";
  
  String htmlPage =
     String("<!DOCTYPE HTML>") +
            "<html> <head>" +
            "<meta http-equiv=\"Content-Type\" Content=\"text/html; charset=utf-8\">\r\n" +
            "<meta name='viewport' content='width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no'>\r\n" + 
            "<title>WIFI ๋ชฉ๋ก</title>\r\n"+
            "<style>\r\n"+
            ".a:hover{cursor:pointer;}\r\n"+
            "</style></head>\r\n"+
            "<body>\r\n"+
            "<h1>WiFi List</h1>\r\n"+
            "์ธ์ฆ๊ฐ€๋Šฅํ•œ WiFi๋ฅผ ์„ ํƒํ•˜์„ธ์š”. <br>\r\n"+
            "<div id='wifiList'>"+ strList + "</div>\r\n"
            "<div id='selected'></div>\r\n"
            "<div id='_pw'>\r\n"+
            "<form method='get' action='/action_page'>\r\n"+
            "<input type='text' id='ap' name='apName'> ์„ ์„ ํƒํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. <br>\r\n"+
            "<input type='password' id='pw' name='apPw'> <input type='submit' value='connect'>\r\n"+
            "</form>\r\n"+
            "</div>\r\n"+
            "</body>\r\n"+
            "<script>\r\n"+
            "document.getElementById('_pw').style.visibility = 'hidden';\r\n"+
            "function select(apName){\r\n"+
            "document.getElementById('ap').value = apName;\r\n"+
            "document.getElementById('_pw').style.visibility = 'visible';\r\n"+
            "document.getElementById('pw').value = ''}\r\n"+
            "function connection(){ \r\n"+
            "var pw = document.getElementById('pw').value;\r\n"+
            "} \r\n"+ 
            "</script> \r\n"+
            "</html> \r\n";
  return htmlPage;
}

<์ถœ๋ ฅ๊ฒฐ๊ณผ>

์™€์ดํŒŒ์ด์— ๋‚ด๊ฐ€ ์„ค์ •ํ•œ ssid๊ฐ€ ์ ํ˜€์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ssid๋ฅผ ์„ ํƒํ•œํ›„, ๋‚ด๊ฐ€ ์„ค์ •ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ ‘์†ํ•œ๋‹ค.

 

์•„๋‘์ด๋…ธ ํ™”๋ฉด

 

 

 

 

 

 

 

์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„๋‘์ด๋…ธ์— ์ ํžŒ 192.168.4.1 ๋กœ ์ ‘์†ํ•œ๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

์œ„ ๋ชฉ๋ก์—์„œ wifi๋ฅผ ์„ ํƒํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์ฐฝ์ด ๋œฌ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

Step3. AP์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•„๋‘์ด๋…ธ์—์„œ ๋ฐ›๊ธฐ. 

์ด ๋ถ€๋ถ„์€ html์— ๋Œ€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•˜๋‹ค. 

form ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ๊ฒƒ์ด๋‹ค. 

(1) ์„œ๋ฒ„ ์‹œ์ž‘์‹œ์— form ํƒœ๊ทธ๋ฅผ ์ˆ˜์‹ ํ•  ์ฃผ์†Œ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค. 

void setup(){
	server.on("/action_page", handleForm); //action_page์— ์ ‘์†ํ•˜๋ฉด handleForm ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
}

(2) handleForm ํ•จ์ˆ˜ ์ถ”๊ฐ€

void handleForm() {
 String apName = server.arg("apName"); 
 String apPw = server.arg("apPw"); 

 Serial.print("apName:");
 Serial.println(apName);

 Serial.print("apPw:");
 Serial.println(apPw);
 
 String s = "<a href='/'> Go Back </a>";
 server.send(200, "text/html", s); //Send web page
}

(3) prepareSelectWifiListPage() ํ•จ์ˆ˜ ํ™•์ธ

์ด ๋ถ€๋ถ„์—์„œ ์„ ํƒํ•œ AP๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๋ถ€๋ถ„๊ณผ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ๋ถ€๋ถ„์€ form ํƒœ๊ทธ๋กœ ๋ฌถ์—ฌ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ connect๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด formํƒœ๊ทธ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด /action_page ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋ฉด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

"<form method='get' action='/action_page'>\r\n"+
  "<input type='text' id='ap' name='apName'> ์„ ์„ ํƒํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. <br>\r\n"+
  "<input type='password' id='pw' name='apPw'> <input type='submit' value='connect'>\r\n"+
"</form>\r\n"+

<์ถœ๋ ฅํ™”๋ฉด>

WiFi ๋ฆฌ์ŠคํŠธ ์กฐํšŒ.

WiFi ์„ ํƒ. ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅํ›„, connect ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ action_page๋กœ ๋„˜์–ด๊ฐ€๋ฉด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋œ๋‹ค.

์›น๋ธŒ๋ผ์šฐ์ €์— ์ฃผ์†Œ์ฐฝ์„ ๋ณด๋ฉด apName=smartfarm, apPw=1234567 ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

์•„๋‘์ด๋…ธ ์Šค์ผ€์น˜ ํ™”๋ฉด

 

 

 

 

 

 

 

handleForm ํ•จ์ˆ˜์—์„œ ์ธ์ž๊ฐ’์œผ๋กœ ๋“ค์–ด์˜จ apName, apPw๊ฐ’์ด ํ™•์ธ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

 

<๋˜ ํ•ด์•ผํ•  ๊ฒƒ>

์ด apName, apPW ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋‹ค์‹œ STA ๋ชจ๋“œ๋กœ ์„œ๋ฒ„๋ฅผ ๋ฐ”๋กœ ์—ด์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ด์•ผํ•  ๊ฒƒ.

 

์ฐธ๊ณ ์ž๋ฃŒ

https://circuits4you.com/2019/03/20/esp8266-receive-post-get-request-data-from-website/

 

ESP8266 Node MCU Handling HTML web forms data | Circuits4you.com

In this tutorial we are getting data from web browser using HTML forms. ESP8266 is configured as server. When user clicks on button or text box data that we want to read it in ESP8266 (NodeMCU).

circuits4you.com

 

๋Œ“๊ธ€