Hướng Dẫn Sử Dụng Module Wifi ESP8266 V1 Với Arduino Uno R3

Bởi nguyenthanhphi (11/09/2017) 1 Bình luận

ESP8266 là một chip tích hợp cao - System on Chip (SoC), có khả năng xử lý và lưu trữ tốt, cung cấp khả năng vượt trội để trang bị thêm tính năng wifi cho các hệ thống khác hoặc đóng vai trò như một giải pháp độc lập. ESP8266 cung cấp khả năng kết nối mạng wifi đầy đủ và khép kín, bạn có thể sử dụng nó để tạo một web server đơn giản hoặc sử dụng như một access point.

Giới thiệu Module Wifi ESP8266 V1

ESP8266 là một chip tích hợp cao - System on Chip (SoC), có khả năng xử lý và lưu trữ tốt, cung cấp khả năng vượt trội để trang bị thêm tính năng wifi cho các hệ thống khác hoặc đóng vai trò như một giải pháp độc lập.

Module wifi ESP8266 v1 cung cấp khả năng kết nối mạng wifi đầy đủ và khép kín, bạn có thể sử dụng nó để tạo một web server đơn giản hoặc sử dụng như một access point.

Đối tượng hướng đến

Bạn đọc bài viết này để tiếp cận trọn vẹn bắt buộc phải có các khối kiến thức vững về:

  • Lập trình C/C++.
  • Kiến trúc phần mềm.
  • Lập trình Arduino.
  • Lập trình web front-end.
  • Mạng máy tính, giao thức HTTP.
  • Thao tác với tập lệnh AT.

Thông số kỹ thuật Module Wifi ESP8266 V1

  • Wifi 802.11 b/g/n
  • Wifi 2.4 GHz, hỗ trợ WPA/WPA2
  • Chuẩn điện áp hoạt động 3.3V
  • Chuẩn giao tiếp nối tiếp UART với tốc độ Baud lên đến 115200
  • Có 3 chế độ hoạt động: Client, Access Point, Both Client and Access Point
  • Hỗ trợ các chuẩn bảo mật như: OPEN, WEP, WPA_PSK, WPA2_PSK, WPA_WPA2_PSK
  • Hỗ trợ cả 2 giao tiếp TCP và UDP
  • Tích hợp công suất thấp 32-bit CPU có thể được sử dụng như là bộ vi xử lý ứng dụng
  • SDIO 1.1 / 2.0, SPI, UART
  • Làm việc như các máy chủ có thể kết nối với 5 máy con

Sơ đồ chân và các chức năng Module Wifi ESP8266 V1

lập trình esp8266 bằng arduino IDE

  • URXD(RX) — dùng để nhận tín hiệu trong giao tiếp UART với vi điều khiển
  • VCC — đầu vào 3.3V
  • GPIO 0 — kéo xuống thấp cho chế độ upload bootloader
  • RST — chân reset cứng của module, kéo xuống mass để reset
  • GPIO 2 — thường được dùng như một cổng TX trong giao tiếp UART để debug lỗi
  • CH_PD — kích hoạt chip, sử dụng cho Flash Boot và updating lại module, nối với mức cao
  • GND — nối với mass
  • UTXD (TX) — dùng để truyền tín hiệu trong giao tiếp UART với vi điều khiển

Sơ đồ lắp đặt mạch Arduino giao tiếp với ESP8266 điều khiển bật tắt LED thông qua wifi

Ở đây tôi sử dụng trực tiếp LED nối với chân D13 được tích hợp sẵn trên board Arduino.

lập trình esp8266 bằng arduino IDE

Những điểm cần lưu ý khi nạp code cho Arduino Uno để giao tiếp với ESP8266

Arduino Uno nạp code bằng bootloader sử dụng USB UART. Arduino Uno gửi lệnh điều khiển (tập lệnh AT) cho ESP8266 cũng bằng giao tiếp UART. Tuy nhiên board Arduino chỉ có 1 chân RX và 1 chân TX cho phép thực hiện giao tiếp UART. Điều đó dẫn đến 2 sự lựa chọn:

  1. Sử dụng chân RX và TX có sẵn trên Arduino để nạp code sau khi nạp code xong thì mới kết nối 2 chân đó với ESP8266. Với phương pháp này bạn phải thêm một khoảng thời gian delay ở hàm setup() để đảm bảo là sau khi kết nối ESP8266 với Arduino, thì ESP8266 vẫn nhận được đầy đủ các tập lệnh AT từ Arduino. Tuy nhiên, bạn không thể debug qua cổng Serial do cổng này đang đóng vai trò kết nối với ESP8266.
  2. Sử dụng SoftwareSerial để giả lập thêm 1 cổng Serial nữa để gửi tập lệnh AT cho ESP8266. Thư viện SoftwareSerial đã được trang bị sẵn trong Arduino IDE nên bạn không cần phải tải thêm. Với cách này thì bạn có thể debug thông qua Serial tuy nhiên code sẽ phức tạp hơn.

Ở ví dụ dưới đây tôi chọn phương án thứ nhất và chọn thời gian delay là 5s để kết nối chân TX và RX của Arduino với chân RX và TX của ESP8266 ngay sau khi nạp code thành công.

........................................................................................................................................................

#define LED_PIN 13
 
#define CMD_SEND_BEGIN  "AT+CIPSEND=0"
#define CMD_SEND_END    "AT+CIPCLOSE=0"
 
#define TDHshop_PROTOCOL_HTTP     80
#define TDHshop_PROTOCOL_HTTPS    443
#define TDHshop_PROTOCOL_FTP      21
#define TDHshop_PROTOCOL_CURRENT  TDHshop_PROTOCOL_HTTP
 
#define TDHshop_CHAR_CR     0x0D
#define TDHshop_CHAR_LF     0x0A
 
#define TDHshop_STRING_EMPTY  ""
 
#define TDHshop_DELAY_SEED  1000
#define TDHshop_DELAY_1X    (1*TDHshop_DELAY_SEED)
#define TDHshop_DELAY_2X    (2*TDHshop_DELAY_SEED)
#define TDHshop_DELAY_3X    (3*TDHshop_DELAY_SEED)
#define TDHshop_DELAY_4X    (4*TDHshop_DELAY_SEED)
#define TDHshop_DELAY_0X    (5*TDHshop_DELAY_SEED)
 bool hasRequest = false;
 void setup()
{
  delay(TDHshop_DELAY_0X);
  Serial.begin(115200);
    pinMode(LED_PIN, OUTPUT); 
  digitalWrite(LED_PIN, LOW);
    initESP8266();
}
 void loop()
{
  while(Serial.available())
  {   
    bufferingRequest(Serial.read());
  }
    if(hasRequest == true) 
  {
    String htmlResponse = "<!doctype html>"
    "<html>"
      "<head>"
        "<title>TDHshop.com.vn</title>"
      "</head>"
      "<body>"
        "<h1>TDHshop.com.vn ESP8266 DEMO</h1>"
        "<form action='' method='GET'>"
          "<input type='radio' name='LED' name='TDHshop' value='TDHshop_ON' /> LED ON<br/>"
          "<input type='radio' name='LED' name='D2K' value='TDHshop_OFF' /> LED OFF<br/>"
          "<input type='submit' value='Submit' />"
        "</form>"
      "</body>"
     "</html>";
    
    String beginSendCmd = String(CMD_SEND_BEGIN) + "," + htmlResponse.length();
    deliverMessage(beginSendCmd, TDHshop_DELAY_1X);
    deliverMessage(htmlResponse, TDHshop_DELAY_1X);
    deliverMessage(CMD_SEND_END, TDHshop_DELAY_1X);
    hasRequest = false;
  }
}
 void initESP8266()
{
  deliverMessage("AT+RST", TDHshop_DELAY_2X);
  deliverMessage("AT+CWMODE=2", TDHshop_DELAY_3X);
  deliverMessage("AT+CWSAP=\"TDHshop.com.vn\",\"123456789\",1,4", TDHshop_DELAY_3X);
  deliverMessage("AT+CIFSR", TDHshop_DELAY_1X);
  deliverMessage("AT+CIPMUX=1", TDHshop_DELAY_1X); // để cho phép các kết nối TCP
  deliverMessage(String("AT+CIPSERVER=1,") + TDHshop_PROTOCOL_CURRENT, TDHshop_DELAY_1X);  //để tạo 1 TCP server
}
 void bufferingRequest(char c)
{
  static String bufferData = TDHshop_STRING_EMPTY;
   switch (c)
  {
    case TDHshop_CHAR_CR:
      break;
    case TDHshop_CHAR_LF:
    {
      TDHshopProcedure(bufferData);
      bufferData = TDHshop_STRING_EMPTY;
    }
      break;
    default:
      bufferData += c;
  }

 void TDHshopProcedure(const String& command)

  hasRequest = command.startsWith("+IPD,");
  
  if(command.indexOf("TDHshop_OFF") != -1)
  { 
    digitalWrite(LED_PIN, LOW);
  }
  else if(command.indexOf("TDHshop_ON") != -1)
  { 
    digitalWrite(LED_PIN, HIGH);
  }
}
 void deliverMessage(const String& msg, int dt)
{
  Serial.println(msg);
  delay(dt);

}

.............................................................................................................................

* Lưu ý : TRONG QUÁ TRÌNH NẠP CODE CÁC BẠN NÊN RÚT DÂY TX VÀ RX RA KHỎI ARDUINO, KHI NẠP CODE XONG TA HÃY CẮM LẠI

+ Ta mở cổng Serial Monitor để xem arduino gửi lệnh lên ESP8266 như sau:

lập trình esp8266 và arduino uno r3

+ Tiếp đến trên máy tính hay điện thoại ta kết nối với Wifi có tên TDHshop.com.vn và nhập pass cho nó "123456789" .

+ Tiếp theo mở trình duyệt Web lên và gõ địa chỉ mặc định của ESP8266 là : 192.168.4.1 hiển thị như sau:

lập trình esp8266 và arduino uno r3

+ Và kết quả thực tế được hiển thị  như sau:

lập trình esp8266 bằng arduino uno r3

CHÚC CÁC BẠN THÀNH CÔNG!!!

Đóng góp ý kiến

Bình luận(1)

  • Bình luận bởi nguyen huệ
    e tìm nhưng k có sóng wifi tên TDHshop.com.vn ? có cách nào khắc phục k ạ