Truyền, nhận dữ liệu giữa 2 chip esp8266

Một chủ đề khá hấp dẫn là làm sao để 2 esp8266 nói chuyện với nhau (truyền-nhận dữ liệu giữa 2 esp8266) mà không cần thông qua Access Point nào.
Trước tiên, bạn cần biết esp8266 là gì? làm thế nào để sự dụng nó thì trang web https://arduino.esp8266.vn là 1 sự lựa chọn hoàn hảo. Hãy tìm hiểu về nó. Việc kết nối với 2 esp8266 (hoặc nhiều hơn) thực sự không khó, bạn chỉ cần đọc tài liệu để hiểu các chế độ làm việc của esp8266, có kiến thức về C và tìm hiểu các thư viện arduino.

Ứng dụng nào trong thực tế ?. Chúng ta hãy xem một nông dân công nghệ, ông ta trồng rau trên cánh đồng rộng khoảng 5km2, điều đáng nói là ông ta tạo ra một hệ thống giám sát và điều khiển nhiệt độ, độ ẩm dùng WIFI bằng cách kết nối các module esp8266 mà không sử dụng bất kì sợi dây nào (tất nhiên phải có 1 số dây nối với cảm biến 🙂 )

Làm thế nào ?. Ông ta chia khu vực 5km2 này thành 4 khu đất nhỏ hơn, ở mỗi khu ông ấy dùng 9 esp8266 kết nối với nhau. Tại khu vực trung tâm sẽ đặt 1 center-box gồm 1 module esp8266, 1 board arduino NANO và 1 module GPRS 3G tương thích với arduino. Ở mỗi phần, ông sắp xếp các esp8266 theo hình thức kết hợp giữa dạng mesh và dạng star , trong đó 6 esp8266 là các clients để đọc dữ liệu từ môi trường, 3 esp8266 còn lại giống như bộ phận trung gian để truyền-nhận dữ liệu. Mô hình kết nối như hình dưới (kiến thức về mạng Wireless Infrastructure and Topologies có thể tham khảo tại đây

6 esp8266 đọc dữ liệu chủ yếu ở chế độ DEEP-SLEEP, chỉ wake-up khoảng 1h trong ngày đề đọc dữ liệu nhằm tiết kiệm năng lượng. 3 esp8266 trung gian vận hành ở 2 chế độ, chế độ AP (access point: tạo kết nối để những esp8266 client  truy cập, truyền và nhận dữ liệu với nhau) và chế độ ST (Station mode: chế độ này nó như  1 client và kết nối đến AP tiếp theo).

Vậy … ông ấy lập trình nó như thế nào ?. Nói sâu hơn về cách hoạt động của hệ thống. 6 clients sẽ được lập trình để WAKE-UP từ trạng thái DEEP-SLEEP, đọc dữ liệu nhiệt độ, độ ẩm của cảm biến, kết nối và gửi 1 HTTP request đến AP gần nhất của nó. nếu AP này không được available thì clients sẽ lưu dữ liệu 10 lần gần nhất vào trong bộ nhớ nội  của esp8266 trong suốt quá trình DEEP-SLEEP, dữ liệu sẽ được gửi đi khi AP ở trạng thái available. Tiếp đến những “người vận chuyển” AP sẽ chờ và nhận dữ liệu từ clients gửi lên, sau đó nó gửi đến các AP kế tiếp, cứ như vậy dữ liệu sẽ đến center box. Center box được tạo ra để quản lí dữ liệu (Main-Cluster), nó đảm nhận vai trò nhận dữ liệu từ các AP gần nhất và gửi dữ liệu nhận được vào cơ sở dữ liệu (database) My-SQL thông qua module 3G GPRS với tần suất 1ngày/lần (dữ liệu được lưu ở định dạng .CSV trong thẻ nhớ SD được gắn với module arduino NANO). Ngoài ra, esp8266 central và các AP còn được lập trình tạo PING request để kiểm tra trạng thái available của các AP gần đó cộng thêm việc gửi trạng thái và dữ liệu mà nó nhận được đến database. Cuối ngày “famer nhà người ta” này có thể giám sát toàn bộ nông trại của mình bằng 1 giao diện web rất đẹp với các bản đồ, báo cáo, thống kê và dự đoán dựa trên những dữ liệu thu được trong database. Nghe có vẻ phức tạp quá, đừng quá lo lắng, chúng ta hãy bắt đầu từ những điều cơ bản và làm từ những thứ đơn giản 🙂 .Nó hoạt động cũng khá giống con ngừơi, nguyên lí của hoạt động như sau:

  • 1 esp8266 sẽ khởi động Soft AP để tạo mạng WiFi (con này là Server/AP),  esp8266 còn lại (STA/client) sẽ kết nối vào.
  • esp8266 làm Soft AP đồng thời cũng khởi động luôn 1 TCP Server, esp8266 client sẽ kết nối vào

Có một ưu điểm của esp8266 ở đây hơi khác với con người. Với con người, khi 2 đứa nói chuyện, 1 đứa nói (truyền), đứa kia cần phải nghe(nhận) để nói lại (truyền). Esp8266 thì trong cùng 1 thời điểm nó có thể là AP để nhận nhận dữ liệu đồng thời cũng có thể là client để gửi dữ liệu cho AP khác. Nói nhiều thế đủ rồi ==> làm thôi. Các bạn cần chuẩn bị 2 esp8266, để đơn giản cho việc đấu nối, bạn có thể mua board esp8266 theo ở đường dẫn https://iotmaker.vn/esp8266-iot-wifi-uno.html, code mẫu như bên dưới:

Code esp8266 client (STA)

#include "ESP8266WiFi.h";
 const char *ssid = "iotmaker.vn";
 const char *password = "@password";
 IPAddress server_ip(192, 168, 4, 1);
 #define PORT  23<br />
   // port 23 la port cua esp8226 lam AP da khoi tao.
 WiFiClient client;

void setup() {
   uint8_t i = 0;
   Serial.begin(115200);
   WiFi.begin(ssid, password);

Serial.print("\nConnecting to ");
   Serial.println(ssid);
   // Kiem tra tình trang ket noi, neu chua ket noi duoc
   // se in chuoi "connecting..." tren man hinh serial terminal.
   while (WiFi.status() != WL_CONNECTED) { 
     Serial.println("Connecting...");
     delay(500);
   }
 }
 unsigned long previousMillis = 0;
 void loop() {
   if (WiFi.status() == WL_CONNECTED) {
     // Kiem tra neu client(STA) chua duoc ket noi.
     // Kiem tra tiep tuc neu khong duoc ket noi den IP va PORT cua server(AP
     // thi in ra serial terminal chuoi "connection failed".
     while (!client.connected()) {
       if (!client.connect(server_ip, PORT)) {
         Serial.println("connection failed");
         delay(1000);
         return;
       }
     } 
     // Neu client(STA) duoc ket noi thi se doc du lieu tu server(AP)
     // den khi gap ki tu \r va in ra seria terminal du lieu nhan duoc.
     while (client.available()) {

<pre><code>   String line = client.readStringUntil('\r');
   Serial.print("Client receive from Server:");
   Serial.print(line);
 } 
 //Send PING to server every 1000ms.
 unsigned long currentMillis = millis();
 if (currentMillis - previousMillis &gt;= 1000) {
   previousMillis = currentMillis;
   client.write("PING\r");
 }
</code></pre>

}
 }

Code esp8266 AP (Server)

#include <ESP8266WiFi.h>;
#define PORT  23
// Gioi han so luong clients ket noi
#define MAX_CLIENTS 3
const char *ssid = "iotmaker.vn";
const char *password = "@password";
//khoi tao IP adress
IPAddress local_IP(192, 168, 4, 1);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);
// Khoi tao port de clients ket noi.
WiFiServer server(PORT);
WiFiClient clients[MAX_CLIENTS];

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("Setting soft-AP configuration ... ");
  //Cau hinh acces point, cai dat soft AP de client ket noi vao.
  WiFi.softAPConfig(local_IP, gateway, subnet);
  WiFi.softAP(ssid, password);
  //In ra local_IP cua AP.
  Serial.print("AP IP address: ");
  Serial.println(WiFi.softAPIP());
  Serial.println("Telnet server started");
  server.begin();
}

void loop() {
  uint8_t i;
  //Check if there are any new clients.
  if (server.hasClient())  {// kiem tra co client ket noi
    for (i = 0; i < MAX_CLIENTS; i++) {
      //Find free/disconnected spot.
      if (!clients[i] || !clients[i].connected())
      { if (clients[i]) clients[i].stop();
        clients[i] = server.available();
        Serial.print("New client: "); Serial1.print(i);
        continue;
      }
    }
    //No free/disconnected spot so reject.
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  // Check clients for data.
  // Kiem tra neu so client ket noi < MAX_CLIENTS
  // có client, client duoc ket noi và o trang thai available
  // doc du lieu tu client, va gui lai du lieu cho client do.
  for (i = 0; i < MAX_CLIENTS; i++) {
    if (clients[i] && clients[i].connected()) {
      if (clients[i].available()) {
        String line = clients[i].readStringUntil('\r');
        Serial.print("Server receive from Client:");
        Serial.print(line);
        //response to client
        String resp = String(line.reserve(line.length() - 1));
        Serial.print(" Then, response back to client:");
        Serial.print(resp);
        clients[i].write(resp.c_str());
        Serial.println();
      }
    }
  }
}

Nạp code cho từng board esp8266 và xem kết quả trên màn hình serial terminal. Một số nội dung cần tìm hiểu:

  1. Đọc hiểu nội dung của từng dòng code (tham khảo các function trên trang https://www.arduino.cc  (tiếng anh) và trang https://arduino.esp8266.vn/wifi/wifi-api.html (tiếng việt).
  2. Số lượng tối đa các client được kết nối đến AP là bao nhiêu ??? có thể mở rộng thêm được không (bằng cách nào ??? có ảnh hưởng đến vấn đề gì ko ??? )
  3. Khoảng cách xa nhất mà clients và AP truyền dữ liệu là bao nhiêu ???
  4. Phát triển thêm theo hướng clients truyền-nhận với AP1, sau đó AP1 đóng vai trò là client và truyền dữ liệu đến AP2.

Nội dung ví dụ về ứng dụng của esp8266 được lấy tại http://www.geekstips.com/two-esp8266-communication-talk-each-other , sẽ được gỡ bõ nếu có yêu cầu từ trang http://www.geekstips.com

Gửi phản hồi


Notice: Undefined offset: 0 in /var/www/learn.iotmaker.vn/wp-includes/class-wp-query.php on line 3162