STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

    Hướng Dẫn Sử Dụng Module Wifi ESP8266 v1 với Arduino Uno

    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.
    16/12/2014
    03/10/2020
    6 phút đọc
    Hướng Dẫn Sử Dụng Module Wifi ESP8266 v1 với Arduino Uno

    Giới thiệu

    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.

    Bài viết tổ hợp nhiều kiến thức 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.
    • 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

    • 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 trạm.

    Sơ đồ chân và các chức năng

    STDIO_ESP8266v1
    Sơ đồ chân ESP8266
    • 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.

    so_do_lap_dat_ESP8266
    Sơ đồ lắp đặt ESP8266

    Môi trường thử nghiệm

    • Trình duyệt web Mozilla Firefox 48.0.1
    • Window 10 Pro
    • Arduino IDE 1.6.4
    • Module wifi ESP8266 v1
    • Board Arduino Uno

    Đối với các môi trường phần cứng khác bạn vui lòng tự điều chỉnh cho phù hợp.

    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.

    Code ESP8266 làm web server gửi lệnh bật tắt LED 13

    Bạn có thể download code mẫu tại đây hoặc sao chép từ bên dưới (khuyến khích tải thay vì sao chép để tránh các vấn đề về Unicode).

    #define LED_PIN 13
    
    #define CMD_SEND_BEGIN  "AT+CIPSEND=0"
    #define CMD_SEND_END    "AT+CIPCLOSE=0"
    
    #define STDIO_PROTOCOL_HTTP     80
    #define STDIO_PROTOCOL_HTTPS    443
    #define STDIO_PROTOCOL_FTP      21
    #define STDIO_PROTOCOL_CURRENT  STDIO_PROTOCOL_HTTP
    
    #define STDIO_CHAR_CR     0x0D
    #define STDIO_CHAR_LF     0x0A
    
    #define STDIO_STRING_EMPTY  ""
    
    #define STDIO_DELAY_SEED  1000
    #define STDIO_DELAY_1X    (1*STDIO_DELAY_SEED)
    #define STDIO_DELAY_2X    (2*STDIO_DELAY_SEED)
    #define STDIO_DELAY_3X    (3*STDIO_DELAY_SEED)
    #define STDIO_DELAY_4X    (4*STDIO_DELAY_SEED)
    #define STDIO_DELAY_5X    (5*STDIO_DELAY_SEED)
    
    bool hasRequest = false;
    
    void setup()
    {
      delay(STDIO_DELAY_5X);
      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>STDIO.VN ESP8266 DEMO</title>"
          "</head>"
          "<body>"
            "<h1>STDIO.VN ESP8266 DEMO</h1>"
            "<form action='' method='GET'>"
              "<input type='radio' name='LED' name='STDIO' value='STDIO_ON' /> LED ON<br/>"
              "<input type='radio' name='LED' name='STDIO' value='STDIO_OFF' /> LED OFF<br/>"
              "<input type='submit' value='Submit' />"
            "</form>"
          "</body>"
         "</html>";
        
        String beginSendCmd = String(CMD_SEND_BEGIN) + "," + htmlResponse.length();
        deliverMessage(beginSendCmd, STDIO_DELAY_1X);
        deliverMessage(htmlResponse, STDIO_DELAY_1X);
        deliverMessage(CMD_SEND_END, STDIO_DELAY_1X);
        hasRequest = false;
      }
    }
    
    void initESP8266()
    {
      deliverMessage("AT+RST", STDIO_DELAY_2X);
      deliverMessage("AT+CWMODE=2", STDIO_DELAY_3X);
      deliverMessage("AT+CWSAP=\"STDIO_ESP8266\",\"STDIOElectronics\",1,4", STDIO_DELAY_3X);
      deliverMessage("AT+CIFSR", STDIO_DELAY_1X);
      deliverMessage("AT+CIPMUX=1", STDIO_DELAY_1X);
      deliverMessage(String("AT+CIPSERVER=1,") + STDIO_PROTOCOL_CURRENT, STDIO_DELAY_1X);  
    }
    
    void bufferingRequest(char c)
    {
      static String bufferData = STDIO_STRING_EMPTY;
    
      switch (c)
      {
        case STDIO_CHAR_CR:
          break;
        case STDIO_CHAR_LF:
        {
          STDIOProcedure(bufferData);
          bufferData = STDIO_STRING_EMPTY;
        }
          break;
        default:
          bufferData += c;
      }
    } 
    
    void STDIOProcedure(const String& command)
    { 
      hasRequest = command.startsWith("+IPD,");
      
      if(command.indexOf("STDIO_OFF") != -1)
      { 
        digitalWrite(LED_PIN, LOW);
      }
      else if(command.indexOf("STDIO_ON") != -1)
      { 
        digitalWrite(LED_PIN, HIGH);
      }
    }
    
    void deliverMessage(const String& msg, int dt)
    {
      Serial.println(msg);
      delay(dt);
    }
    

    Chạy thử nghiệm 

    Lần lượt thực hiện các bước sau để kiểm tra việc điều khiển bật tắt LED 13 thông qua wifi với module ESP8266 

    • Kết nối đến thiết bị và kiểm tra tín hiệu
    • Truy cập vào địa chỉ IP của module wifi ESP8266 (mặc định là 192.168.4.1) và kiểm tra tính năng

    Kết nối đến module wifi ESP8266 v1

    Mở command prompt (Start > Run gõ cmd) và gõ lệnh sau để kiểm tra tín hiệu kết nối.

    ping 192.168.4.1

    Nếu kết nối thành công bạn sẽ nhận được kết quả sau:

    ping_to_ESP8266

    Truy cập vào IP của module wifi ESP8266 (mặc định là 192.168.4.1) và kiểm tra tính năng

    Trong trường hợp này tôi dùng trình duyệt web Google Chrome 50+ để kiểm tra.

    demo_web_ESP8266
    0 Bình luận

    Bộ thu phát WIFI NodeMCU ESP8266

    55,000₫
    Điện Tử Ứng Dụng

    Điện Tử Ứng Dụng

    Kiến thức điện tử, Arduino, Raspberry Pi, giới thiệu sản phẩm.

    Đề xuất

    Sử Dụng Arduino IDE Lập Trình ESP8266 NodeMCU
    Hướng dẫn việc sử dụng Arduino IDE để tích hợp thư viện hỗ trợ cho việc ...
    Hướng Dẫn Sử Dụng Module RF315 Truyền Nhận Tín Hiệu Qua Sóng Vô Tuyến Bằng Arduino
    Giới thiệu và code mẫu sử dụng module RF315 thu và phát, code mẫu với ...

    Khám phá

    Sử Dụng CSDL Hướng Đối Tượng DB4O với Android
    Hướng dẫn sử dụng thư viện cơ sở dữ liệu hướng đối tượng DB4O để phát ...
    Thông Số Kỹ Thuật Arduino Uno R3 - Các Biến Thể và Lưu Ý
    Arduino board có rất nhiều phiên bản với hiệu năng và mục đích sử dụng ...
    Điều Chế Độ Rộng Xung - Pulse-Width Modulation
    Giới thiệu và sử dụng kỹ thuật điều chế độ rộng xung (Pulse-Width ...
    Đo Khoảng Cách Trong Không Gian Với Cảm Biến SRF05 Và Arduino
    Hướng dẫn sử dụng cảm biến sóng siêu âm SRF05 để đo khoảng cách từ vật ...
    STDIO Starter Kit - Các Thành Phần Cần Thiết Để Học Điện Tử Cơ Bản
    Bộ STDIO Starter Kit là bộ kit điện tử thống kê các thành phần cần thiết ...
    Xác Định Loại Vi Điều Khiển Của Arduino Bằng Lập Trình
    Hướng dẫn sử dụng code lập trình để xác định loại vi điều khiển của ...
    Sử Dụng CSDL Hướng Đối Tượng DB4O với Android - Phần 2 Thực Hiện App Đơn Giản - Chương Trình Trắc Nghiệm
    Hướng dẫn xây dựng một chương trình trắc nghiệm đơn giản sử dụng hệ quản ...
    Đo Tốc Độ Động Cơ Sử Dụng Cảm Biến IR FC-03
    Bài viết hướng dẫn cách sử dụng cảm biến đo tốc độ IR FC-03 kết hợp với ...
    Khi bạn nhấn vào liên kết sản phẩm do STDIO đề xuất và mua hàng, STDIO có thể nhận được hoa hồng. Điều này hỗ trợ STDIO tạo thêm nhiều nội dung hữu ích.. Tìm hiểu thêm.
    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020