[TH] ESP-01s

บทความนี้แนะนำโมดูล esp8266 ชื่อ ESP-01s ที่มีขาให้เชื่อมต่อ 8 ขา โดยอธิบายหน้าที่ของแต่ละขา การขยายวงจรเพื่อโปรแกรมชิพ (ตัวอย่างดังภาพที่ 1) การทำให้ชิพทำงาน และรวมถึงตัวอย่างการเขียนโปรแกรมเพื่อใช้งานโมดูลนี้ด้วย Arduino เพื่อให้เห็นภาพรวมในการพัฒนระบบซึ่งเป็นระบบที่ราคาน่ารักน่าสนใจระบบหนึ่ง

ภาพที่ 1 บอร์ดโปรแกรมชิพ ESP8266 ที่ใช้กับโมดูล ESP-01/ESP-01s

คุณสมบัติ

โมดูล ESP-01 และ ESP-01s เป็นโมดูลขนาดเล็กดังภาพที่ 2 และ 3 ที่ถูกออกแบบมาเพื่อเน้นการเชื่อมต่อระบบเครือข่ายไร้สายให้กับไมโครคอนโทรลเลอร์ตัวอื่น ๆ ผ่านทาง RS232 ด้วยชุดคำสั่ง AT โดยเชื่อมต่อสาย RX/TX/CH_PD/Vcc และ GND เพื่อใช้งาน แต่สามารถเขียนโปรแกรมลงชิพ ESP8266 ได้ด้วยการกำหนดให้ขา GPIO0 เป็น GND ในตอนบูตระบบ ทำให้โมดูลนี้ทำงานได้หลากหลายมากขึ้น

ภาพที่ 2 โมดูล ESP-01s ด้านบน
ภาพที่ 3 โมดูล ESP-01s ด้านล่าง

คุณสมบัติของ 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

ภาพที่ 4 ผังฟังก์ขันงานของ ESP8266
ที่มา หน้าที่ 12 ภาพที่ 3-1

ออกแบบการใช้งาน

จากขา 8 ขาของโมดูล ESP-01/ESP-01s ในภาพที่ 5 จะพบว่า โมดูลรองรับ GPIO จำนวน 2 ขา คือ 2 และ 0 โดย

  • GPIO 0 ใช้สำหรับตั้งค่าการทำงานตอนระบบเริ่มทำงาน คือ ถ้ามีสถานะเป็น GND หมายถึงเข้าโหมดโปรแกรมชิพ และถ้าเป็น 1 หมายถึงทำงานปกติ
  • GPIO 2 ถูกเชื่อมต่อกับวงจรแอลอีดีบนโมดูลสำหรับใช้แสดงสถานะการทำงาน
ภาพที่ 5 การเรียงขา Connector (มองจากด้านบน)

จากขา TX และ RX ใช้สำหรับเชื่อมต่อกับโมดูลสื่อสารอนุกรมโดยต่อการเชื่อมต่อดังภาพที่ 6

ภาพที่ 6 เชื่อมต่อ RX/TX เข้ากับ CH340

การทำวงจรรองรับการเลือกโหมดทำงานของ ESP-01/ESP-01s ทำได้ดังภาพที่ 7 ซึ่งในสภาวะปกติเมื่อไม่กด SW1 จะทำให้ขา GPIO0 มีสถานะเป้น 1 จึงทำงานในโหมดทำงานปกติ แต่ถ้า SW1 ถูกกดทำให้ขา GPIO0 มีสถานะเป็น 0 และเมื่อเริ่มระบบใหม่โดยขานี้เป็น 0 จะเข้าโหมดโปรแกรมชิพ ESP8266

ภาพที่ 7 ขา GPIO0 สำหรับควบคุมโหมดการ boot แบบรันหรือเขียนชิพ

ขา RST ของโมดูล ESP-01/ESP-01s ออกแบบเพื่อให้ผู้ใช้สามารถสั่งรีเซ็ต (Reset) การทำงานของโมดูลเผื่อกรณีที่ระบบค้างหรือล้มเหลว ซึ่งวงจรสำหรับทำการรีเซ็ตด้วย SW2 เป็นดังภาพที่ 8

ภาพที่ 8 ภาครีเซ็ต

ขา CH_PD เป็นขา En ของโมดูลใช้สำหรับสั่งให้โมดูลถูกเปิดการทำงานหรือหยุดการทำงาน โดยปกติต่อเข้ากับ Vcc เพื่อให้ทำงานดังภาพที่ 9

ภาพที่ 9 ขา CH_PD

ภาคแอลอีดีบนโมดูล ESP-01/ESP-01s ต่อเข้ากับขา GPIO2 ดังภาพที่ 10 ซึ่งจะพบว่า การสั่งให้หลอดติดจะต้องส่งสัญญาณ 0 ไปเพื่อให้ครบวงจร และสั่งให้ดับด้วยการส่ง 1

ภาพที่ 10 วงจร LED บนบอร์ด

จากภาควงจรที่ต่อเพิ่มจะพบว่ามีความซับซ้อนน้อยสามารถนำไปใช้งานได้สะดวก ขั้นตอนต่อไปมาทดลองเขียนโปรแกรมกัน

เขียนโปรแกรม

การตั้งค่า ESP-01s ให้เลือกใช้ Board เป็น Generic ESP8266 Module โดยคั้ง CPU Frequency เป็น 160MHz หรือต้องการลดทอนลงเป็น 80MHz ได้เช่นกันเพื่อประหยัดพลังงาน และไม่ได้ประมวลผลสูง ที่สำคัญของการตั้งค่าคือ Flash Size ให้เลือกเป็น 1MB (FS:64KB OTA:~470KB) ดังภาพที่ 11

ภาพที่ 11 การตั้งค่าของโมดูล ESP-01s

ตัวอย่างโปรแกรมควบคุมแอลอีดีที่ขา 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 จึงสามารถรายงานผลทางเว็บซึ่งสามารถดูได้จากเว็บบราวเซอร์

ภาพที่ 12 บอร์ดสำหรับโปรแกรมโมดูล ESP-01*ESP-01s
ภาพที่ 13 บอร์ด dCore01 สำหรับนำ ESP-01/ESP-01s ไปใช้งาน

ตัวอย่างต่อไปเป็นการใช้ 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]");
  }
}
ภาพที่ 14 ตัวอย่างการใช้ ESP-01s เป็นตัวให้บริการรายงานอุณหภูมิและความชื้นผ่านเว็บ

และเมื่อทางทีมงานเราได้ทดสอบรันการหาค่าจำนวนเฉพาะจากตัวเลข 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, .., 19500, 20000 พบว่า ความเร็วเท่ากับบอร์ด NodeMCU ทั่วไป ดังภาพที่ 15

ภาพที่ 15 กราฟเวลาที่ใช้ในการตัวเลข Prime ของ esp32, esp8266/esp-01s, STM32 (103, 401, 411)

สรุป

จากบทความนี้จะพบว่าไมโครคอนโทรลเลอร์ esp8266 เมื่อถูกย่อส่วนเพื่อเน้นให้เป็นตัวเชื่อมต่อระบบเครือข่ายไร้สายหรือโมดูล ESP-01 หรือ ESP-01s นั้น เป็นระบบที่มีราคไม่แพง และทำงานได้ด้วยความเร็วที่เหมือนกับบอร์ด ESP8266 ทั่วไป แต่มี GPIO ให้ใช้จำกัดกว่า ดังนั้น การเลือกใช้จึงขึ้นอยู่กับระบบและความจำเป็นใช้ สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ

ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ

แหล่งอ้างอิง

  1. ESPRESSIF : ESP8266 Series of Modules
  2. ESPRESSIF : ESP8266EX DataSheet

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ

ปรับปรุงเมื่อ 2021-08-08, 2021-11-06