Sử dụng ESP32 SmartConfig với Arduino IDE

ESP32 SmartConfig là một tính năng cho phép chúng ta dễ dàng kết nối mạch với mạng WiFi mới. Vì thông thường, trong các dự án IoT với ESP32, việc thay đổi thông tin tên và mật khẩu WiFi khá phức tạp và rắc rối. Chúng ta phải sửa lại code, biên dịch lại và nạp code mới vào mạch ESP32.

Phương pháp ESPTouch được ra đời để giải quyết vấn đề này, và chúng hoạt động dựa trên công nghệ SmartConfig do TI thiết kế. Chúng ta cùng tìm hiểu về cách sử dụng công nghệ này nhé, dựa trên phần mềm lập trình Arduino IDE.

Cách sử dụng ESP32 SmartConfig với Arduino IDE

Tổng quan

Bài viết này hướng dẫn bạn cách dùng ESP32Touch với các thiết bị IoT, thông qua mạch ESP32. Khi đó, bạn không cần phải code thông tin mạng WiFi vào chương trình của mình, nên bạn có thể dễ dàng thay đổi thông tin mạng này khi cần.

Chúng ta sẽ sử dụng một ứng dụng có tên là ESPTouch: SmartConfig cho ESP8266, ESP32 trong bài hướng dẫn này. Bạn có thể dễ dàng tải ứng dụng này trên CH Play hoặc App Store. Cụ thể, chúng ta sẽ tạo một dự án ESP32 để lưu thông tin của mạng WiFi trong bộ nhớ EEPROM.

Giới thiệu về ESPTouch và ESP32 SmartConfig

SmartConfig được hiểu đơn giản là một công nghệ giúp kết nối các thiết bị IoT, thông qua mạng WiFi, do TI phát triển.

Công nghệ này sử dụng một app di động để phát thông tin đăng nhập mạng từ Smartphone hoặc máy tính bảng đến mạch ESP32 (bao gồm tên WiFi và mật khẩu WiFi). Vì thế, bạn không cần phải nhập thông tin WiFi này vào code.

Giao thức ESPTouch sử dụng công nghệ SmartConfig, mang đến một cách liền mạch để cấu hình cá thiết bị WiFi với các bộ router. Đây là giao thức rất thân thiện với người dùng khi sử dụng các thiết bị headless, chúng ta chỉ cần vài click trên điện thoại là đủ.

Ban đầu, thiết bị IoT không được kết nối đến mạng, và ứng dụng ESP-Touch không thể gửi bất kỳ thông tin nào một cách trực tiếp đến thiết bị.

Khi đó, ESPTouche sẽ gửi thông tin (là các gói UDP) một cách gián tiếp đến các điểm truy cập WiFi (WiFi Access Point), trong đó mã hóa các thông tin SSID và mật khẩu vào từng trường độ dài của từng gói UDP. Sau đó, các thiết bị IoT như mạch ESP32 có thể nhận các gói UDP và phân tích các thông tin cần thiết.

Cách thức hoạt động của ESP32 SmartConfig

Giải thích thêm: UDP (User Datagram Protocol) là một phần của giao thức Internet, thường dùng trong các chương trình của các máy tính chạy trong mạng. Khác với giao thức TCP/IP, giao thứ UDP thường dùng để gửi các tập tin dữ liệu ngắn với tốc độ nhanh chóng. Tuy nhiên, UDP có thể sẽ không đảm bảo được tính trọn vẹn cho dữ liệu gửi đi.

Dưới đây là hình minh họa về các gói UDP:

ESPTouch gửi các gói dữ liệu UDP gián tiếp tới ESP32

Hướng dẫn cách dùng ESP32 SmartConfig

Cài tiện ích, phần mềm

Trước khi sử dụng ESP32 SmartConfig, bạn cần cài đặt tiện ích ESP32 trong phần mềm Arduino IDE. Nếu chưa cài, bạn có thể làm theo hướng dẫn sau: Cách lập trình ESP32 bằng Arduino IDE (Windows, Linux, Mac OS X)

Sau đó, bạn cài phần mềm EspTouch: SmartConfig cho ESP8266, ESP32 (với điện thọa Android) hoặc phần mềm Espressif Esptouch (trên Apple):

Cài app ESP32 SmartConfig trên điện thoại

Nạp code vào ESP32

Trong tiện ích ESP32 đã cài trong Arduino đã có sẵn 1 đoạn code mẫu minh họa với ESP32 SmartConfig, bạn có thể truy cập theo đường dẫn sau để mở code: File >> Example >> WiFi >> WiFiSmartConfig. (Lưu ý: Bạn cần chọn đúng board mạch ESP32 của mình trước khi đi theo đường dẫn này nhé)

Đoạn code minh họa như sau:

#include "WiFi.h"

void setup() {
  Serial.begin(115200);

  //Init WiFi as Station, start SmartConfig
  WiFi.mode(WIFI_AP_STA);
  WiFi.beginSmartConfig();

  //Wait for SmartConfig packet from mobile
  Serial.println("Waiting for SmartConfig.");
  while (!WiFi.smartConfigDone()) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("SmartConfig received.");

  //Wait for WiFi to connect to AP
  Serial.println("Waiting for WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("WiFi Connected.");

  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  // put your main code here, to run repeatedly:

}

Bạn tiến hành nạp code trên vào mạch ESP32 của mình nhé! Bạn có thể thấy trong đoạn code không có thông tin fix cứng về mạng WiFi cần kết nối.

Sau khi nạp code, bạn hãy mở Serial Monitor và chọn tốc độ truyền phù hợp. Bạn sẽ thấy màn hình đang chờ thông tin từ SmartConfig. Sau khi vào chế độ cấu hình, màn hình sẽ hiển thị các dấu chấm:

Sử dụng ESPTouch

Mở ứng dụng ESPTouch vừa tải trên điện thoại và kết nối với mạng WIFI (Với điện thoại Android, bạn cần bật thêm vị trí Location nhé!):

Cách dùng ESP32Touch trên điện thoại

Phần mềm sẽ tự động tìm và hiển thị thông tin SSID và BSSID của mạng WiFi mà điện thoại đã kết nối. Bây giờ, bạn chỉ cần nhập mật khẩu của mạng WiFi:

Nhập mật khẩu vào ESPTouch

Sau đó, bạn nhập vào mục Multicast và nhấn xác nhận, sau đó trên màn hình sẽ hiển thi một cửa sổ loading như hình:

Chờ ESPTouch kết nối

Cuối cùng, trên màn hình hiển thị thông báo thành công (Success) như bên dưới, đồng nghĩa với ESP32 đã kết nối với mạng WIFi:

ESP32 kết nối thành công với mạng WIFi

Trên màn hình Serial Monitor lúc này sẽ hiển thị thông báo như sau:

ESP32 kết nối thành công với mạng WIFi

Tuy nhiên chương trình này có một số nhược điểm, vì bạn cần định lại cấu hình mỗi khi khởi động lại ESP32, vì chúng ta không lưu trữ thông tin mạng WiFi. Dưới đây là đoạn code để giải quyết vấn đề này:

Cải tiến chương trình

Chúng ta sẽ lưu trữ thông tin của mạng WiFi trong bộ nhớ EEPROM/Flash. Khi đó, chúng ta không cần phải cấu hình ESP lại mọi lúc.

Tiếp theo, chúng ta sẽ thêm một kiểm tra nhỏ, chẳng hạn như khi ESP bật ON, chúng sẽ truy xuất thông tin mạng WiFi đã lưu và kết nối với mạng Wi-Fi. Nếu kết nối thành công thì hệ thống bỏ qua việc nhập vào chế độ SmartConfig.

Ngoài ra, chúng tôi sẽ sử dụng nút khởi động làm nút đặt lại. Nó sẽ xóa thông tin các mạng WiFi đã lưu và khởi động lại ESP để có cấu hình mới.

Khi đó, bạn cần nhấn và giữ nút khởi động hơn 3 giây rồi thả ra để reset cấu hình.

Đây là code sau cải tiến:

/*
  Date: 11-08-21
  Code is written by: Dharmik
  Configure ESP32 Wi-Fi parameters using SmartConfig
  Find more on www.TechTOnions.com
*/
#include "WiFi.h"
#include "EEPROM.h"
#define LENGTH(x) (strlen(x) + 1)   // length of char string
#define EEPROM_SIZE 200             // EEPROM size
#define WiFi_rst 0                  //WiFi credential reset pin (Boot button on ESP32)
String ssid;                        //string variable to store ssid
String pss;                         //string variable to store password
unsigned long rst_millis;

void setup() {
  Serial.begin(115200);             //Init serial
  pinMode(WiFi_rst, INPUT);
  if (!EEPROM.begin(EEPROM_SIZE)) { //Init EEPROM
    Serial.println("failed to init EEPROM");
    delay(1000);
  }
  else
  {
    ssid = readStringFromFlash(0); // Read SSID stored at address 0
    Serial.print("SSID = ");
    Serial.println(ssid);
    pss = readStringFromFlash(40); // Read Password stored at address 40
    Serial.print("psss = ");
    Serial.println(pss);
  }

  WiFi.begin(ssid.c_str(), pss.c_str());

  delay(3500);   // Wait for a while till ESP connects to WiFi

  if (WiFi.status() != WL_CONNECTED) // if WiFi is not connected
  {
    //Init WiFi as Station, start SmartConfig
    WiFi.mode(WIFI_AP_STA);
    WiFi.beginSmartConfig();

    //Wait for SmartConfig packet from mobile
    Serial.println("Waiting for SmartConfig.");
    while (!WiFi.smartConfigDone()) {
      delay(500);
      Serial.print(".");
    }

    Serial.println("");
    Serial.println("SmartConfig received.");

    //Wait for WiFi to connect to AP
    Serial.println("Waiting for WiFi");
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }

    Serial.println("WiFi Connected.");

    Serial.print("IP Address: ");
    Serial.println(WiFi.localIP());

    // read the connected WiFi SSID and password
    ssid = WiFi.SSID();
    pss = WiFi.psk();
    Serial.print("SSID:");
    Serial.println(ssid);
    Serial.print("PSS:");
    Serial.println(pss);
    Serial.println("Store SSID & PSS in Flash");
    writeStringToFlash(ssid.c_str(), 0); // storing ssid at address 0
    writeStringToFlash(pss.c_str(), 40); // storing pss at address 40
  }
  else
  {
    Serial.println("WiFi Connected");
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  rst_millis = millis();
  while (digitalRead(WiFi_rst) == LOW)
  {
    // Wait till boot button is pressed 
  }
  // check the button press time if it is greater than 3sec clear wifi cred and restart ESP 
  if (millis() - rst_millis >= 3000)
  {
    Serial.println("Reseting the WiFi credentials");
    writeStringToFlash("", 0); // Reset the SSID
    writeStringToFlash("", 40); // Reset the Password
    Serial.println("Wifi credentials erased");
    Serial.println("Restarting the ESP");
    delay(500);
    ESP.restart();            // Restart ESP
  }
}


void writeStringToFlash(const char* toStore, int startAddr) {
  int i = 0;
  for (; i < LENGTH(toStore); i++) {
    EEPROM.write(startAddr + i, toStore[i]);
  }
  EEPROM.write(startAddr + i, '\0');
  EEPROM.commit();
}


String readStringFromFlash(int startAddr) {
  char in[128]; // char array of size 128 for reading the stored data 
  int i = 0;
  for (; i < 128; i++) {
    in[i] = EEPROM.read(startAddr + i);
  }
  return String(in);
}

Bạn hãy nạp đoạn code ESP32 SmartConfig vào và thử nhé!

Lời kết

Trên đây là hướng dẫn chi tiết về ESP32 SmartConfig. Nhìn chung, đây là cách đơn giản và nhanh chóng nhất để bạn cấu hình thông tin mạng WiFi cho các thiết bị IoT với ESP32. Chúc các bạn thành công!

IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *