iNut cảm biến - Bài 1: Bước đầu tiến vào thế giới IoT

    Xin chào mọi người, cùng với AI thì IoT cũng là một xu thế chắc chắn sẽ phát triển trong cuộc cách mạng công nghiệp 4.0. Ngày trước, khi mới làm quen với các dự án liên quan đến IoT, mọi người thường gặp nhiều khó khăn do phải chuẩn bị gần như mọi thứ từ server tới client và tính ổn định, bảo mật của mô hình cũng khó được đảm bảo. Kể từ khi các nền tảng IoT ra đời thì mọi thứ đã trở nên dễ dàng hơn. Sự đơn giản và tiện lợi khi làm các dự án IoT cũng ngày càng tăng theo dòng phát triển của các nền tảng ấy. Inut Platform chính là một trong những nền tảng như vậy, đây là một nền tảng do người Việt sáng lập nên chắc chắn việc hỗ trợ khi làm dự án sẽ dễ dàng hơn rất nhiều. Chính vì vậy, hôm nay mình xin giới thiệu với các bạn seri bài viết hướng dẫn sử dụng iNut Cảm Biến - Một sản phẩm đa năng của nền tảng iNut.

    Yêu cầu nhỏ: Để có thể hiểu được seri bài này thì mình cần các bạn có một lượng kiến thức cơ bản về Arduino trước. Nào cùng bắt đầu thôi!

I. Các khái niệm

    Vì seri này dành cho các bạn mới làm quen với IoT nên mình sẽ giải thích các khái niệm theo cách nôm na dễ hiểu nhé, còn đi sâu vào khái niệm, sau này khi đã tiếp xúc được kha khá lâu thì các bạn tự khắc hiểu hoặc tự tìm mình hiểu nhé :D

1. IoT là gì?

    IoT là viết tắt của cụm từ “Internet of Things”. “things” ở đây có nghĩa là mọi vật, đó có thể là những thiết bị phần cứng như tivi, tủ lạnh, máy giặt, bóng đèn, ổ cắm điện, Arduino hay thậm chí là vòi nước, bếp gas,.... và những phần mềm như hệ cơ sở dữ liệu, ứng dụng điện thoại,... do đó IoT có nghĩa là “vạn vật kết nối internet”, tức là mọi thứ được kết nối với nhau thông qua mạng internet nhằm theo dõi, điều khiển mọi thứ từ xa ở mọi nơi trên thế giới thông qua mạng internet.

Mọi thứ đều được kết nối với nhau

2. INut Platform là gì?

    Như đã giới thiệu ở đầu bài, iNut Platform là một nền tảng IoT của Việt Nam. Inut sẽ cung cấp cho người dùng một nền tảng cơ bản bao gồm máy chủ, phương thức bảo mật và các công cụ hỗ trợ để kết nối vạn vật vào internet. Tức là người dùng chỉ cần làm tốt phần “things”, còn lại phần “internet of” đã có iNut lo.

    Trong seri bài viết này, chúng ta sẽ tìm hiểu về iNut cảm biến, đây là một sản phẩm của nền tảng iNut được phát triển từ bo mạch ESP8266, iNut cảm biến là một module đa năng chính vì vậy nó rất thích hợp cho anh em vọc sĩ chúng ta và các sản phẩm prototype.

Đây là một thiết bị trung gian kết nối Arduino với thế giới internet (iNut cảm biến giao tiếp với Arduino qua chuẩn I2C)

II. Một số ứng dụng của IoT:

  • Công tắc wifi

    Một ứng dụng thực tế như sau: Vào một ngày đông lạnh ngắt, khi sắp hết giờ làm việc, bạn có thể bật máy nước nóng ở nhà trước qua mạng internet và khi về đến nhà thì bạn có thể tắm ngay mà không cần đợi, thật tuyệt phải không :D

  • Theo dõi thời tiết từ xa

Các thông tin về thời tiết có thể được thu thập theo thời gian thực ở bất cứ thời điểm nào nhờ Iot

  • Theo dõi nhà yến

Thiết bị theo dõi số lượng chim yến ra vào nhà nuôi kết nối internet

    Theo dõi điều kiện môi trường, số lượng yến ra vào, .... cũng là nhu cầu của nhiều hộ nuôi yến hiện nay.

  • Báo động

    Cùng với việc theo dõi nhờ các cảm biến thì báo động cũng là một phần của IoT ví dụ như báo nhiệt độ, độ ẩm trong nhà nấm, nhà yến vượt ngưỡng để từ đó người dùng sẽ biết được kịp thời và có phương hướng xử lý.

  • Và còn rất nhiều ứng dụng tuyệt vời khác mà IoT mang lại cho chúng ta <3

III. Chuẩn bị đồ nghề

    Tiếp theo, chúng ta hãy cùng bắt đầu tìm hiểu cách sử dụng iNut cảm biến nhé. Trong bài đầu tiên, chúng ta sẽ cần một số thứ sau đây

  • iNut cảm biến: Bạn có thể mua tại đây hoặc tự chế bằng cách nạp firmware vào ESP8266 (Nôm na firmware là phần mềm cơ sở nạp vào để biến ESP8266 thành iNut cảm biến)

    Hướng dẫn tự chế iNut cảm biến:

    Để tự chế, các bạn cần một con NodeMCU, sau đó bạn sẽ cần mua firmware iNut cảm biến tại đây.

Chọn "1 bus I2C..." => Thêm vào giỏ hàng => Vào giỏ hàng => Thanh toán

    Sau đó các bạn nạp firmware cho nó bằng hướng dẫn tại đây (Lưu ý hướng dẫn này là dành cho thiết bị "iNut i4 - Bốn nút nhấn", còn ở đây chúng ta dùng iNut cảm biến nên các bạn làm theo tương tự chứ không bắt chước y như bài hướng dẫn đó nha, với Activator Firmware là file "k1-fs1-8-sensor.bin" nhé)

  • Arduino Uno hoặc Mega
  • Cảm biến ánh sáng hoặc quang trở
  • Một vài con led
  • Cảm biến vật cản bằng hồng ngoại
  • Breadboard, dây cắm, .....
  • Một chiếc điện thoại thông minh đã cài app iNut: CH Play - App Store.

IV. Tiến hành

1. Kết nối iNut cảm biến với Arduino

    Với iNut cảm biến mua sẵn, đó là một shield tương thích với Arduino Uno, do đó khi mua về các bạn chỉ việc cắm thẳng vào Arduino và chơi thôi, đơn giản cực kỳ hehe.

    Còn với iNut cảm biến tự chế từ NodeMCU, các bạn phải kết nối với Arduino theo sơ đồ đi dây sau:

    iNut cung cấp cho người dùng 1 thư viện dành cho Arduino để chúng ta có thể lập trình cho Arduino thiết lập kết nối và làm việc với iNut cảm biến.

    Các bạn tải thư viện về tại đây và cài nó vào Arduino IDE. Các bạn cứ tiếp tục rồi mình sẽ giới thiệu từng lệnh của thư viện trong phần code ở các ví dụ

2. Kết nối iNut cảm biến với mạng internet

    Inut cảm biến sẽ kết nối với thế giới internet nhờ Wifi nhà bạn, do đó đầu tiên bạn cần cung cấp tên, pass wifi nhà bạn cho nó nha :D. Làm theo video hướng dẫn này:

3. iNut cảm biến có thể làm được gì?

    Như đã giới thiệu ở trên, iNut cảm biến là thiết bị trung gian kết nối Arduino với internet, cụ thể là kết nối với máy chủ của iNut. Sau khi Arduino kết nối với máy chủ iNut, chúng ta có thể theo dõi, điều khiển con Arduino đó qua bất kỳ nền tảng nào (App, web, một con Arduino khác, .....) nhờ vào những công cụ (Thư viện, API, ....) mà nền tảng iNut cung cấp cho người dùng chúng ta. Như vậy "vạn vật" đã được kết nối chung vào máy chủ của iNut để có thể tương tác qua lại với nhau - Đây chính là cốt lõi của IoT!

    iNut cảm biến có 3 chức năng:

a. Truyền dữ liệu từ Arduino đến máy chủ:

    iNut cảm biến có 8 luồng dữ liệu, tức là iNut cảm biến sẽ nhận từ Arduino 8 biến chứa dữ liệu để truyền lên máy chủ.

    Đối với dữ liệu analog (Có giá trị ở hệ thập phân) thì 1 luồng chỉ truyền được 1 giá trị tại 1 thời điểm.

    Còn đối với dữ liệu digital (Có giá trị ở hệ nhị phân) thì 1 luồng có thể truyền cùng lúc 16 giá trị tại 1 thời điểm. Mình sẽ gọi 1 giá trị digital này là 1 vị trí digital trên luồng dữ liệu để dễ giải thích code hơn nhé (Tức là 1 luồng có 16 vị trí digital)

Thực chất với dữ liệu là analog hay digital thì 1 luồng đó cũng chỉ có thể truyền 1 giá trị tại 1 thời điểm. 16 giá trị digital nói trên thực ra là 16 bit của biến dữ liệu được truyền đi trong luồng (Nếu các bạn không hiểu đoạn này thì cứ bỏ qua và tiếp tục nhé)

b. Gửi báo động lên máy chủ:

    Ngoài việc thu thập để lưu trữ và ngắm dữ liệu thì việc báo động khi các giá trị cảm biến vượt ngưỡng để giúp người dùng có phương án xử lý kịp thời cũng là 1 mục đích quan trọng của việc theo dõi các cảm biến. Chính vì vậy đây là chức năng không thể thiếu trong iNut cảm biến. Mỗi khi gửi một báo động, iNut cho phép chúng ta gửi kèm 1 mã báo động, mục đích của mã này là giúp chúng ta xác định được báo động này là báo động về vấn đề gì (ví dụ báo nhiệt độ cao quá mức, thấp qua mức, độ ẩm giảm quá mức, ......).

c. Gửi lệnh điều khiển từ máy chủ xuống Arduino:

    Một câu lệnh gửi từ máy chủ xuống Arduino (Thông qua iNut cảm biến) là một chuỗi có cấu trúc như sau:

"<Tên lệnh> <tham số 1> <tham số 2> <tham số 3> <tham số 4> ...... <tham số n>"

    Các câu lệnh mặc định của máy chủ gửi đến Arduino:

  • "TIME <năm> <tháng> <ngày> <giờ> <phút> <giây>"

Lệnh này được tự động gửi mỗi 5 giây để cập nhật thời gian thực

  • "ONLINE"

Lệnh này được tự động gửi mỗi 10 giây để thông báo rằng iNut cảm biến vẫn đang kết nối với máy chủ (Lệnh này không có tham số)

  • "ON <thứ tự (1 số) của nút nhấn trong các luồng iNut cảm biến>"

Lệnh này được gửi khi bạn nhấn vào biểu tượng nút nhấn trong app iNut để chuyển biểu tượng nút nhấn đó sang trạng thái bật.

  • "OFF <thứ tự (1 số) của nút nhấn trong các luồng iNut cảm biến>"

Lệnh này được gửi khi bạn nhấn vào biểu tượng nút nhấn trong app iNut để chuyển biểu tượng nút nhấn đó sang trạng thái tắt.

Mục đích của 2 lệnh ON/OFF này là để điều khiển (bằng app iNut) trạng thái Tắt/Bật cho các thiết bị OUTPUT kết nối với Arduino

Còn về tham số <thứ tự (1 số) của nút nhấn trong các luồng iNut cảm biến> mình sẽ giải thích ở ví dụ 3 bên dưới nhé!

4. Ví dụ 1 - Theo dõi cường độ ánh sáng:

    Tiếp theo chúng ta sẽ bắt đầu thực hành với iNut cảm biến nhé! Ở ví dụ số 1, chúng ta sẽ dùng Arduino đọc giá trị cường độ ánh sáng bằng quang trở rồi nhờ iNut cảm biến gửi dữ liệu lên máy chủ và chúng ta sẽ xem giá trị dữ liệu đó bằng app iNut trên điện thoại.

Sơ đồ nối dây quang trở với Arduino

    Các bạn nối dây quang trở với Arduino như sơ đồ trên (Điện trở thì 10k còn tụ thì có thể có hoặc không đều được nhé) và Arduino thì đã được nối với iNut cảm biến như đã nói ở mục 1 nhé. Với iNut cảm biến bán sẵn thì trên shield đã có các chân nối từ các chân Arduino ra, các bạn nối dây vào đó là được nhé :D

    Code cho Arduino (Mình đã giải thích các câu lệnh trong code rồi nhé, các bạn đọc không hiểu chỗ nào thì cứ comment bên dưới bài viết!):

#include <iNut.h>

iNut inut;// Khởi tạo đối tượng iNut

void setup() {
  // Lệnh thiết lập kết nối Arduino với iNut cảm biến,
  // trong đó 8 là số luồng dữ liệu của iNut cảm biến
  inut.setup(8);
                
  // Bắt buộc phải có bước này: Đặt giá trị ban đầu cho 8 luồng khi mới kết nối
  for(int i = 0;i<8;i++){
    // Lệnh đặt giá trị dữ liệu cho luồng thứ i
    // Ban đầu thì cứ cho cả 8 luồng nhận giá trị là 0
    inut.setValue(i, 0);
  }
}

void loop() {
  int val = analogRead(A5);// Đọc giá trị quang trở
  inut.setValue(0, val);// Đặt giá trị dữ liệu cho luồng số 0 là giá trị quang trở

  // Cần chạy câu lệnh này trong hàm loop
  inut.loop();
}

     Sau khi nạp code cho Arduino, các bạn mở app iNut ra (Nhớ là app đã kết nối với iNut cảm biến theo hướng dẫn ở trên rồi nhé), sau đó vào mục Cài Đặt => chọn thiết bị iNut cảm biến.

    Sau đó chọn mục Thuật sĩ cài đặt nhanh

    Vì ở đây chúng ta chỉ sử dụng 1 luồng dữ liệu cho 1 cảm biến ánh sáng (quang trở) nên chúng ta nhập số 1 vào ô Số lượng cảm biến analog nha, sau đó chọn Chạy trình thuật sĩ.

    Sau khi app báo chạy trình thuật sĩ thành công, các bạn tắt app đi và bật lại, sau đó vào mục Bảng điều khiển, chúng ta sẽ thấy phần giao diện hiển thị giá trị dữ liệu luồng số 0 - Giá trị quang trở ở cổng A5.

    Video thảnh quả:

5. Ví dụ 2 - Báo trộm:

    Ở ví dụ thứ 2, chúng ta sẽ dùng cảm biến vật cản hồng ngoại (Mình dùng cảm biến E18-D80NK) để phát hiện kẻ trộm rồi nhờ iNut cảm biến gửi báo động lên máy chủ, sau đó máy chủ gửi thông tin về app iNut trên điện thoại để app báo động cho chúng ta biết.

    Các bạn nối dây theo sơ đồ dây này nhé, dây vàng là dây tín hiêu, đen là GND, đỏ là VCC, trở thì 10k.

    Code cho Arduino (Mình đã giải thích các câu lệnh trong code rồi nhé)

#include <iNut.h>

iNut inut;// Khởi tạo đối tượng iNut

int chanCamBien = 2;
boolean trangThaiTruoc = LOW;

void setup() {
  // Thiết lập chế độ INPUT cho chân nối với cảm biến
  pinMode(chanCamBien, INPUT);

  // Lệnh thiết lập kết nối Arduino với iNut cảm biến,
  // trong đó 8 là số luồng dữ liệu của iNut cảm biến
  inut.setup(8);

  // Bắt buộc phải có bước này: Đặt giá trị ban đầu cho 8 luồng khi mới kết nối
  for (int i = 0; i < 8; i++) {
    // Lệnh đặt giá trị dữ liệu cho luồng thứ i
    // Ban đầu thì cứ cho cả 8 luồng nhận giá trị là 0
    inut.setValue(i, 0);
  }
}

void loop() {
  boolean trangThaiCamBien = digitalRead(chanCamBien);// Đọc giá trị cảm biến
  if (trangThaiCamBien != trangThaiTruoc) {
    if (trangThaiCamBien == HIGH) { // Nếu không có vật cản - Trạng thái cảm biến là HIGH
      // Lệnh đặt giá trị 1 (trạng thái HIGH) cho vị trí digital thứ 0 của luồng số 0
      inut.turnOn(0, 0);// turnOn(<luồng>, <vị trí digital>);
    } else { // Ngược lại nếu có vật cản
      // Lệnh đặt giá trị 0 (trạng thái LOW) cho vị trí digital thứ 0 của luồng số 0
      inut.turnOff(0, 0);// turnOff(<luồng>, <vị trí digital>);
      inut.alarm(0);// Gửi báo động đến máy chủ với mã báo động là 0
    }
    trangThaiTruoc = trangThaiCamBien;
  }

  // Cần chạy câu lệnh này trong hàm loop
  inut.loop();
}

    Sau khi nạp code, các bạn thực hiện lại bước thiết lập Trình thuật sĩ như ví dụ trên tuy nhiên ở bước nhập số, các bạn nhập Số lượng cảm biến analog là 0, còn Số lượng digital input là 1, vì ở đây chúng ta dùng 1 cảm biến digital input là cảm biến hồng ngoại. Mở lại app, vào mục Bảng điều khiển chúng ta sẽ thấy biểu tượng thông báo trạng thái cảm biến hồng ngoại, tên của biểu tượng này mặc định sẽ là Input #0.0 có nghĩa là input digital ở vị trí số 0 luồng 0 (Tương tự 0.1 là vị trí digital số 1 của luồng 0, ........), bạn có thể đổi tên của biểu tượng này (Cái này các bạn tự khám phá thêm nha -  Dễ lắm hehe :D). Tiếp theo các bạn nhấn vào mở khóa cái chuông báo động nếu nó chưa mở để có thể nhận thông báo báo động từ app nhé!

    Hướng dẫn tùy chỉnh nội dung báo động - Đây là nội dung phần thông báo gửi đến điện thoại khi điện thoại nhận báo động: Các bạn vào mục Cài đặt, chọn Đánh chỉ số thiết bị.

     Sau đó kéo xuống dưới cùng, nhập vào ô Mã định danh: "alarm_<mã báo động>". Vì trong code mình gửi báo động với mã 0 nên mình nhập alarm_0. Tiếp theo nhập nội dung báo động vào ô Giá trị định danh. Cuối cùng nhấn Lưu.

    Video thành quả:

6. Ví dụ 3 - Điều khiển đèn led:

    Ở ví dụ thứ 3, chúng ta sẽ thử tính năng gửi lệnh của iNut cảm biến, cụ thể là 2 lệnh "ON" và "OFF", như đã giới ở trên thì đây là 2 lệnh được gửi khi nhấn vào các biểu tượng nút nhấn trên giao diện app iNut. Chúng ta sẽ thử ví dụ dùng app iNut để điều khiển trạng thái của 2 đèn led nhé!

Sơ đồ nối dây

    Khác với 2 ví dụ trên, ở ví dụ này, chúng ta sẽ cài đặt trên app trước khi nạp code để mình giải thích phần tham số của lệnh trước nhé. Đầu tiên các bạn cấp nguồn cho iNut cảm biến, sau đó mở app iNut ra thực hiện lại bước cài đặt Trình thuật sĩ với số lượng cảm biến analog, số lượng digital input là 0, còn số lượng digital output là 2 vì ở đây mình dùng 2 chân output cho 2 led.

    Sau đó, tắt bật lại app và qua mục Bảng điều khiển, chúng ta sẽ thấy 2 nút nhấn tên: Output #0.0 và Output #0.1

    Tương tự như ví dụ 2 thì tên 2 nút nhấn này cho biết rằng vị trí digital thứ 0 và 1 của luồng số 0 biểu thị giá trị digital (Trạng thái Tắt/Bật) của nút nhấn - Cũng chính là trạng thái của Led.

    Khi nhấn vào các nút này, câu lệnh ON/OFF sẽ được gửi tới iNut cảm biến với tham số <thứ tự (1 số) của nút nhấn trong các luồng iNut cảm biến>. Dựa vào tham số này, Arduino khi nhận lệnh có thể xác định được nút nào được nhấn để điều khiển Sáng/Tắt đèn led tương ứng. Theo như tên của các nút nhấn trong giao diện thì thứ tự nút nhấn được xác định bởi 2 con số: Thứ tự luồng và thứ tự digital trong luồng đó. Khi gửi lệnh 2 con số này được chuyển đổi thành 1 con số - Đó chính là tham số <thứ tự (1 số) của nút nhấn trong các luồng iNut cảm biến>. Công thức chuyển thứ tự 2 số sang thứ tự 1 số:

200 + <thứ tự luồng>*16 + <thứ tự digital trong luồng>

    Cụ thể trong ví dụ này, khi nhấn 2 nút trên app, Arduino sẽ nhận được lệnh với tham số 200 tương ứng với nút Output #0.0 và 201 tương ứng với nút Output #0.1

    Code cho Arduino:

#include <iNut.h>

iNut inut;// Khởi tạo đối tượng iNut

const int SO_LED = 2;
int led[SO_LED] = {8, 9};// 2 bóng led được nối với chân 8,9 - Lưu trong mảng led

void setup() {
  // Thiết lập chế độ OUTPUT cho 2 chân nối với led
  pinMode(led[0], OUTPUT);
  pinMode(led[1], OUTPUT);

  // Trạng thái ban đầu của các led là tắt
  digitalWrite(led[0], LOW);
  digitalWrite(led[1], LOW);

  // Lệnh thiết lập kết nối Arduino với iNut cảm biến,
  // trong đó 8 là số luồng dữ liệu của iNut cảm biến
  inut.setup(8);

  // Bắt buộc phải có bước này: Đặt giá trị ban đầu cho 8 luồng khi mới kết nối
  for (int i = 0; i < 8; i++) {
    // Lệnh đặt giá trị dữ liệu cho luồng thứ i
    // Ban đầu thì cứ cho cả 8 luồng nhận giá trị là 0
    inut.setValue(i, 0);
  }

  // Khai báo cho iNut cảm biến: Khi nhận được lệnh "ON" thì chạy hàm onLed
  inut.addCommand("ON", onLed);
  // Khai báo cho iNut cảm biến: Khi nhận được lệnh "OFF" thì chạy hàm offLed
  inut.addCommand("OFF", offLed);
}

void loop() {
  // Cần chạy câu lệnh này trong hàm loop
  inut.loop();
}

void onLed() {
  char *thamSo = inut.next();// Lấy tham số (Lệnh ON chỉ có 1 tham số)
  int giaTri = atoi(thamSo);// Lệnh atoi sẽ chuyển 1 chuỗi thành số nguyên
  int thuTuLed = giaTri - 200;// Trừ 200 ra được thứ tự trong mảng led
  digitalWrite(led[thuTuLed], HIGH);
}

void offLed() {
  char *thamSo = inut.next();// Lấy tham số (Lệnh OFF chỉ có 1 tham số)
  int giaTri = atoi(thamSo);// Lệnh atoi sẽ chuyển 1 chuỗi thành số nguyên
  int thuTuLed = giaTri - 200;// Trừ 200 ra được thứ tự trong mảng led
  digitalWrite(led[thuTuLed], LOW);
}

    Khi nhận lệnh các tham số của lệnh được xếp vào một hàng chờ với thứ tự như thứ tự lúc gửi lệnh. Chúng ta sẽ dùng lệnh next(); để lấy tham số ở đầu hàng chờ, sau khi tham số được lấy ra bằng lệnh next(); thì nó sẽ được đưa ra khỏi hàng chờ và các tham số đứng sau sẽ được đẩy lên, chạy tiếp lệnh next(); trong code chúng ta sẽ lấy được tham số tiếp theo, cứ như thế tiếp tục đến hết hàng chờ.

Sơ đồ mô tả lệnh next();

    Video thành quả:

7. Ví dụ 4 - Cải tiến ví dụ 3

    Như trong video trên, các bạn sẽ thấy hiện tượng các nút bấm trong app sẽ chuyển về trạng thái tắt sau vài giây nhưng các đèn led vẫn sáng. Lí do là vì khi nhấn nút thì máy chủ chỉ gửi lệnh đến iNut cảm biến chứ không hề thay đổi trạng thái của các vị trí digital tương ứng với thứ tự nút nhấn trong luồng, sau vài giây app tự động đồng bộ trạng thái các nút nhấn trên giao diện với giá trị các vị trí digital tương ứng trong luồng nên chúng mới chuyển về trạng thái tắt, do đó tại client (Arduino), chúng ta cần có thao tác cập nhật trạng thái các vị trí digital nhằm đảm bảo thống nhất trạng thái led với trạng thái nút nhấn - Đây là chức năng giúp đồng bộ Client (Các thiết bị kết nối) với Server (máy chủ). Hãy tưởng tượng nếu không có chức năng này, khi đèn led đang sáng mà đột ngột mất điện, trong khi chúng ta đang ở xa nhìn vào app thì vẫn thấy nút nhấn ở trạng thái bật, sai sai nhể :v.

    Như vậy để khắc phục lỗi trên, chúng ta sẽ thêm vào code ở ví dụ 3 đoạn code cập nhật trạng thái các led vào các vị trí digital tương ứng với nút nhấn. Code mới:

#include <iNut.h>

iNut inut;// Khởi tạo đối tượng iNut

const int SO_LED = 2;
int led[SO_LED] = {8, 9}; //2 bóng led được nối với chân 8,9

void setup() {
  // Thiết lập chế độ OUTPUT cho 2 chân nối với led
  pinMode(led[0], OUTPUT);
  pinMode(led[1], OUTPUT);

  // Trạng thái ban đầu của các led là tắt
  digitalWrite(led[0], LOW);
  digitalWrite(led[1], LOW);

  // Lệnh thiết lập kết nối Arduino với iNut cảm biến,
  // trong đó 8 là số luồng dữ liệu của iNut cảm biến
  inut.setup(8);

  // Bắt buộc phải có bước này: Đặt giá trị ban đầu cho 8 luồng khi mới kết nối
  for (int i = 0; i < 8; i++) {
    // Lệnh đặt giá trị dữ liệu cho luồng thứ i
    // Ban đầu thì cứ cho cả 8 luồng nhận giá trị là 0
    inut.setValue(i, 0);
  }

  // Khai báo cho iNut cảm biến: Khi nhận được lệnh "ON" thì chạy hàm onLed
  inut.addCommand("ON", onLed);
  // Khai báo cho iNut cảm biến: Khi nhận được lệnh "OFF" thì chạy hàm offLed
  inut.addCommand("OFF", offLed);
}

void loop() {
  // cập nhật dữ liệu cho các vị trí digital tương ứng với nút nhấn - Trạng thái các led
  for (int i = 0; i < SO_LED; i++) {
    /* Có thể dùng lệnh digitalRead để đọc trạng thái
       của một chân cho dù chân này ở trạng thái OUTPUT
    */
    boolean trangThaiLed = digitalRead(led[i]);
    if (trangThaiLed == HIGH) { // Nếu Led sáng
      // Lệnh đặt giá trị 1 (trạng thái HIGH) cho vị trí digital thứ i của luồng số 0
      inut.turnOn(0, i);// turnOn(<luồng>, <vị trí digital>);
    } else { // Nếu Led tắt
      // Lệnh đặt giá trị 0 (trạng thái LOW) cho vị trí digital thứ i của luồng số 0
      inut.turnOff(0, i);// turnOff(<luồng>, <vị trí digital>);
    }
  }

  // Cần chạy câu lệnh này trong hàm loop
  inut.loop();
}

void onLed() {
  char *thamSo = inut.next();// Lấy tham số
  int giaTri = atoi(thamSo);// Lệnh atoi sẽ chuyển 1 chuỗi thành số nguyên
  int thuTuLed = giaTri - 200;
  digitalWrite(led[thuTuLed], HIGH);
}

void offLed() {
  char *thamSo = inut.next();// Lấy tham số
  int giaTri = atoi(thamSo);// Lệnh atoi sẽ chuyển 1 chuỗi thành số nguyên
  int thuTuLed = giaTri - 200;
  digitalWrite(led[thuTuLed], LOW);
}

    Video thành quả:

V. Lời kết:

    Ở bài đầu tiên, chúng ta đã biết được cách sử dụng các chức năng cơ bản của iNut cảm biến, khởi đầu như vầy là ổn rồi. Ở bài tiếp theo, mình sẽ giới thiệu với các bạn về MQTT và hướng dẫn cách tự làm cho mình 1 cái webapp để điều khiển và theo dõi thay cho app iNut nhé (Hiểu nôm na webapp là cái web có giao diện và tương tác như app điện thoại, vì là web nên có thể dùng trên mọi nền tảng hehe). Tạm biệt, chúc các bạn thành công!

lên
2 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Vỗ tay bật đèn với cảm biến âm thanh CN07

Chúng ta đã biết được rất nhiều cách để bật tắt các thiết bị qua nhiều bài viết ở cộng đồng, nhưng mình thấy chưa có bài nào dùng cảm biến âm thanh để bật tắt thiết bị, nên hôm nay mình xin viết bài này nhằm giới thiệu thêm cho các bạn.

lên
26 thành viên đã đánh giá bài viết này hữu ích.

Giới thiệu về Arduino 101

Xin chào các bạn. Hôm nay mình sẽ giới thiệu với các bạn một phiên bản arduino khá thú vị. Đó chính là Arduino 101. Chúng ta có thể nói rằng nó chính là phiên bản UNO nâng cấp. Vậy nó nâng cấp những gì chúng ta cùng tìm hiểu.

lên
13 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: