เขียนโปรแกรมควบคุม ESP8266 ด้วย Arduino IDE

ESP8266 ESP-01

สวัสดีครับ ช่วงนี้ผมกำลังกลับมาพยายามเล่นกับ ESP8266 แต่เหมือนมันจะไม่ค่อยอยากเล่นกับผมซักเท่าไหร่ ก่อนหน้านี้ผมลองเฟิร์มแวร์ NodeMCU ปรากฏว่าไม่เวิคครับ ในขณะที่กำลังถอดใจอยู่นั้น สวรรค์ก็มาโปรด มีคนโพสข่าวว่าสามารถใช้ Arduino IDE เขียนโปรแกรมลง ESP8266 ไปตรงๆได้แล้ว และแล้ววันนี้ ESP8266 EPS-01 ก็เดินทางมาถึง และได้ทดลองทันที ผลคือสุดยอดมาก ไม่พบอุปสรรคใดๆในการสั่งใหม่มันทำงานเลย เลยคิดว่านี่ละ เวิคที่สุดแล้วในการใช้ ESP8266 ทำงานแบบเพียวๆ

ESP8266 คืออะไร ?

เดาว่ามีบางท่านที่ไม่ทราบว่า ESP8266 มันคืออะไร ผมกำลังพูดถึงอะไร ? ผมขอสรุปให้เข้าใจง่ายๆดังนี้

  • เป็นโมดูลเชื่อมต่อ WiFi ที่มีขนาดเล็กราคาถูกแบบที่ไม่เคยมีมาก่อน
  • มีเฟิร์มแวร์ที่มาจากโรงงาน จะเป็น AT Command (สามารถอ่านรายละเอียดได้ใน Arduino + ESP8266 กับการควบคุมหลอดไฟผ่านระบบอินทราเน็ต)
  • สามารถอัพเดท แก้ไข หรือสร้างเฟิร์มแวร์ขึ้นมาเพื่อใช้งานได้
  • สามารถซื้อหาได้ง่าย ในแต่ละเว็บจะมีราคาแตกต่างกันไป ราคาที่ผมซื้อล่าสุดเมื่อวันอาทิตย์ที่ผ่านมา (29/03/58) ราคาอยู่ที่ 110 – 120 บาท
  • มีรุ่นย่อยๆลงไปอีก โดยแต่ละรุ่นจะมีจำนวนขา เสาอากาศ และขนาดที่แตกต่างกัน (ในรูปหัวข้อคือรุ่น ESP-01 หากเป็นรุ่นอื่นๆ จะมีจำนวนขาใช้งานมากกว่านี้)

สำหรับรายละเอียดเพิ่มเติม สามารถอ่านได้ที่ : ESP8266 – NURDspace

ทำไมจึงต้องเขียนโปรแกรมลง ESP8266 ไปตรงๆ

อย่างที่ทราบว่า ESP8266 เป็นโมดูล WiFi ที่นอกจากราคาถูกแล้ว มันยังมาพร้อมคุณสมบัติที่เหลือเชื่อหลายประการด้วยกัน ไม่ว่าจะเป็นรอมภายในนั้นมีขนาดใหญ่กว่าไมโครคอนโทรเลอร์บางตัว มี ADC รองรับการติดต่อหลายหลายโปรโตคอล ไม่ว่าจะเป็น Serial I2C SPI อีกทั้งโมดูลมีขนาดที่เล็กมากๆ กินไฟน้อย ใช้แรงดันต่ำ (แต่ข้อเสียของการใช้แรงดันต่ำ คือหากไม่จัดระบบกระแสไฟให้สมดูลกันทั้งระบบ จะทำให้โมดูลเสียได้ง่าย) ทำให้ทั่วทุกคนบนโลกใบนี้พยายามอย่างมากที่จะเขียนโปรแกรมสั่งงานลงไปตรงๆ ซึ่งจะทำให้วงจรมีขนาดเล็ก และกินไฟได้น้อยลงมาก ลดความยุ่งยากของวงจรลงไป

เตรียมทุกอย่างให้พร้อม

  • ESP8266 รุ่นใดก็ได้ (ขอแค่ยังสามารถใช้งานได้ก็พอ)
  • Arduino IDE for ESP8266 สามารถดาว์โหลดเวอร์ชั่นล่าสุดได้ที่ : esp8266/Arduino
  • USB TTL to UART หรือบอร์ด Arduino ก็ได้
  • อื่นๆ เช่น หลอด LED ตัวต้านทาน etc.

ต่อวงจร เตรียมพร้อมเขียนโปรแกรม

ต่อ Tx ของโมดูลเข้ากับ Rx ของบอร์ดแปลง ต่อ Rx ของโมดูลเข้ากับ Tx ของบอร์ดแปลง ต่อขา PD_CH เข้ากับขั้วบวก ต่อ GPIO0 ลงกราว์ดเพื่อเข้าโหมดโปรแกรม

การใช้งาน Arduino IDE เขียนโปรแกรมลง ESP8266

ขั้นตอนแรกเลย เปิดโปรแกรม Arduion IDE ขึ้นมา แนะนำให้ใช้เวอร์ชั้น 1.6.4 หรือสูงกว่า ซึ่งในบทความนี้ก็จะแสดงวิธีการติดตั้งโดยใช้เวอร์ชั้นนี้ครับ

กดที่เมนู File > Perferences

ในช่อง Additional Board Manager URLs กรอก http://arduino.esp8266.com/stable/package_esp8266com_index.json ลงไป แล้วกดปุ่ม OK

กดไปที่เมนู Tool > Board > Boards Manager…

รอโปรแกรมอัพเดทข้อมูลจากลิ้งที่ได้กรอกไว้ซักครู่ เมื่อเสร็จแล้วเลื่อนสกอร์บาร์ลงมาด้านล่าง แล้วกดตรง esp8266 กดปุ่ม Install ที่แสดงขึ้นมา จากนั้นรอโปรแกรมโหลดไลบารี่ และข้อมูลบอร์ดเข้ามาในโปรแกรม

เมื่อติดตั้งเสร็จแล้ว จะมีคำว่า INSTALLED เพิ่มขึ้นมาดังรูป เป็นอันจบการติดตั้ง สามารถกดปิดหน้าต่างไปได้เลย

เลือกบอร์ดให้ถูกต้อง (หากใช้เป็นโมดูล ESP8266 เลือก Generic ESP8266 Module)

เลือก COM Port ให้ถูกต้อง

อันนี้ผมก๊อบตัวอย่างมาแก้ เพื่อใช้ควบคุมหลอด LED ผ่านอินทราเน็ต ก๊อบ – วางลงไปได้เลย

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

const char* ssid = "Max Home 2";
const char* password = "987654321";

const char* html = "<h1>GPIO2 Control</h1><button onClick=\"window.location='/status/1';\">ON</button>  <button onClick=\"window.location='/status/0';\">OFF</button>";

ESP8266WebServer server(80);

const int led = 2;

void setup(void) {
 Serial.begin(115200);
 pinMode(led, OUTPUT);

 // Connect to WiFi network
 WiFi.begin(ssid, password);
 Serial.println("");

 // Wait for connection
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }
 Serial.println("");
 Serial.print("Connected to ");
 Serial.println(ssid);
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());

 server.on("/", [](){
 server.send(200, "text/html", html);
 });

 server.on("/status/0", [](){
 digitalWrite(led, LOW);
 server.send(200, "text/html", html);
 });

 server.on("/status/1", [](){
 digitalWrite(led, HIGH);
 server.send(200, "text/html", html);
 });

 server.on("/api/getstatus", [](){
 if (digitalRead(led))
 server.send(200, "text/plain", "Status:1");
 else
 server.send(200, "text/plain", "Status:0");
 });

 server.on("/api/status/0", [](){
 digitalWrite(led, LOW);
 server.send(200, "text/plain", "OK");
 });

 server.on("/api/status/1", [](){
 digitalWrite(led, HIGH);
 server.send(200, "text/plain", "OK");
 });

 server.begin();
 Serial.println("HTTP server started");
}

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

กด Upload และรอๆๆอย่างเดียวครับ

เมื่ออัพโหลดเรียบร้อยแล้ว จะแสดงข้อความว่า Done uploading.

กดรูปแว่นขยาย  เพื่อดูสถานะการเชื่อมต่อ ถ้าขึ้นจุดวิ่งอยู่ แสดงว่ากำลังเชื่อมต่ออยู่ อาจจะเชื่อมต่อกับ AP ได้แล้ว แต่กำลังรอ IP อยู่ ถ้านานเกินไป เป็นไปได้ว่าเชื่อมต่อไม่ได้ครับ ลองตรวจสอบข้อมูลดูดีๆ แล้วอัพโหลดขึ้นไปใหม่ ถ้าเชื่อมต่อได้แล้ว ลองเข้าไปที่ IP ดู ก็จะพบหน้าควบคุมแล้วครับ ลองกดปุ่ม ON OFF เล่นกันดูได้ครับ

ผลที่ได้ จะออกมาเป็นแบบในคลิปด้านล่างนี้ครับ (อย่าลืมต่อ LED ไว้ที่ GPIO2 นะครับ แล้วก็นำ R ค่าประมาณ 47Ω ต่ออนุกรมไว้ด้วย ป้องกัน LED ขาด)

ลองทำกันดูครับ หากอัพโหลดไม่ได้ ลองเช็คสายให้ดีๆ ครับ ต่อ Tx Rx ถูกหรือเปล่า ต่อ GPIO0 ลงกราว์ดหรือยัง ลืมรีเซ็ตโมดูลหรือเปล่า หลอดไฟสีน้ำเงินที่โมดูลกระพริบหรือเปล่า ประมาณนี้ครับ 🙂 แต่ถ้าหากใช้บอร์ด NodeMCU จะสะดวกกว่านี้ครับ เพราะในบอร์ดมีทุกอย่างมาให้พร้อมสำหรับการสั่งงาน และคาดว่าจะเสียยากกว่าการนำโมดูลมาต่อๆแบบนี้ เพราะคงจะมีการจัดระบบไฟเป็น 3.3V ทั้งระบบอยู่แล้ว ไว้โอกาศหน้าหากมีโอกาศได้ลองหยิบลองจับดู จะเอามาเขียนลงบล็อกอีกครับผม

การใช้งานไลบารี่ต่างๆ สามารถอ่านได้ที่หน้าเว็บหลักเลยครับ : https://github.com/esp8266/Arduino

6 comments

  1. ขอถามปัญหาทางเทคนิคหน่อยครับ คือหากผมต่อ led คาขา GPIO2 ไว้แล้วจ่ายไฟเข้า หลอด led จะติดเลยและไฟสีน้ำเงินที่โมดูลจะติดค้าง(บางครั้งไฟสีน้ำเงินที่โมดูลไม่ติดแต่หลอด led จะติดทุกครั้ง)และจะไม่มีการเชื่อมต่อไวไฟ แต่หากปลด led ออกจาก GPIO2 แล้วจ่ายไฟเข้าโมดูลระบบจะทำงานปรกติและเมื่อต่อ led เข้าไปก็สามารถควบคุม led ผ่านขา GPIO2 ได้ปรกติ แบบนี้มันเพราะอะไรมีทางแก้ไหมครับ

  2. ใช้ arduino leonardo ต่อกับตัว ESP8266 และจะใช้โค้ดนี้ได้ไหมคะ พอดีพึ่งหัดฝึก
    แล้วจะดูว่าต้องใช้ port อะไรดูจากตรงไหนคะ ^^

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *