บทความนี้แนะนำโมดูล esp8266 ชื่อ ESP-01s ที่มีขาให้เชื่อมต่อ 8 ขา โดยอธิบายหน้าที่ของแต่ละขา การขยายวงจรเพื่อโปรแกรมชิพ (ตัวอย่างดังภาพที่ 1) การทำให้ชิพทำงาน และรวมถึงตัวอย่างการเขียนโปรแกรมเพื่อใช้งานโมดูลนี้ด้วย Arduino เพื่อให้เห็นภาพรวมในการพัฒนระบบซึ่งเป็นระบบที่ราคาน่ารักน่าสนใจระบบหนึ่ง
คุณสมบัติ
โมดูล ESP-01 และ ESP-01s เป็นโมดูลขนาดเล็กดังภาพที่ 2 และ 3 ที่ถูกออกแบบมาเพื่อเน้นการเชื่อมต่อระบบเครือข่ายไร้สายให้กับไมโครคอนโทรลเลอร์ตัวอื่น ๆ ผ่านทาง RS232 ด้วยชุดคำสั่ง AT โดยเชื่อมต่อสาย RX/TX/CH_PD/Vcc และ GND เพื่อใช้งาน แต่สามารถเขียนโปรแกรมลงชิพ ESP8266 ได้ด้วยการกำหนดให้ขา GPIO0 เป็น GND ในตอนบูตระบบ ทำให้โมดูลนี้ทำงานได้หลากหลายมากขึ้น
คุณสมบัติของ ESP-01 และ ESP-01s เป็นดังนี้
- หน่วยประมวลผล Tensilica L106 เป็นหน่วยประมวลผลแบบ 32 บิต
- ความถี่สัญญาณนาฬิกา 160MHz
- SRAM สำหรับใช้งานน้อยกว่า 50KB เพราะต้องใช้ร่วมกับบัฟเฟอร์ของการสื่อสาร
- ROM ของ ESP-01 มีขนาด 512KB และ ESP-01s มีขนาด 1MB
- แรงดันไฟฟ้าในการทำงาน 2.5V ถึง 3.6v
- อุณหภูมิ -40 ถึง 125 องศาเซลเซียส
- ความต้องการของกระแสในการทำงานปกติประมาณ 80mA
- ความต้องการกระแสในโหมดประหยัดพลังงาน (Sleep Mode) 20uA
- รองรับมาตรฐาน IEEE 802.11 b/g/n
- รองรับ WPA/WPA2
- รองรับการเข้ารหัส WEP/TKIP และ AES
- รองรับโพรโทคอล IPv4, TCP/UDP/HTTP
- ขาเชื่อมต่อ
- RX
- TX
- GPIO0
- GPIO2
ผังฟังก์ชันงานของ ESP8266 เป็นดังภาพที่ 4
ออกแบบการใช้งาน
จากขา 8 ขาของโมดูล ESP-01/ESP-01s ในภาพที่ 5 จะพบว่า โมดูลรองรับ GPIO จำนวน 2 ขา คือ 2 และ 0 โดย
- GPIO 0 ใช้สำหรับตั้งค่าการทำงานตอนระบบเริ่มทำงาน คือ ถ้ามีสถานะเป็น GND หมายถึงเข้าโหมดโปรแกรมชิพ และถ้าเป็น 1 หมายถึงทำงานปกติ
- GPIO 2 ถูกเชื่อมต่อกับวงจรแอลอีดีบนโมดูลสำหรับใช้แสดงสถานะการทำงาน
จากขา TX และ RX ใช้สำหรับเชื่อมต่อกับโมดูลสื่อสารอนุกรมโดยต่อการเชื่อมต่อดังภาพที่ 6
การทำวงจรรองรับการเลือกโหมดทำงานของ ESP-01/ESP-01s ทำได้ดังภาพที่ 7 ซึ่งในสภาวะปกติเมื่อไม่กด SW1 จะทำให้ขา GPIO0 มีสถานะเป้น 1 จึงทำงานในโหมดทำงานปกติ แต่ถ้า SW1 ถูกกดทำให้ขา GPIO0 มีสถานะเป็น 0 และเมื่อเริ่มระบบใหม่โดยขานี้เป็น 0 จะเข้าโหมดโปรแกรมชิพ ESP8266
ขา RST ของโมดูล ESP-01/ESP-01s ออกแบบเพื่อให้ผู้ใช้สามารถสั่งรีเซ็ต (Reset) การทำงานของโมดูลเผื่อกรณีที่ระบบค้างหรือล้มเหลว ซึ่งวงจรสำหรับทำการรีเซ็ตด้วย SW2 เป็นดังภาพที่ 8
ขา CH_PD เป็นขา En ของโมดูลใช้สำหรับสั่งให้โมดูลถูกเปิดการทำงานหรือหยุดการทำงาน โดยปกติต่อเข้ากับ Vcc เพื่อให้ทำงานดังภาพที่ 9
ภาคแอลอีดีบนโมดูล ESP-01/ESP-01s ต่อเข้ากับขา GPIO2 ดังภาพที่ 10 ซึ่งจะพบว่า การสั่งให้หลอดติดจะต้องส่งสัญญาณ 0 ไปเพื่อให้ครบวงจร และสั่งให้ดับด้วยการส่ง 1
จากภาควงจรที่ต่อเพิ่มจะพบว่ามีความซับซ้อนน้อยสามารถนำไปใช้งานได้สะดวก ขั้นตอนต่อไปมาทดลองเขียนโปรแกรมกัน
เขียนโปรแกรม
การตั้งค่า ESP-01s ให้เลือกใช้ Board เป็น Generic ESP8266 Module โดยคั้ง CPU Frequency เป็น 160MHz หรือต้องการลดทอนลงเป็น 80MHz ได้เช่นกันเพื่อประหยัดพลังงาน และไม่ได้ประมวลผลสูง ที่สำคัญของการตั้งค่าคือ Flash Size ให้เลือกเป็น 1MB (FS:64KB OTA:~470KB) ดังภาพที่ 11
ตัวอย่างโปรแกรมควบคุมแอลอีดีที่ขา GPIO02 เป็นดังนี้ ส่วนโปรแกรมอื่น ๆ ดูได้จากตัวอย่างของการใช้คลาสด้าน WiFi ในบทความก่อนหน้านี้
#define ledPin 2
void setup() {
pinMode( ledPin, OUTPUT );
}
void loop() {
digitalWrite( ledPin, HIGH );
delay(1000);
digitalWrite( ledPin, LOW );
delay(1000);
}
เพื่อความสะดวกและประหยัดของระบบพัฒนา ทางทีมงานเราเลือกทำบอร์ดสำหรับโปรแกรมชิพดังภาพที่ 12 และบอร์ดสำหรับนำโมดูลไปใช้งานดังภาพที่ 13 เพราะโดยปกติมักไม่ได้ใช้ภาค UART ในการใช้งาน แต่เน้นการทำหน้าที่เป็น AP หรือ Server จึงสามารถรายงานผลทางเว็บซึ่งสามารถดูได้จากเว็บบราวเซอร์
ตัวอย่างต่อไปเป็นการใช้ DHT11 เป็นตัววัดอุณหภูมิและความชื้นโดยเชื่อมต่อกับ ESP-01s ผ่านทาง GPIO2 และรายงานผลผ่านทางเว็บบราวเซอร์แบบเป็น SoftAP ซึ่งตัวอย่างผลลัพธ์เป็นดังภาพที่ 14
#include <DHT.h>
#include <ESP8266WiFi.h>
#define AP_NAME "ชื่อapที่ต้องการ"
#define AP_PASSWD "รหัสที่ต้องการตั้ง"
IPAddress myIP(192, 168, 4, 1);
IPAddress gwIP(192, 168, 4, 10);
IPAddress subnet(255, 255, 255, 0);
DHT dht = DHT(2, DHT11);
WiFiServer server(80);
float minC = 100.0f, maxC = 0.0f; // อุณหภูมิต่ำสุด/สูงสุด
float minH = 100.0f, maxH = 0.0f; // ความชื้นต่ำสุด/สูงสุด
float hic; // headt index ในหน่วย C
float hif;// headt index ในหน่วย F
float h; // ค่าความชื้น
float tc; // ค่าอุณหภูมิในหน่วย C
float tf; // ค่าอุณหภูมิในหน่วย F
void getDHT11() {
h = dht.readHumidity();
tc = dht.readTemperature();
tf = dht.readTemperature(true);
if (isnan(h) || isnan(tc) || isnan(tf)) {
h = -1.0f;
tc = -1.0f;
tf = -1.0f;
hic = -1.0f;
hif = -1.0f;
return;
}
hic = dht.computeHeatIndex(tc, h, false);
hif = dht.computeHeatIndex(tf, h);
if (minC > tc) {
minC = tc;
}
if (maxC < tc) {
maxC = tc;
}
if (minH > h) {
minH = h;
}
if (maxH < h) {
maxH = h;
}
}
void setup() {
Serial.begin(115200);
Serial.println("\n\n\n");
dht.begin();
if (WiFi.softAPConfig( myIP, gwIP, subnet )) {
if (WiFi.softAP(AP_NAME, AP_PASSWD, 8, false, 5)) {
Serial.print("IP Address : ");
Serial.println(WiFi.softAPIP());
} else {
Serial.println("softAP() failed!!");
while (true);
}
} else {
Serial.println("softAPConfig() failed!");
while (true);
}
server.begin();
}
String htmlPage() {
String html;
getDHT11();
html.reserve(2048); // prevent ram fragmentation
html = F("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: 5\r\n" // refresh the page automatically every 5 sec
"\r\n"
"<!DOCTYPE HTML>"
"<html><head></head><body>"
"<h1>DHT11</h1>");
html += F("<div>Temperature:");
html += tc;
html += F("C/");
html += tf;
html += F("F</div>");
html += F("<div>Huminity:");
html += h;
html += F("%</div>");
html += F("<div>Temperature:");
html += minC;
html += F("C-");
html += maxC;
html += F("C</div>");
html += F("<div>Huminity:");
html += minH;
html += F("%-");
html += maxH;
html += F("%</div>");
html += F("</body></html>\r\n");
return html;
}
void loop() {
WiFiClient client = server.available();
if (client) {
Serial.println("\n[Client connected]");
while (client.connected()) {
if (client.available()) {
String req = client.readStringUntil('\r');
Serial.print(req);
if (req.indexOf("GET / HTTP/1.1")) {
client.println(htmlPage());
break;
}
}
}
while (client.available()) {
client.read();
}
client.stop();
Serial.println("[Client disconnected]");
}
}
และเมื่อทางทีมงานเราได้ทดสอบรันการหาค่าจำนวนเฉพาะจากตัวเลข 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, .., 19500, 20000 พบว่า ความเร็วเท่ากับบอร์ด NodeMCU ทั่วไป ดังภาพที่ 15
สรุป
จากบทความนี้จะพบว่าไมโครคอนโทรลเลอร์ esp8266 เมื่อถูกย่อส่วนเพื่อเน้นให้เป็นตัวเชื่อมต่อระบบเครือข่ายไร้สายหรือโมดูล ESP-01 หรือ ESP-01s นั้น เป็นระบบที่มีราคไม่แพง และทำงานได้ด้วยความเร็วที่เหมือนกับบอร์ด ESP8266 ทั่วไป แต่มี GPIO ให้ใช้จำกัดกว่า ดังนั้น การเลือกใช้จึงขึ้นอยู่กับระบบและความจำเป็นใช้ สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ
แหล่งอ้างอิง
- ESPRESSIF : ESP8266 Series of Modules
- ESPRESSIF : ESP8266EX DataSheet
(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-08-08, 2021-11-06