SỬ DỤNG INUT CẢM BIẾN LÀM 1 BỘ ACCESS CONTROL DỄ HAY KHÓ?

Mô Tả Dự Án 

Để điều khiển từ xa và đồng bộ dữ liệu trong thời gian thực qua internet dễ hay khó? đối với newbie thì thực sự rất khó, không biết nên bắt đầu từ đâu. Nhưng với iNut cảm biến thì mọi chuyện sẽ dễ hơn rất nhiều, nó là công cụ sẽ giúp bạn quyết định thành bại cho một dự án IOT dù nhỏ dù lớn. Hôm nay, mình sẽ cùng bạn làm một bộ access control cho chính cánh cửa trong phòng mình. Mình sẽ hướng dẫn bạn không chỉ điều khiển trên máy tính mà cũng có thể điều khiển trực tiếp trên điện thoại thông minh thông qua web app (nâng cao hơn sẽ là tự làm app riêng bằng app inventor hay thunkable - cái này sẽ có bài hướng dẫn lần sau). Các bạn có thể tùy chọn điều khiển trực tiếp qua localhost, điều khiển qua 3/4G v.v.. 

Nói nãy giờ cũng hơi dài rồi, cùng nhau bắt tay vô làm thôi.

I. Bạn Cần Chuẩn Bị Những Gì?

Phần Cứng

  • INut Cảm Biến
  • Arduino (mình xài UNO)
  • USB Type B (chúng ta hay gọi là dây nạp code)
  • Module 1 Relay (mình xài relay kích mức thấp)
  • khóa điện LY_03 ( mình xài 24V, các bạn có thể xài 12V tùy thích) kèm nguồn.

Cách Nối Dây

Khóa Điện DY_03

Nguồn 24V

Relay

Arduino UNO R3

VCC

 

COM

 

GND

GND

 

 

 

VCC

NO

 

 

 

5V

5V

 

 

GND

GND

 

 

IN

5

 

 

Phần Mềm

  • Trên điện thoại di động:
    • iNut - Platform (các bạn search trong apple store hoặc google play từ khóa inut là ra). Tải về trên Apple Store, tải về ở Google Play.
  • Trên máy tính:

Tham Khảo bài viết này để cài đặt môi trường cho iNut Node - RED IDE trên máy tính:http://arduino.vn/i...

II. Các Cài Đặt Khác

  • Cài Đặt Mạng Cho INut Cảm Biến: nếu bạn là người lần đầu tiên tiếp xúc với INut Cảm Biến, tham khảo bài viết này nhé : http://arduino.vn/tutorial/5929-ra-m... (bạn nào đã tiếp xúc rồi có thể bỏ qua bước này nhe. ) 
  • Video Hướng Dẫn Cài Đặt Wifi Cho iNut Cảm Biến: 

III. Lập Trình

Bạn Cần Chuẩn Bị Thư Viện Cho iNut Cảm Biến Cho Arduino : https://github.com/ngohuynhngockhanh... (tải nhanh)

Code Arduino :

#include <SPI.h>
#include <iNut.h>

iNut sensor;

#define OFF LOW
#define ON HIGH
// tùy vào relay kích để chỉnh lại phần OFF ON cho phù hợp
#define DY_03   5

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode (DY_03,OUTPUT);

digitalWrite(DY_03,OFF);// mặc định là ổ khóa điện được đóng
sensor.setup(1);
Serial.println("iNut Cam Bien - Xin Chao");
sensor.addCommand("LOCK",LockFunction);
}

void LockFunction()
{
  char *arg1 = sensor.next();
  Serial.println(arg1);
    if (*arg1 == NULL) //nothing
  return;
  if(strcmp(arg1,"1") == 0) // nếu được gửi tín hiệu là "1"
  {
    digitalWrite(DY_03,ON); // khóa mở
    Serial.println(F("DY_02 - Da Mo"));
    sensor.setValue(0,1);
  }
  else if(strcmp (arg1,"0") == 0) // nếu được gửi tín hiệu là "0"
  {
    digitalWrite(DY_03,OFF); // khóa đóng
    Serial.println(F("DY_02 - Da Dong"));
    sensor.setValue(0,0);
  }
  else {
    Serial.println("Khong nam trong tap hop lenh");
  }
}
void(* resetFunc) (void) = 0;
void loop() {
  static unsigned long lock_timer = 0; // ban đầu thời gian = 0
if (millis() - lock_timer > 10000UL)
{
resetFunc();
}
  sensor.loop();
  getMemoryFree();
}
int getMemoryFree() {// Trong trường hợp này, ta có thể hiểu extern sẽ khai báo một biến toàn cục trong chương trình (nếu chưa có) hoặc include một biến toàn cục đã được extern trước đó
  extern int __heap_start;
  extern int *__brkval; 
   //Dấu & phía trước tên biến / tên con trỏ sẽ cho ta biết vị trí ô nhớ mà nó đang đứng
  //Lưu ý: bài viết này không dành cho beginner và bạn cần tưởng tượng một chút để có thể mườn tượng vấn đề
  return (int) SP - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

Code iNut Node RED IDE:

các bạn vào link này để lấy code giao diện cho node red rồi tùy chỉnh màu sắc theo ý các bạn: https://ideone.com/QsY5YZ

[
    {
        "id": "7b9a0807.ce73c8",
        "type": "subflow",
        "name": "Lấy dữ từ iNut (10)",
        "info": "",
        "in": [
            {
                "x": 50,
                "y": 30,
                "wires": [
                    {
                        "id": "87c91422.62a1b8"
                    }
                ]
            }
        ],
        "out": [
            {
                "x": 1000,
                "y": 280,
                "wires": [
                    {
                        "id": "eea5251a.05e808",
                        "port": 0
                    }
                ]
            }
        ],
        "inputLabels": [
            "Nhận đầu vào MQTT IN từ iNut cảm biến"
        ],
        "outputLabels": [
            "Luồng cảm biến 1"
        ]
    },
    {
        "id": "87c91422.62a1b8",
        "type": "json",
        "z": "7b9a0807.ce73c8",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 165,
        "y": 84,
        "wires": [
            [
                "ad0dbf89.1666b"
            ]
        ]
    },
    {
        "id": "eea5251a.05e808",
        "type": "switch",
        "z": "7b9a0807.ce73c8",
        "name": "Phân luồn",
        "property": "relayId",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "0",
                "vt": "num"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 825.9869575500488,
        "y": 288.1562738418579,
        "wires": [
            []
        ]
    },
    {
        "id": "ad0dbf89.1666b",
        "type": "function",
        "z": "7b9a0807.ce73c8",
        "name": "Lặp",
        "func": "if (!msg.states) {\n    msg.states = msg.payload\n    msg.i = 0\n    return msg;\n} else {\n    msg.i++\n    if (msg.states[msg.i])\n        return msg;\n}\n",
        "outputs": 1,
        "noerr": 0,
        "x": 327.89060974121094,
        "y": 83.33600330352783,
        "wires": [
            [
                "9ad5ebb3.5fcbc8"
            ]
        ]
    },
    {
        "id": "9ad5ebb3.5fcbc8",
        "type": "function",
        "z": "7b9a0807.ce73c8",
        "name": "Lấy trạng thái thiết bị",
        "func": "msg.relayId = msg.i\nmsg.payload = msg.states[msg.i].state\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 477.89060974121094,
        "y": 183.33600330352783,
        "wires": [
            [
                "ad0dbf89.1666b",
                "eea5251a.05e808"
            ]
        ]
    },
    {
        "id": "7ca3223e.632e0c",
        "type": "subflow:7b9a0807.ce73c8",
        "z": "a03f7e6d.55604",
        "name": "",
        "x": 430,
        "y": 260,
        "wires": [
            [
                "b990965d.4e3c38"
            ]
        ]
    },
    {
        "id": "6cb706fa.834538",
        "type": "function",
        "z": "a03f7e6d.55604",
        "name": "",
        "func": "var command = msg.topic + ' ';\nif (msg.payload == 1) {\n    command = command + '1 OFF';\n} else {\n    command = command + '0 ON';\n}\nmsg.payload = {\n    id: 0,\n    command: command\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 1450,
        "y": 200,
        "wires": [
            [
                "3eeaa6ea.33deea"
            ]
        ]
    },
    {
        "id": "eaa12ff5.7f651",
        "type": "ui_button",
        "z": "a03f7e6d.55604",
        "name": "",
        "group": "72aa2c44.6511e4",
        "order": 3,
        "width": "2",
        "height": "2",
        "passthru": false,
        "label": "OFF",
        "tooltip": "",
        "color": "RED",
        "bgcolor": "yellow",
        "icon": "",
        "payload": "0",
        "payloadType": "num",
        "topic": "LOCK",
        "x": 1270,
        "y": 220,
        "wires": [
            [
                "6cb706fa.834538"
            ]
        ]
    },
    {
        "id": "46aabd82.3304b4",
        "type": "ui_button",
        "z": "a03f7e6d.55604",
        "name": "",
        "group": "72aa2c44.6511e4",
        "order": 1,
        "width": "2",
        "height": "2",
        "passthru": false,
        "label": "ON",
        "tooltip": "",
        "color": "RED",
        "bgcolor": "yellow",
        "icon": "",
        "payload": "1",
        "payloadType": "num",
        "topic": "LOCK",
        "x": 1270,
        "y": 180,
        "wires": [
            [
                "6cb706fa.834538"
            ]
        ]
    },
    {
        "id": "1575f5b.b7df10a",
        "type": "ui_text",
        "z": "a03f7e6d.55604",
        "group": "c16842a5.e4714",
        "order": 1,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Status",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "x": 1110,
        "y": 160,
        "wires": []
    },
    {
        "id": "cd16af16.09c5b",
        "type": "change",
        "z": "a03f7e6d.55604",
        "name": "ONLINE",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "ONLINE",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 960,
        "y": 120,
        "wires": [
            [
                "1575f5b.b7df10a",
                "3d53a718.5b8b58"
            ]
        ]
    },
    {
        "id": "a61218d.370e7e8",
        "type": "switch",
        "z": "a03f7e6d.55604",
        "name": "Kiểm tra ONLINE",
        "property": "payload.status",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "0",
                "vt": "num"
            },
            {
                "t": "eq",
                "v": "-1",
                "vt": "num"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 790,
        "y": 160,
        "wires": [
            [
                "cd16af16.09c5b"
            ],
            [
                "a0e398cf.880838"
            ]
        ]
    },
    {
        "id": "a0e398cf.880838",
        "type": "change",
        "z": "a03f7e6d.55604",
        "name": "OFFLINE",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "OFFLINE",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 960,
        "y": 180,
        "wires": [
            [
                "1575f5b.b7df10a"
            ]
        ]
    },
    {
        "id": "99cf9920.2b8c68",
        "type": "json",
        "z": "a03f7e6d.55604",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 630,
        "y": 160,
        "wires": [
            [
                "a61218d.370e7e8"
            ]
        ]
    },
    {
        "id": "d39c7e26.477bf",
        "type": "inject",
        "z": "a03f7e6d.55604",
        "name": "",
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "x": 110,
        "y": 120,
        "wires": [
            [
                "b55a77df.292828"
            ]
        ]
    },
    {
        "id": "3eeaa6ea.33deea",
        "type": "link out",
        "z": "a03f7e6d.55604",
        "name": "OUT_RES_PORT",
        "links": [
            "b6df0cb7.9c668"
        ],
        "x": 1555,
        "y": 200,
        "wires": []
    },
    {
        "id": "b6df0cb7.9c668",
        "type": "link in",
        "z": "a03f7e6d.55604",
        "name": "REST_POST",
        "links": [
            "3850f97b.cf5b76",
            "3eeaa6ea.33deea",
            "b3ced61c.061d58",
            "361dbb9e.e7b7e4"
        ],
        "x": 35,
        "y": 180,
        "wires": [
            [
                "5efd3dcc.07ddc4"
            ]
        ]
    },
    {
        "id": "5b61d3a7.4d19bc",
        "type": "ui_gauge",
        "z": "a03f7e6d.55604",
        "name": "",
        "group": "72aa2c44.6511e4",
        "order": 2,
        "width": "2",
        "height": "2",
        "gtype": "gage",
        "title": "LOCK",
        "label": "units",
        "format": "{{value}}",
        "min": 0,
        "max": "1",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "",
        "seg2": "",
        "x": 770,
        "y": 300,
        "wires": []
    },
    {
        "id": "b4943ab2.a09298",
        "type": "link out",
        "z": "a03f7e6d.55604",
        "name": "RELOAD",
        "links": [
            "1548c7f6.656998"
        ],
        "x": 1575,
        "y": 100,
        "wires": []
    },
    {
        "id": "1548c7f6.656998",
        "type": "link in",
        "z": "a03f7e6d.55604",
        "name": "RELOAD",
        "links": [
            "b4943ab2.a09298"
        ],
        "x": 95,
        "y": 40,
        "wires": [
            [
                "b55a77df.292828"
            ]
        ]
    },
    {
        "id": "a3d75404.741bf8",
        "type": "change",
        "z": "a03f7e6d.55604",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "POST",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 470,
        "y": 180,
        "wires": [
            [
                "99cf9920.2b8c68"
            ]
        ]
    },
    {
        "id": "3d53a718.5b8b58",
        "type": "switch",
        "z": "a03f7e6d.55604",
        "name": "",
        "property": "topic",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "POST",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 1110,
        "y": 100,
        "wires": [
            [
                "4eec935.cffc06c",
                "411c08fb.7f07e8"
            ]
        ]
    },
    {
        "id": "4eec935.cffc06c",
        "type": "delay",
        "z": "a03f7e6d.55604",
        "name": "",
        "pauseType": "delay",
        "timeout": "50",
        "timeoutUnits": "milliseconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "x": 1270,
        "y": 80,
        "wires": [
            [
                "3892ce03.26e722"
            ]
        ]
    },
    {
        "id": "3892ce03.26e722",
        "type": "change",
        "z": "a03f7e6d.55604",
        "name": "",
        "rules": [
            {
                "t": "delete",
                "p": "topic",
                "pt": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1440,
        "y": 100,
        "wires": [
            [
                "b4943ab2.a09298"
            ]
        ]
    },
    {
        "id": "411c08fb.7f07e8",
        "type": "delay",
        "z": "a03f7e6d.55604",
        "name": "",
        "pauseType": "delay",
        "timeout": "250",
        "timeoutUnits": "milliseconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "x": 1270,
        "y": 120,
        "wires": [
            [
                "3892ce03.26e722"
            ]
        ]
    },
    {
        "id": "e147a1d.b7cbe6",
        "type": "mqtt in",
        "z": "a03f7e6d.55604",
        "name": "[MQTT-IN]iNut cảm biến - iNut M1",
        "topic": "request/dkjTobCPXidsp7X1NqzKFQbQ4z02/SyVEreTK4/ccff6a10caddfc13fee619eb7065f4cb302880090088",
        "qos": "2",
        "broker": "5421618d.ae96c",
        "x": 160,
        "y": 260,
        "wires": [
            [
                "7ca3223e.632e0c"
            ]
        ]
    },
    {
        "id": "b55a77df.292828",
        "type": "http request",
        "z": "a03f7e6d.55604",
        "name": "[REST][GET]iNut cảm biến - iNut M1",
        "method": "GET",
        "ret": "txt",
        "url": "https://c...content-available-to-author-only...e.vn/api/1.0/request/dkjTobCPXidsp7X1NqzKFQbQ4z02/SyVEreTK4/ccff6a10caddfc13fee619eb7065f4cb302880090088/req_device",
        "tls": "",
        "x": 370,
        "y": 120,
        "wires": [
            [
                "99cf9920.2b8c68"
            ]
        ]
    },
    {
        "id": "5efd3dcc.07ddc4",
        "type": "http request",
        "z": "a03f7e6d.55604",
        "name": "[REST][POST]iNut cảm biến - iNut M1",
        "method": "POST",
        "ret": "txt",
        "url": "https://c...content-available-to-author-only...e.vn/api/1.0/request/dkjTobCPXidsp7X1NqzKFQbQ4z02/SyVEreTK4/ccff6a10caddfc13fee619eb7065f4cb302880090088/req_device_toggle",
        "tls": "",
        "x": 210,
        "y": 180,
        "wires": [
            [
                "a3d75404.741bf8"
            ]
        ]
    },
    {
        "id": "b990965d.4e3c38",
        "type": "change",
        "z": "a03f7e6d.55604",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "Trạng Thái",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 610,
        "y": 260,
        "wires": [
            [
                "5b63ccaf.7c4fe4",
                "5b61d3a7.4d19bc"
            ]
        ]
    },
    {
        "id": "5b63ccaf.7c4fe4",
        "type": "function",
        "z": "a03f7e6d.55604",
        "name": "",
        "func": "var trangthai;\nif (msg.payload == 0) {\n    trangthai = \"Đóng\";\n}\nelse if (msg.payload == 1) {\n    trangthai = \"Mở\";\n}\nmsg.payload = trangthai;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 770,
        "y": 240,
        "wires": [
            [
                "ccfdd94f.6e6228"
            ]
        ]
    },
    {
        "id": "ccfdd94f.6e6228",
        "type": "ui_text",
        "z": "a03f7e6d.55604",
        "group": "72aa2c44.6511e4",
        "order": 0,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Trạng Thái: ",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "x": 950,
        "y": 240,
        "wires": []
    },
    {
        "id": "72aa2c44.6511e4",
        "type": "ui_group",
        "z": "",
        "name": "Group 1",
        "tab": "e59646ac.c34d18",
        "order": 1,
        "disp": false,
        "width": "6",
        "collapse": false
    },
    {
        "id": "c16842a5.e4714",
        "type": "ui_group",
        "z": "",
        "name": "Group 2",
        "tab": "e59646ac.c34d18",
        "order": 2,
        "disp": false,
        "width": "6",
        "collapse": false
    },
    {
        "id": "5421618d.ae96c",
        "type": "mqtt-broker",
        "name": "",
        "broker": "mqtt.mysmarthome.vn",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": ""
    },
    {
        "id": "e59646ac.c34d18",
        "type": "ui_tab",
        "name": "Tab 1",
        "icon": "dashboard",
        "order": 1
    }
]

Giao Diện Block iNut  Node - RED IDE

Giao Diện Làm Việc

 

Nếu các bạn gặp khó khăn khi thực hiện dự án này, hãy gọi cho mình để được sự trợ giúp nhé ( sđt mình: 037 3998 468 ). Đừng ngần ngại wink

IV. Kết Quả Hôm Nay:

Cùng chiêm ngưỡng thành quả của chúng ta nào (video dưới)

Đi ra ngoài và làm ngay 1 chai coca cola mát lạnh để tự thưởng cho thành quả của chúng ta nào, chúc các bạn thành công.

Youtube: 
lên
6 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ả

HƯỚNG DẪN SỬ DỤNG INUT CẢM BIẾN VÀ NODE RED IDE ĐỂ HIỆN THỊ BIỂU ĐỒ THỜI TIẾT

Chào các bạn, hôm nay mình sẽ cùng các bạn làm một ví dụ điển hình về thế mạnh của iNut Node - RED IDE. Đặt vấn đề đơn giản thế này, nếu bây giờ các bạn muốn làm một giao diện về biểu đồ ( biểu đồ gió, mưa, lưu lượng nước v.v..) thì sao nhỉ, với những bạn không phải chuyên về làm phần mềm hay làm web mà chỉ quen làm phần cứng (như mình) thì ôi thôi, vấn đề làm front-end, back-end cho web nó quá xa vời với mình, chưa kể còn đồng bộ dữ liệu theo thời gian thực, v.v.. Suy nghĩ mới tới đó là thấy có quá nhiều rào cản để một hardware-er như tụi mình muốn làm một dự án IOT nhỏ để giám sát bằng biểu đồ. 

Nhưng, với iNut Node - RED IDE, bạn sẽ không phải lo lắng vấn đề giao diện nữa, chỉ cần những khối lệnh kéo thả đơn giản là bạn đã có thể làm ra một giao diện đơn giản để giám sát rồi. Thần kì phải không nào, trong bài viết lần này, mình sẽ hướng dẫn bạn cách sử dụng iNut cảm biến và iNut Node RED - IDE để làm việc này. Bắt tay vào làm nhé.

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

Hướng Dẫn Cách Setup MQTT-Broker Trên Raspbery-Pi

MQTT (Message Queuing Telemetry Transport) là một giao thức gửi dạng publish/subcribe sử dụng cho các thiết bị IOT (Internet Of Things) với băng thông thấp, độ tin cậy cao và khả năng được sử dụng trong các hệ thống mạng không ổn định. MQTT được định nghĩa rất nhiều, rất chi tiết trên google, chỉ cần lên google và search với từ khóa: MQTT, what is MQTT, MQTT mosquitto, v.v...

 

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