Internet of Things với Arduino-Tương tác Máy-Máy – Giới thiệu Những kiểu tương tác IoT

Những kiểu tương tác IoT

Có nhiều kiểu tương tác khả dĩ giữa những thiết bị và người dùng trong thế giới IoT, và trước khi bắt đầu chương này tôi muốn cung cấp cho bạn một cái nhìn toàn cảnh của những kịch bản có thể xảy ra.

Một cái mà chúng ta đã thấy trong sách này đó là tương tác máy–người, ở đó chúng ta sử dụng thiết bị IoT để ghi dữ liệu lên server, và nó sẽ hiển thị đồ thị mà có thể được hiểu và sử dụng bởi người dùng cuối.

Loại thứ hai của tương tác là tương tác người–máy, ở đó người dùng kích hoạt một lệnh tới thiết bị ở xa, ví dụ để điều khiển từ xa một bóng đèn.

Và sau cùng, kịch bản cuối là tương tác máy–máy mà ở đó hai hoặc nhiều thiết bị sẽ giao tiếp trực tiếp với nhau, không có bất kì sự can thiệp nào từ con người. Chúng ta sẽ tập trung vào kiểu tương tác này trong chương này.

Tương tác M2M trong phạm vi cục bộ cơ bản

Trong dự án đầu tiên của chương này, chúng ta sẽ học cách làm một trường hợp tương tác M2M đơn giản, bằng cách sử dụng 2 board Arduino MKR1000. Để minh họa cho giao tiếp M2M chúng ta sẽ làm cho chúng giao tiếp qua mạng Wi-Fi cục bộ.

Sẵn sàng

Dự án này được bao gồm 2 board Arduino. Một board sẽ được kết nối tới một nút nhấn loại thường, và board còn lại sẽ nối với 1 LED thường. Mục tiêu là bất kể khi nào nút nhấn được nhấn, board thứ nhất sẽ gửi tín hiệu đến board thứ hai để bật sáng LED.

Những thành phần sử dụng trong hướng dẫn này đó là:

  • Arduino MKR1000 ×2
  • Nút nhấn
  • Điện trở 1K Ohm
  • LED
  • Điện trở 330 Ohm

Giờ chúng ta sẽ ráp mạch với nút nhấn. Bước đầu tiên là đặt nút nhấn trên breadboard, cùng với đó là điện trở, nối một chân của nút nhấn. Tiếp đến, cũng nối một chân của nút nhấn tới chân số 6 của board Arduino. Cuối cùng nối phía còn lại của nút nhấn tới chân VCC của board Arduino.

Đây là kết quả cuối cùng:

Ta lắp board còn lại với LED. Đầu tiên, đặt LED nối tiếp với điện trở trên breadboard, với chân dài hơn của LED nối với điện trở. Sau đó, nối chân kia của điện trở tới chân số 6 của board Arduino, và chân còn lại của LED tới cực GND.

Đây là kết quả cuối cùng:

Về chương trình phần mềm, bạn cũng sẽ cần thư viện REST cho Arduino mà bạn có thể cài đặt nó từ trong phần quản lý thư viện Arduino.

* Bài viết được trích từ sách:  Internet of thing với Arduino

Cách làm…

Bây giờ chúng ta sẽ xem đến cách cấu hình board, bắt đầu với board ta ráp sau – board gắn LED. Như thường lệ, tôi chỉ nhấn mạnh những phần quan trọng nhất của code, và bạn sẽ tìm thấy code hoàn chỉnh trên kho chứa Github của sách này:

1. Sketch bắt đầu bằng việc thêm những thư viện cần thiết:

#include <SPI.h>
#include <WiFi101.h>
#include <aREST.h>

2. Sau đó chúng ta khai báo đối tượng aREST, nó được sử dụng để nhận lệnh từ board Arduino khác:

aREST rest = aREST();

3. Chúng ta cũng khai báo chân kết nối với LED là output:

pinMode(6, OUTPUT);

4. Bây giờ lấy toàn bộ chương trình cho dự án này trên Github tại https://github.com/marcoschwartz/iot-arduino-cookbook

5. Sau đó thay đổi mã lệnh với mã xác thực Wi-Fi và nạp code vào board. Kế đến, mở cửa sổ Serial lên. Xem địa chỉ IP của board, bạn sẽ cần nó sau này.

6. Giờ ta sẽ cấu hình board có nút nhấn. Đầu tiên cũng là thêm các thư viện cần thiết:

#include <SPI.h>
#include <WiFi101.h>

7. Tiếp đến, bạn cần nhập địa chỉ IP của board gắn LED:

const char* host = "192.168.0.108";

8. Sau đó, chúng ta liên tục kiểm tra xem nút nhấn được nhấn hay không:

if (digitalRead(6)) {

9. Nếu là có, chúng ta gọi một hàm trên board LED để đổi trạng thái của LED:

String url = "/toggle";
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }

10. Bây giờ bạn có thể lấy toàn bộ code chương trình của dự án này từ Github và nạp cho board.

11. Cuối cùng, đã đến lúc thử dự án. Nhấn nút nhấn trên board này và nó sẽ làm đổi trạng thái của LED trên board kia.

* Xem thêmHọc IoT bài bản: Internet of Thing (IoT)

Nó hoạt động như thế nào…

Hướng dẫn này minh họa cách mà 2 board có thể giao tiếp với nhau, với board đầu tiên gửi tín hiệu tới board còn lại khi một event được kích hoạt (ở đây là nút nhấn được nhấn).

* Sách Arduino, ESP8266, STM32: Sách tự động hóa

Giao tiếp M2M thông qua cloud với IFTTT

Trong hướng dẫn trước, chúng ta đã thấy một ví dụ minh họa tốt về cách làm cho 2 board Arduino có thể giao tiếp được với nhau trong phạm vi cục bộ. Tuy nhiên, nó không tiện lợi, chẳng hạn, bạn phải nhập vào địa chỉ IP ở một thiết bị trong code của thiết bị khác.

Trong hướng dẫn này, chúng ta sẽ lại sử dụng IFTTT (mà ta đã sử dụng ở chương trước) để làm cho những thiết bị giao tiếp, nhưng lần này là qua Internet. Chúng ta sẽ thấy nó đơn giản hóa mọi thứ đi rất nhiều, và dĩ nhiên cho phép những thiết bị giao tiếp được với nhau từ bất kỳ đâu trên thế giới.

Sẵn sàng

Đầu tiên, hãy đảm bảo rằng bạn đã có 2 board được ráp như trong hướng dẫn trước. Bạn cũng cần một tài khoản IFTTT có kênh Maker được kết nối.

Bạn cũng sẽ cần cài đặt thư viện PubSubClient có thể tìm thấy trong phần quản lý thư viện Arduino.

Tôi sẽ cho các bạn xem thứ bạn cần phải sửa trên từng board để làm các board giao tiếp được qua IFTTT. Dĩ nhiên, bạn sẽ tìm thấy code hoàn chỉnh trên Github.

Trong hướng dẫn này, board thứ nhất (với nút nhấn) sẽ gửi một trigger tới IFTTT; IFTTT sẽ phản hồi bằng cách gửi một lệnh tới server cloud aREST.io. Server này sau đó sẽ chuyển tiếp lệnh tới board kia, làm thay đổi trạng thái của đèn. Tôi sẽ chỉ cho bạn thấy cách để kết nối board thứ hai tới aREST.io để nó có thể được điều khiển từ bất cứ đâu.

Với board được kết nối với nút nhấn, bạn cần thêm thông tin của IFTTT, bao gồm key cho kênh Maker của bạn:

const char* host = "maker.ifttt.com";
const char* eventName   = "toggle";
const char* key = "key";

Sau đó, yêu cầu cần được chỉnh sửa với đúng key và trigger:

String url = "/trigger/";
  url += eventName;
  url += "/with/key/";
  url += key;

Với board còn lại, bạn cần thêm tất cả những thư viện cần thiết:

#include <SPI.h>
#include <WiFi101.h>
#include <PubSubClient.h>
#include <aREST.h>

Tiếp đến chúng ta định nghĩa một WiFiClient và PubSubClient:

WiFiClient wifiClient;
PubSubClient client(wifiClient);

Sau đó chúng ta truyền client này vào đối tượng thể hiện aREST:

aREST rest = aREST(client);

Kế đến chúng ta tạo một biến lưu giữ trạng thái hiện tại của LED:

bool ledState = false;

Như trong hướng dẫn trước, chúng ta tạo một hàm để chuyển đổi trạng thái của LED:

int ledToggle(String command);

Bên trong hàm setup(), ta gán ID của board:

rest.set_id("305eyf");

Bạn cần thay đổi nó vì nó định danh thiết bị của bạn trên server cloud aREST.

Chúng ta cũng truyền hàm này cho aREST API để nó có thể được gọi từ xa:

rest.function("toggle", ledToggle);

Cuối cùng, dưới đây là phần chi tiết của hàm chuyển đổi trạng thái của LED:

int ledToggle(String command) {

  ledState = !ledState;

  digitalWrite(6, ledState);
  return 1;
}

Bạn có thể lấy cả hai chương trình trên Github, thay đổi mã xác thực Wi-Fi cũng như IFTTT và cấu hình cả hai board.

Cách làm…

Bây giờ chúng ta cũng cần phải tạo liên kết giữa hai board thông qua IFTTT. Hãy đăng nhập tài khoản IFTTT của bạn và tạo một hướng dẫn mới. Để làm kênh kích thích (trigger), ta chọn kênh Maker:

Sau đó gõ toggle làm event, tương tự như trong sketch:

Với kênh action, ta chọn lại kênh Maker:

Bây giờ nhập lệnh sau vào trong ô action, tất nhiên là bạn cần thay bằng ID của board như đã đặt trong sketch:

Khi hướng dẫn đã được tạo, bạn có thể lập tức thử chương trình lần nữa. Bất cứ khi nào bạn nhấn nút nhấn, LED sẽ thay đổi trạng thái. Chú ý rằng ở đây ta sẽ thấy trễ 1-2 giây vì thông tin phải đi qua server IFTTT trước.

Nó hoạt động như thế nào…

Hướng dẫn này thực hiện tính năng tương tự như hướng dẫn trước đó. Tuy nhiên, ở đây, cả hai board thực sự giao tiếp thông qua cloud sử dụng dịch vụ IFTTT. Bằng cách này chúng thực sự có thể được đặt ở bất cứ đâu trên thế giới mà dự án vẫn có thể làm việc bình thường.

=> Khóa học Internet of Things: https://trungtamcadcam.com/khoa-hoc/internet-of-thing-iot/