ARDUINO PROJECTS
STEP BY STEP Ali Bayati, Dec. 2019
Soft Access Point (AP) Mode
ﻫﻨﮕﺎﻣﯽ ﮐﻪ ESP8266در ﻧﻘﺶ ﯾﮏ WiFi Routerﻇﺎﻫﺮ ﺷﻮد و دﯾﮕﺮ ﮐﻼﯾﻨﺖ ﻫﺎ ﺑﻪ آن Joinﮐﻨﻨﺪ،
در ﺣﺎﻟﺖ Access Pointراه اﻧﺪازي ﺷﺪه اﺳﺖ .اﻣﺎ ﺑﺮ ﺧﻼف WiFi Routerﻗﺎدر ﺑﻪ ﺳﺮوﯾﺲ دﻫﯽ ﺑﺎ
ﮐﺎﺑﻞ Ethernetﻧﯿﺴﺖ) .ﻓﻘﻂ (WiFiو ﻧﻬﺎﯾﺘﺎً 5ﮐﻼﯾﻨﺖ را ﻣﯿﺘﻮاﻧﺪ ﭘﺬﯾﺮا ﺑﺎﺷﺪ.
در ﻣﻮد APﻗﺎدر ﺑﻪ ﺗﻨﻈﯿﻢ (Service Set Identifier) SSIDو Passwordﺑﻮده و ﻣﯿﺘﻮاﻧﺪ ﺑﻪ ﺗﻤﺎﻣﯽ
ﮐﻼﯾﻨﺖ ﻫﺎﯾﺶ ،ﺻﻔﺤﺎت وب ارﺳﺎل ﮐﻨﺪ.
روﺷﻦ ﮐﺮدن LEDﺑﺎ اﺳﺘﻔﺎده از ESP8266از ﻃﺮﯾﻖ WiFi
ﺣﺎﻻ ﻧﻮﺑﺖ ﺑﻪ آن رﺳﯿﺪه ﮐﻪ ﺑﺎ ﯾﮏ ﻣﺜﺎل ﺳﺎده ،ﯾﮏ وب ﺳﺮور ﺗﻮﺳﻂ ESP8266اﯾﺠﺎد ﮐﻨﯿﻢ و از ﻃﺮﯾﻖ
WiFiاﻗﺪام ﺑﻪ ﺧﺎﻣﻮش و روﺷﻦ ﮐﺮدن ﭼﻨﺪ LEDﮐﻨﯿﻢ .ﺑﺮاي اﯾﻨﮑﺎر ،ﻣﺎژول را روي ﯾﮏ ﺑﺮدﺑﻮرد ﺑﻪ ﻧﺤﻮي
ﻣﯿﮕﺬارﯾﻢ ﮐﻪ ﻫﺮ ردﯾﻒ از ﭘﯿﻦ ﻫﺎي ﻣﺎژول ،در ﯾﮏ ﻧﯿﻤﮥ ﺑﺮدﺑﻮرد ﺑﺎﺷﺪ )ﭘﺎﯾﻪ ﻫﺎي روﺑﺮوي ﻫﻢ ،اﺗﺼﺎل ﭘﯿﺪا
ﻧﮑﻨﻨﺪ( .ﺑﺮاي ﭘﺎﯾﮥ آﻧﻮد ﻫﺮ LEDﯾﮏ ﻣﻘﺎوﻣﺖ 220Ωﻗﺮار ﻣﯿﺪﻫﯿﻢ.
137
Page
ARDUINO PROJECTS
STEP BY STEP Ali Bayati, Dec. 2019
IDE ﺳﭙﺲ ﮐﺪ ﻧﺴﺒﺘﺎً ﻃﻮﻻﻧﯽ زﯾﺮ را در. ﺑﺎز ﻣﯿﮑﻨﯿﻢTools را از ﻣﻨﻮيSerial Monitor اﺑﺘﺪا ﭘﻨﺠﺮة
. آﭘﻠﻮد ﻣﯿﮑﻨﯿﻢ،ﮐﺎﻣﭙﺎﯾﻞ و ﺑﻪ ﺑﻮرد
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
/* Put your SSID & Password */
const char* ssid = "NodeMCU"; // Enter SSID here
const char* password = "12345678"; //Enter Password here
/* Put IP Address details */
IPAddress local_ip(192, 168, 1, 1);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
ESP8266WebServer server(80);
uint8_t LED1pin = D7;
138
bool LED1status = LOW;
uint8_t LED2pin = D6;
Page
bool LED2status = LOW;
ARDUINO PROJECTS
STEP BY STEP Ali Bayati, Dec. 2019
void setup() {
Serial.begin(115200);
pinMode(LED1pin, OUTPUT);
pinMode(LED2pin, OUTPUT);
WiFi.softAP(ssid, password);
WiFi.softAPConfig(local_ip, gateway, subnet);
delay(100);
server.on("/", handle_OnConnect);
server.on("/led1on", handle_led1on);
server.on("/led1off", handle_led1off);
server.on("/led2on", handle_led2on);
server.on("/led2off", handle_led2off);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
if (LED1status)
{
digitalWrite(LED1pin, HIGH);
}
else
{
digitalWrite(LED1pin, LOW);
}
if (LED2status)
{
digitalWrite(LED2pin, HIGH);
}
else
{
digitalWrite(LED2pin, LOW);
}
}
void handle_OnConnect() {
LED1status = LOW;
LED2status = LOW;
Serial.println("GPIO7 Status: OFF | GPIO6 Status: OFF");
server.send(200, "text/html", SendHTML(LED1status, LED2status));
}
void handle_led1on() {
139
LED1status = HIGH;
Serial.println("GPIO7 Status: ON");
server.send(200, "text/html", SendHTML(true, LED2status));
Page
}
ARDUINO PROJECTS
STEP BY STEP Ali Bayati, Dec. 2019
void handle_led1off() {
LED1status = LOW;
Serial.println("GPIO7 Status: OFF");
server.send(200, "text/html", SendHTML(false, LED2status));
}
void handle_led2on() {
LED2status = HIGH;
Serial.println("GPIO6 Status: ON");
server.send(200, "text/html", SendHTML(LED1status, true));
}
void handle_led2off() {
LED2status = LOW;
Serial.println("GPIO6 Status: OFF");
server.send(200, "text/html", SendHTML(LED1status, false));
}
void handle_NotFound() {
server.send(404, "text/plain", "Not found");
}
String SendHTML(uint8_t led1stat, uint8_t led2stat) {
String ptr = "<!DOCTYPE html> <html>\n";
ptr += "<head><meta name=\"viewport\" content=\"width=device-width, initial-
scale=1.0, user-scalable=no\">\n";
ptr += "<title>LED Control</title>\n";
ptr += "<style>html { font-family: Helvetica; display: inline-block; margin: 0px
auto; text-align: center;}\n";
ptr += "body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3
{color: #444444;margin-bottom: 50px;}\n";
ptr += ".button {display: block;width: 80px;background-color: #1abc9c;border:
none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px
auto 35px;cursor: pointer;border-radius: 4px;}\n";
ptr += ".button-on {background-color: #1abc9c;}\n";
ptr += ".button-on:active {background-color: #16a085;}\n";
ptr += ".button-off {background-color: #34495e;}\n";
ptr += ".button-off:active {background-color: #2c3e50;}\n";
ptr += "p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
ptr += "</style>\n";
ptr += "</head>\n";
ptr += "<body>\n";
ptr += "<h1>ESP8266 Web Server</h1>\n";
ptr += "<h3>Using Access Point(AP) Mode</h3>\n";
if (led1stat)
{
ptr += "<p>LED1 Status: ON</p><a class=\"button button-off\"
href=\"/led1off\">OFF</a>\n";
140
}
else
{
Page
ARDUINO PROJECTS
Ali Bayati, Dec. 2019
STEP BY STEP
"\ptr += "<p>LED1 Status: OFF</p><a class=\"button button-on
;"href=\"/led1on\">ON</a>\n
}
)if (led2stat
{
"\ptr += "<p>LED2 Status: ON</p><a class=\"button button-off
;"href=\"/led2off\">OFF</a>\n
}
else
{
"\ptr += "<p>LED2 Status: OFF</p><a class=\"button button-on
;"href=\"/led2on\">ON</a>\n
}
;"ptr += "</body>\n
;"ptr += "</html>\n
;return ptr
}
ﺑﻌﺪ از آﭘﻠﻮد ﮐﺪ ،ﻣﻮﺑﺎﯾﻞ ﯾﺎ ﺗﺒﻠﺖ ﯾﺎ ﮐﺎﻣﭙﯿﻮﺗﺮ را ﺑﻪ WiFi
ﺑﻮﺟﻮد آﻣﺪه ﺑﻪ ﻧﺎم NodeMCUﻣﺘﺼﻞ ﮐﺮده و ﻋﺪد
12345678را ﺑﻌﻨﻮان Passwordوارد ﻣﯿﮑﻨﯿﻢ.
ﺳﭙﺲ در ﯾﮏ Web Browserﻣﺜﻞ Safari,
Firefox, Googleدر ﻗﺴﻤﺖ ﺑﺎﻻ ،آدرس IPﺑﻮرد را
192.168.1.1وارد ﻣﯿﮑﻨﯿﻢ .ﺑﺎ ارﺳﺎل آدرس ،ﺻﻔﺤﮥ
روﺑﺮو در Browserﺑﻪ ﻧﻤﺎﯾﺶ در ﻣﯿﺎﯾﺪ .ﺑﺎ ﮐﻠﯿﮏ روي
ﻫﺮ ﮐﺪام از دﮐﻤﻪ ﻫﺎي ﻧﻤﺎﯾﺶ داده ﺷﺪه LED ،ﻣﺘﻨﺎﻇﺮ ﺑﺎ
آن دﮐﻤﻪ ،روﺷﻦ ﺷﺪه و ﺑﺎ ﮐﻠﯿﮏ ﻣﺠﺪد ﺑﺮ روي آن،
ﺧﺎﻣﻮش ﺧﻮاﻫﺪ ﺷﺪ .اﮔﺮ دﻗﺖ ﮐﻨﯿﺪ ،ﺑﺎ ﻫﺮ ﺑﺎر ﮐﻠﯿﮏ ﮐﺮدن
روي دﮐﻤﻪ ،ﺻﻔﺤﻪ Refreshﻣﯿﺸﻮد و ﺻﻔﺤﮥ ﺟﺪﯾﺪي
ﺑﺎر ﮔﺬاري ﻣﯿﺸﻮد.
141
Page
ARDUINO PROJECTS
STEP BY STEP Ali Bayati, Dec. 2019
در ﺑﺮﻧﺎﻣﮥ ﻓﻮق ،ﺗﻌﺪادي ﺗﺎﺑﻊ ﺗﻌﺮﯾﻒ ﮐﺮده اﯾﻢ .ﻣﻬﻤﺘﺮﯾﻦ آﻧﻬﺎ ﺗﺎﺑﻊ SendHTMLاﺳﺖ ﮐﻪ وﻇﯿﻔﮥ
ﺳﺎﺧﺖ ﯾﮏ رﺷﺘﮥ ﺑﻠﻨﺪ را دارد ﮐﻪ ﺑﻮﺳﯿﻠﮥ آن رﺷﺘﻪ ﯾﺎ ،Stringﯾﮏ ﺻﻔﺤﮥ وب ﺧﺎص ،ﻣﺘﻨﺎﻇﺮ ﺑﺎ وﺿﻌﯿﺖ LED
ﻫﺎ ﺳﺎﺧﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ .ﺑﻪ اﯾﻦ ﺗﺎﺑﻊ ،دو ورودي )وﺿﻌﯿﺖ ﺧﺎﻣﻮش/روﺷﻦ LEDﻫﺎ( را ﺑﺎﯾﺪ ﺑﺪﻫﯿﻢ .ﺑﺮ ﺣﺴﺐ اﯾﻨﮑﻪ
ﮐﺪام LEDﺑﺎﯾﺪ ﺧﺎﻣﻮش ﯾﺎ روﺷﻦ ﺑﺸﻮد ،اﯾﻦ ﺗﺎﺑﻊ اﻗﺪام ﺑﻪ اﯾﺠﺎد ﯾﮏ رﺷﺘﮥ ﺑﻠﻨﺪ )ﺑﻪ ﻧﺎم (ptrﻣﯿﮑﻨﺪ و آن را
ﺑﻌﻨﻮان ﺧﺮوﺟﯽ ﺗﺎﺑﻊ ،ﺑﺎز ﻣﯿﮕﺮداﻧﺪ .ﻣﺤﺘﻮﯾﺎت اﯾﻦ رﺷﺘﻪ ،ﮐﺪﻫﺎي HTMLاﺳﺖ ﮐﻪ Browserﺷﻤﺎ ﺑﺎ ﺗﻔﺴﯿﺮ
آن رﺷﺘﻪ ،اﻗﺪام ﺑﻪ ﻧﻤﺎﯾﺶ ﯾﮏ ﺻﻔﺤﮥ وب ﺧﻮاﻫﺪ ﮐﺮد .در اﯾﻦ رﺷﺘﻪ ،ﺗﻤﺎﻣﯽ ﺟﺰﺋﯿﺎت ﺻﻔﺤﮥ وب ،از ﻗﺒﯿﻞ ﻋﻨﻮان،
ﻣﺘﻮن ،دﮐﻤﻪ ﻫﺎ و ...ﺑﺎ ﺗﻤﺎﻣﯽ ﻣﺸﺨﺼﺎت آﻧﻬﺎ ،ﺷﺎﻣﻞ ﻧﻮع ﻓﻮﻧﺖ ،ﺳﺎﯾﺰ ،رﻧﮓ ،ﻣﻮﻗﻌﯿﺖ ﻗﺮارﮔﯿﺮي در ﺻﻔﺤﮥ وب،
و ﭘﺎراﻣﺘﺮﻫﺎي دﯾﮕﺮ ،ﺗﻨﻈﯿﻢ ﻣﯿﺸﻮد .ﻻزﻣﮥ ﯾﺎدﮔﯿﺮي HTMLﮔﺬراﻧﺪن دوره ،ﻣﺸﺎﻫﺪة آﻣﻮزش وﯾﺪﺋﻮﯾﯽ ﯾﺎ ﻣﻄﺎﻟﻌﮥ
ﮐﺘﺎب آﻣﻮزﺷﯽ ﺑﻮده و آﻣﻮزش آن ،ﺑﻌﻠﺖ ﮔﺴﺘﺮدﮔﯽ و ﺣﺠﻢ ﺑﺎﻻي ﻣﻄﺎﻟﺐ ،از ﭼﻬﺎرﭼﻮب اﯾﻦ ﺟﺰوه ﺧﺎرج اﺳﺖ.
ﺑﺮاي آﺷﻨﺎﯾﯽ ﺑﺎ ﮐﺪﻫﺎي HTMLﻣﯿﺘﻮاﻧﯿﺪ ﺑﻪ ﻟﯿﻨﮏ زﯾﺮ رﺟﻮع ﮐﻨﯿﺪ.
https://www.w3schools.com/html/html_intro.asp
در ﻣﺠﻤﻮع 4 ،ﺣﺎﻟﺖ ﺑﺮاي دو LEDوﺟﻮد دارد ﮐﻪ ﺑﺮاي ﻫﺮ ﯾﮏ از آﻧﻬﺎ ،ﯾﮏ ﺻﻔﺤﮥ وب )ﺗﺼﺎوﯾﺮ زﯾﺮ(
ﻧﺘﯿﺠﻪ ﺧﻮاﻫﺪ ﺷﺪ .وﻇﯿﻔﮥ ﺗﻮﻟﯿﺪ اﯾﻦ ﺻﻔﺤﺎت ،ﺑﺮ ﻋﻬﺪة ﺗﺎﺑﻊ SendHTMLاﺳﺖ.
142
Page