Học liệu

Hướng Dẫn Làm 1 Webapp Đơn Giản Thông Qua iNut Cảm Biến Và MQTT-Broker Trên Raspberry

  • 18/09/2020
  • Học liệu

Hướng Dẫn Làm 1 Webapp Đơn Giản Thông Qua iNut Cảm Biến Và MQTT-Broker Trên Raspberry

Sử dụng iNut cảm biến kết nối với MQTT-Local để xuất dữ liệu lên Node Red từ đó điều khiển bật tắt 1 đèn led đơn giản. 

I. Chuẩn bị.

  • Raspberry-Pi (mình xài model 3B+)
  • Setup sẵn như bài trước tại đây
  • Máy tính cài sẵn iNut-Node-RED-IDE. Các bạn có thể xem tại đây luôn nha
  • Nguồn ổn định cho raspbery-Pi

II. Bắt đầu setup.

Bước 1 Khởi động iNut-Node-RED-IDE

Các bạn mở Command Prompt ( phím Windows + R) nhâp “cmd”

Sau đó bạn nhập lệnh:

  1. cd iNut-Node-RED-IDE (sau đóEnter và nhp tiếp lnh bên dưới vào)
  2. npm start

Bước 2 Setup thông số cho các khối trên iNut-Node-RED-IDE:

Các bạn truy cập vào địa chỉ  http://localhost:1880/...

Sau đó các bạn thay đổi địa chỉ MQTT của ngõ vào [MQTT_IN]XXX (XXX là tên thiết bị iNut cảm biến của bạn; ở đây mình đã sửa thành khối lệnh có tên là IN_MQTT_Raspberry ) như sau:

Ở đây đang hiển thị địa chỉ mặc định của thiết bị kết nối tới MQTT của MySmartHome 

Sau đó bạn click vào ô có hình màu đỏ như bên dưới để thay đổi cài đặt MQTT mặc định

 

Ở phần Server các bạn thay địa chỉ “mqtt.mysmarthome.vn” thành địa chỉ của Raspberry nhé

Các bạn có thể truy cập vào Terminal của Pi nhập “ip a” để xem địa chỉ IP hoặc thu nhỏ cửa sổ Remote Control nhìn góc trên bên trái sẽ có hiển thị địa chỉ của Pi.

Đây, mình đã sửa xong địa chỉ thành địa chỉ của Raspberry rồi

Sau đó bạn chọn sang Tab Security

Các bạn nhập Username và Password của MQTT-Broker mà các bạn đã tạo. Sau đó bạn nhớ bấm vào Update nhé

Tiếp theo các bạn sẽ Set Topic cho Raspberry như hình bên dưới này nhé.

Để tìm được địa chỉ Topic của thiết bị iNut cảm biến, bạn truy cập vào App iNut vào thiết bị của bạn kéo xuống tìm dòng chữ “Mã thiết bị” và nhập vào ô Topic nhé. 

Lưu ý: Trong app iNut bạn vào mục "Thông số kỹ thuật" của thiết bị và điền vào các thông tin còn thiếu như hình phía bên dưới nha 

Hoặc bạn có thể truy cập vào địa chỉ https://inut-hotfix.mysystemservice.... để có được giao diện như mình bên trên nha.

Tiếp theo bạn kéo 1 khối debug ra để debug kiểm tra khối lệnh IN_MQTT_Raspberry sau khi hiệu chỉnh các thông số nhé

Đầu tiên bạn bấm vào ô vuông màu xanh phía sau khối debug(số 1), tiếp theo bạn chọn sang Tab debug (số 2), cuối cùng là quan sát cửa sổ lệnh debug (số 3) chạy như thế nào nhé.

Sau khi debug xong các bạn kết nối các khối trên lại với nhau và chọn Deploy nha

Đây là code Node-Red nha :

  1. [
  2. ​"id": "36cf6cf2.8b1414"
  3. ​"type": "subflow"
  4. ​"name": "Lấy dữ từ iNut"
  5. ​"info": ""
  6. ​"in":
  7. ​"x": 50
  8. ​"y": 30
  9. ​"wires":
  10. ​"id": "51957e77.05539
  11. ​]
  12. ​"out":
  13. ​"x": 859.0000343322754
  14. ​"y": 98.00000190734863
  15. ​"wires":
  16. ​"id": "5c0be9b8.8ca268"
  17. ​"port":
  18. ​}
  19. ​"x": 968.0000343322754
  20. ​"y": 102.00000286102295
  21. ​"wires":
  22. ​"id": "5c0be9b8.8ca268"
  23. ​"port":
  24. ​}
  25. ​"x": 1048.9999732971191
  26. ​"y": 101.00000381469727
  27. ​"wires":
  28. ​"id": "5c0be9b8.8ca268"
  29. ​"port":
  30. ​}
  31. ​"x": 1059
  32. ​"y": 253
  33. ​"wires":
  34. ​"id": "5c0be9b8.8ca268"
  35. ​"port":
  36. ​}
  37. ​"x": 1102
  38. ​"y": 318
  39. ​"wires":
  40. ​"id": "5c0be9b8.8ca268"
  41. ​"port":
  42. ​}
  43. ​"x": 1116
  44. ​"y": 399
  45. ​"wires":
  46. ​"id": "5c0be9b8.8ca268"
  47. ​"port":
  48. ​}
  49. ​"x": 1108
  50. ​"y": 444
  51. ​"wires":
  52. ​"id": "5c0be9b8.8ca268"
  53. ​"port":
  54. ​}
  55. ​"x": 1006
  56. ​"y": 489
  57. ​"wires":
  58. ​"id": "5c0be9b8.8ca268"
  59. ​"port":
  60. ​]
  61. ​"inputLabels":
  62. ​"Nhận đầu vào MQTT IN từ iNut cảm biến
  63. ​]
  64. ​"outputLabels":
  65. ​"Luồng cảm biến 1"
  66. ​"Luồng cảm biến 2"
  67. ​"Luồng cảm biến 3"
  68. ​"Luồng cảm biến 4"
  69. ​"Luồng cảm biến 5"
  70. ​"Luồng cảm biến 6"
  71. ​"Luồng cảm biến 7"
  72. ​"Luồng cảm biến 8
  73. ​}
  74. ​"id": "51957e77.05539"
  75. ​"type": "json"
  76. ​"z": "36cf6cf2.8b1414"
  77. ​"name": ""
  78. ​"property": "payload"
  79. ​"action": "str"
  80. ​"pretty": false
  81. ​"x": 165
  82. ​"y": 84
  83. ​"wires":
  84. ​"f5e709f0.fd4ac8
  85. ​}
  86. ​"id": "5c0be9b8.8ca268"
  87. ​"type": "switch"
  88. ​"z": "36cf6cf2.8b1414"
  89. ​"name": "Phân luồn"
  90. ​"property": ""
  91. ​"propertyType": "msg"
  92. ​"rules":
  93. ​"t": "eq"
  94. ​"v": "0"
  95. ​"vt": "num
  96. ​}
  97. ​"t": "eq"
  98. ​"v": "1"
  99. ​"vt": "str
  100. ​}
  101. ​"t": "eq"
  102. ​"v": "2"
  103. ​"vt": "str
  104. ​}
  105. ​"t": "eq"
  106. ​"v": "3"
  107. ​"vt": "str
  108. ​}
  109. ​"t": "eq"
  110. ​"v": "4"
  111. ​"vt": "str
  112. ​}
  113. ​"t": "eq"
  114. ​"v": "5"
  115. ​"vt": "str
  116. ​}
  117. ​"t": "eq"
  118. ​"v": "6"
  119. ​"vt": "str
  120. ​}
  121. ​"t": "eq"
  122. ​"v": "7"
  123. ​"vt": "str
  124. ​]
  125. ​"checkall": "true"
  126. ​"repair": false
  127. ​"outputs":8
  128. ​"x": 825.9869575500488
  129. ​"y": 288.1562738418579
  130. ​"wires":
  131. ​[]
  132. ​[]
  133. ​[]
  134. ​[]
  135. ​[]
  136. ​[]
  137. ​[]
  138. ​[
  139. ​}
  140. ​"id": "f5e709f0.fd4ac8"
  141. ​"type": "function"
  142. ​"z": "36cf6cf2.8b1414"
  143. ​"name": "Lặp"
  144. ​"func": "if (!msg.states) {\n msg.states = msg.payload\n msg.i = 0\n return msg;\n} else {\n if (msg.states[msg.i])\n return msg;\n}\n"
  145. ​"outputs":1
  146. ​"noerr":0
  147. ​"x": 327.89060974121094
  148. ​"y": 83.33600330352783
  149. ​"wires":
  150. ​"171d797e.cc7e67
  151. ​}
  152. ​"id": "171d797e.cc7e67"
  153. ​"type": "function"
  154. ​"z": "36cf6cf2.8b1414"
  155. ​"name": "Lấy trạng thái thiết bị"
  156. ​"func": "msg.relayId = msg.i\nreturn msg;"
  157. ​"outputs":1
  158. ​"noerr":0
  159. ​"x": 477.89060974121094
  160. ​"y": 183.33600330352783
  161. ​"wires":
  162. ​"f5e709f0.fd4ac8"
  163. ​"5c0be9b8.8ca268
  164. ​}
  165. ​"id": "77252d23.ef9384"
  166. ​"type": "debug"
  167. ​"z": "160a8256.91137e"
  168. ​"name": "in ra màn hình để debug thông tin"
  169. ​"active": false
  170. ​"tosidebar": true
  171. ​"console": false
  172. ​"tostatus": false
  173. ​"complete": "payload"
  174. ​"x": 980
  175. ​"y": 260
  176. ​"wires": [
  177. ​}
  178. ​"id": "7be55555.967bdc"
  179. ​"type": "function"
  180. ​"z": "160a8256.91137e"
  181. ​"name": "Chuẩn bị lệnh trước khi gửi đến iNut cảm biến"
  182. ​"func": "var json = {\"id\": 0, \"command\": msg.payload};\nmsg.payload = json;\n\nreturn msg;"
  183. ​"outputs":1
  184. ​"noerr":0
  185. ​"x": 620
  186. ​"y": 220
  187. ​"wires":
  188. ​"77252d23.ef9384"
  189. ​"bc0db1a4.dc6ce
  190. ​}
  191. ​"id": "2a08fa4e.66ff86"
  192. ​"type": "ui_gauge"
  193. ​"z": "160a8256.91137e"
  194. ​"name": ""
  195. ​"group": "8cc674a4.10e3f8"
  196. ​"order":2
  197. ​"width": "3"
  198. ​"height": "3"
  199. ​"gtype": "gage"
  200. ​"title": "Data 1"
  201. ​"label": ""
  202. ​"format": "{{value}}"
  203. ​"min":0
  204. ​"max": "10000"
  205. ​"colors":
  206. ​"#1f964f"
  207. ​"#e6e600"
  208. ​"#ca3838
  209. ​]
  210. ​"seg1": ""
  211. ​"seg2": ""
  212. ​"x": 1170
  213. ​"y": 440
  214. ​"wires": [
  215. ​}
  216. ​"id": "f1471541.63de28"
  217. ​"type": "ui_gauge"
  218. ​"z": "160a8256.91137e"
  219. ​"name": ""
  220. ​"group": "8cc674a4.10e3f8"
  221. ​"order":1
  222. ​"width": "3"
  223. ​"height": "3"
  224. ​"gtype": "gage"
  225. ​"title": "Data 0"
  226. ​"label": "mưa"
  227. ​"format": "{{value}}"
  228. ​"min":0
  229. ​"max": "10000"
  230. ​"colors":
  231. ​"#1f964f"
  232. ​"#e6e600"
  233. ​"#ca3838
  234. ​]
  235. ​"seg1": ""
  236. ​"seg2": ""
  237. ​"x": 1170
  238. ​"y": 400
  239. ​"wires": [
  240. ​}
  241. ​"id": "5e3ed30b.84645c"
  242. ​"type": "ui_gauge"
  243. ​"z": "160a8256.91137e"
  244. ​"name": ""
  245. ​"group": "8cc674a4.10e3f8"
  246. ​"order":4
  247. ​"width": "3"
  248. ​"height": "3"
  249. ​"gtype": "gage"
  250. ​"title": "Data 3"
  251. ​"label": ""
  252. ​"format": "{{value}}"
  253. ​"min":0
  254. ​"max": "10000"
  255. ​"colors":
  256. ​"#1f964f"
  257. ​"#e6e600"
  258. ​"#ca3838
  259. ​]
  260. ​"seg1": ""
  261. ​"seg2": ""
  262. ​"x": 1169
  263. ​"y": 522.8333129882812
  264. ​"wires": [
  265. ​}
  266. ​"id": "eda77085.d01b5"
  267. ​"type": "ui_gauge"
  268. ​"z": "160a8256.91137e"
  269. ​"name": ""
  270. ​"group": "8cc674a4.10e3f8"
  271. ​"order":3
  272. ​"width": "3"
  273. ​"height": "3"
  274. ​"gtype": "gage"
  275. ​"title": "Data 2"
  276. ​"label": "mưa"
  277. ​"format": "{{value}}"
  278. ​"min":0
  279. ​"max": "10000"
  280. ​"colors":
  281. ​"#1f964f"
  282. ​"#e6e600"
  283. ​"#ca3838
  284. ​]
  285. ​"seg1": ""
  286. ​"seg2": ""
  287. ​"x": 1168.09126663208
  288. ​"y": 482.124960899353
  289. ​"wires": [
  290. ​}
  291. ​"id": "e2aa7aa2.845738"
  292. ​"type": "ui_gauge"
  293. ​"z": "160a8256.91137e"
  294. ​"name": ""
  295. ​"group": "a532b78d.8303b8"
  296. ​"order":2
  297. ​"width": "3"
  298. ​"height": "3"
  299. ​"gtype": "gage"
  300. ​"title": "Data 5"
  301. ​"label": ""
  302. ​"format": "{{value}}"
  303. ​"min":0
  304. ​"max": "10000"
  305. ​"colors":
  306. ​"#1f964f"
  307. ​"#e6e600"
  308. ​"#ca3838
  309. ​]
  310. ​"seg1": ""
  311. ​"seg2": ""
  312. ​"x": 1167
  313. ​"y": 607.8333129882812
  314. ​"wires": [
  315. ​}
  316. ​"id": "88f2c510.769e58"
  317. ​"type": "ui_gauge"
  318. ​"z": "160a8256.91137e"
  319. ​"name": ""
  320. ​"group": "a532b78d.8303b8"
  321. ​"order":1
  322. ​"width": "3"
  323. ​"height": "3"
  324. ​"gtype": "gage"
  325. ​"title": "Data 4"
  326. ​"label": "mưa"
  327. ​"format": "{{value}}"
  328. ​"min":0
  329. ​"max": "10000"
  330. ​"colors":
  331. ​"#1f964f"
  332. ​"#e6e600"
  333. ​"#ca3838
  334. ​]
  335. ​"seg1": ""
  336. ​"seg2": ""
  337. ​"x": 1166.09126663208
  338. ​"y": 567.124960899353
  339. ​"wires": [
  340. ​}
  341. ​"id": "312b32b7.b644ee"
  342. ​"type": "ui_gauge"
  343. ​"z": "160a8256.91137e"
  344. ​"name": ""
  345. ​"group": "a532b78d.8303b8"
  346. ​"order":4
  347. ​"width": "3"
  348. ​"height": "3"
  349. ​"gtype": "gage"
  350. ​"title": "Data 7"
  351. ​"label": ""
  352. ​"format": "{{value}}"
  353. ​"min":0
  354. ​"max": "10000"
  355. ​"colors":
  356. ​"#1f964f"
  357. ​"#e6e600"
  358. ​"#ca3838
  359. ​]
  360. ​"seg1": ""
  361. ​"seg2": ""
  362. ​"x": 1166
  363. ​"y": 690.6666259765625
  364. ​"wires": [
  365. ​}
  366. ​"id": "4f03abee.64fdb4"
  367. ​"type": "ui_gauge"
  368. ​"z": "160a8256.91137e"
  369. ​"name": ""
  370. ​"group": "a532b78d.8303b8"
  371. ​"order":3
  372. ​"width": "3"
  373. ​"height": "3"
  374. ​"gtype": "gage"
  375. ​"title": "Data 6"
  376. ​"label": "mưa"
  377. ​"format": "{{value}}"
  378. ​"min":0
  379. ​"max": "10000"
  380. ​"colors":
  381. ​"#1f964f"
  382. ​"#e6e600"
  383. ​"#ca3838
  384. ​]
  385. ​"seg1": ""
  386. ​"seg2": ""
  387. ​"x": 1165.09126663208
  388. ​"y": 649.9582738876343
  389. ​"wires": [
  390. ​}
  391. ​"id": "261ffcb1.4895d4"
  392. ​"type": "ui_text_input"
  393. ​"z": "160a8256.91137e"
  394. ​"name": ""
  395. ​"label": "Gửi lệnh xuống iNut cảm biến"
  396. ​"group": "8cc674a4.10e3f8"
  397. ​"order":5
  398. ​"width": "4"
  399. ​"height": "1"
  400. ​"passthru": true
  401. ​"mode": "text"
  402. ​"delay": "0"
  403. ​"topic": ""
  404. ​"x": 270
  405. ​"y": 220
  406. ​"wires":
  407. ​"7be55555.967bdc"
  408. ​"ec9f4fc8.ffefc"
  409. ​"67b093c3.792bac
  410. ​}
  411. ​"id": "2ef6f090.a62fb"
  412. ​"type": "ui_text"
  413. ​"z": "160a8256.91137e"
  414. ​"group": "a532b78d.8303b8"
  415. ​"order":5
  416. ​"width":0
  417. ​"height":0
  418. ​"name": ""
  419. ​"label": "Đã gửi lệnh"
  420. ​"format": "{{msg.payload}}"
  421. ​"layout": "row-spread"
  422. ​"x": 910
  423. ​"y": 120
  424. ​"wires": [
  425. ​}
  426. ​"id": "ec9f4fc8.ffefc"
  427. ​"type": "function"
  428. ​"z": "160a8256.91137e"
  429. ​"name": "Lấy độ dài chuỗi"
  430. ​"func": "\nmsg.payload = msg.payload.length;\n\nreturn msg;"
  431. ​"outputs":1
  432. ​"noerr":0
  433. ​"x": 520
  434. ​"y": 280
  435. ​"wires":
  436. ​"6a5ff151.01fe4
  437. ​}
  438. ​"id": "6a5ff151.01fe4"
  439. ​"type": "ui_numeric"
  440. ​"z": "160a8256.91137e"
  441. ​"name": "Độ dài chuỗi"
  442. ​"label": ""
  443. ​"tooltip": ""
  444. ​"group": "8cc674a4.10e3f8"
  445. ​"order":6
  446. ​"width": "2"
  447. ​"height": "1"
  448. ​"wrap": false
  449. ​"passthru": true
  450. ​"topic": ""
  451. ​"format": "{{value}}"
  452. ​"min":0
  453. ​"max": "32"
  454. ​"step":1
  455. ​"x": 730
  456. ​"y": 300
  457. ​"wires":
  458. ​[
  459. ​}
  460. ​"id": "67b093c3.792bac"
  461. ​"type": "function"
  462. ​"z": "160a8256.91137e"
  463. ​"name": "Lấy đoạn chuỗi mà Arduino nhận được"
  464. ​"func": "\nmsg.payload = msg.payload.substr(0, 32);\n\nreturn msg;"
  465. ​"outputs":1
  466. ​"noerr":0
  467. ​"x": 600
  468. ​"y": 160
  469. ​"wires":
  470. ​"2ef6f090.a62fb
  471. ​}
  472. ​"id": "9f12809.32a7b8"
  473. ​"type": "subflow:36cf6cf2.8b1414"
  474. ​"z": "160a8256.91137e"
  475. ​"name": ""
  476. ​"x": 920
  477. ​"y": 480
  478. ​"wires":
  479. ​"f1471541.63de28
  480. ​]
  481. ​"2a08fa4e.66ff86
  482. ​]
  483. ​"eda77085.d01b5
  484. ​]
  485. ​"5e3ed30b.84645c
  486. ​]
  487. ​"88f2c510.769e58
  488. ​]
  489. ​"e2aa7aa2.845738
  490. ​]
  491. ​"4f03abee.64fdb4
  492. ​]
  493. ​"312b32b7.b644ee
  494. ​}
  495. ​"id": "bc0db1a4.dc6ce"
  496. ​"type": "http request"
  497. ​"z": "160a8256.91137e"
  498. ​"name": "[REST][POST]Xưởng cơ khí"
  499. ​"method": "POST"
  500. ​"ret": "txt"
  501. ​"url": "https://connect.mysmarthome.vn/api/1.0/request/Vx0PgGAzezNgJ7GZJgqi6HDe0mh1/LPefBPo03/12d2279cfa87aa91edbf1e9b1e0f1401290413650767/req_device_toggle"
  502. ​"tls": ""
  503. ​"x": 960
  504. ​"y": 180
  505. ​"wires":
  506. ​[
  507. ​}
  508. ​"id": "35985b01.939894"
  509. ​"type": "mqtt in"
  510. ​"z": "160a8256.91137e"
  511. ​"name": "IN_MQTT_Raspberry"
  512. ​"topic": "/LPefBPo03/read"
  513. ​"qos": "0"
  514. ​"broker": "bcd4bc94.7e8be"
  515. ​"x": 260
  516. ​"y": 420
  517. ​"wires":
  518. ​"fb721e44.f0f04
  519. ​}
  520. ​"id": "ec9c18ca.26d138"
  521. ​"type": "change"
  522. ​"z": "160a8256.91137e"
  523. ​"name": ""
  524. ​"rules":
  525. ​"t": "set"
  526. ​"p": "payload"
  527. ​"pt": "msg"
  528. ​"to": "payload.devices"
  529. ​"tot": "msg
  530. ​]
  531. ​"action": ""
  532. ​"property": ""
  533. ​"from": ""
  534. ​"to": ""
  535. ​"reg": false
  536. ​"x": 580
  537. ​"y": 440
  538. ​"wires":
  539. ​"7bedd8d8.8bbd58"
  540. ​"18a0c620.89265a
  541. ​}
  542. ​"id": "fb721e44.f0f04"
  543. ​"type": "json"
  544. ​"z": "160a8256.91137e"
  545. ​"name": ""
  546. ​"property": "payload"
  547. ​"action": "obj"
  548. ​"pretty": false
  549. ​"x": 430
  550. ​"y": 420
  551. ​"wires":
  552. ​"ec9c18ca.26d138
  553. ​}
  554. ​"id": "7bedd8d8.8bbd58"
  555. ​"type": "json"
  556. ​"z": "160a8256.91137e"
  557. ​"name": ""
  558. ​"property": "payload"
  559. ​"action": "obj"
  560. ​"pretty": false
  561. ​"x": 750
  562. ​"y": 440
  563. ​"wires":
  564. ​"9f12809.32a7b8
  565. ​}
  566. ​"id": "859f2a0a.7bba58"
  567. ​"type": "inject"
  568. ​"z": "160a8256.91137e"
  569. ​"name": ""
  570. ​"topic": ""
  571. ​"payload": "LED OFF"
  572. ​"payloadType": "str"
  573. ​"repeat": ""
  574. ​"crontab": ""
  575. ​"once": false
  576. ​"onceDelay": 0.1
  577. ​"x": 600
  578. ​"y": 580
  579. ​"wires":
  580. ​"8087a485.021878
  581. ​}
  582. ​"id": "5342e35b.0d9a3c"
  583. ​"type": "inject"
  584. ​"z": "160a8256.91137e"
  585. ​"name": ""
  586. ​"topic": ""
  587. ​"payload": "LED BLINK"
  588. ​"payloadType": "str"
  589. ​"repeat": ""
  590. ​"crontab": ""
  591. ​"once": false
  592. ​"onceDelay": 0.1
  593. ​"x": 600
  594. ​"y": 620
  595. ​"wires":
  596. ​"8087a485.021878
  597. ​}
  598. ​"id": "9184768f.2224c8"
  599. ​"type": "inject"
  600. ​"z": "160a8256.91137e"
  601. ​"name": ""
  602. ​"topic": ""
  603. ​"payload": "LED BLINK_OFF"
  604. ​"payloadType": "str"
  605. ​"repeat": ""
  606. ​"crontab": ""
  607. ​"once": false
  608. ​"onceDelay": 0.1
  609. ​"x": 580
  610. ​"y": 660
  611. ​"wires":
  612. ​"8087a485.021878
  613. ​}
  614. ​"id": "8087a485.021878"
  615. ​"type": "mqtt out"
  616. ​"z": "160a8256.91137e"
  617. ​"name": "OUT_MQTT_Raspberry"
  618. ​"topic": "/LPefBPo03/write"
  619. ​"qos": "2"
  620. ​"retain": "false"
  621. ​"broker": "bcd4bc94.7e8be"
  622. ​"x": 850
  623. ​"y": 600
  624. ​"wires": [
  625. ​}
  626. ​"id": "2acf0078.6ee6b"
  627. ​"type": "mqtt out"
  628. ​"z": "160a8256.91137e"
  629. ​"name": "OUT_MQTT_Raspberry"
  630. ​"topic": "mqtt/thientest"
  631. ​"qos": "2"
  632. ​"retain": "false"
  633. ​"broker": "bcd4bc94.7e8be"
  634. ​"x": 850
  635. ​"y": 760
  636. ​"wires": [
  637. ​}
  638. ​"id": "9c496c6c.66f1f"
  639. ​"type": "inject"
  640. ​"z": "160a8256.91137e"
  641. ​"name": ""
  642. ​"topic": ""
  643. ​"payload": "\"Hello world\""
  644. ​"payloadType": "json"
  645. ​"repeat": ""
  646. ​"crontab": ""
  647. ​"once": false
  648. ​"onceDelay": 0.1
  649. ​"x": 630
  650. ​"y": 760
  651. ​"wires":
  652. ​"2acf0078.6ee6b
  653. ​}
  654. ​"id": "8b39427b.f3b0c"
  655. ​"type": "inject"
  656. ​"z": "160a8256.91137e"
  657. ​"name": ""
  658. ​"topic": ""
  659. ​"payload": "LED ON"
  660. ​"payloadType": "str"
  661. ​"repeat": ""
  662. ​"crontab": ""
  663. ​"once": false
  664. ​"onceDelay": 0.1
  665. ​"x": 600
  666. ​"y": 540
  667. ​"wires":
  668. ​"8087a485.021878
  669. ​}
  670. ​"id": "18a0c620.89265a"
  671. ​"type": "debug"
  672. ​"z": "160a8256.91137e"
  673. ​"name": "Debug_Raspberry"
  674. ​"active": true
  675. ​"tosidebar": true
  676. ​"console": false
  677. ​"tostatus": false
  678. ​"complete": "payload"
  679. ​"x": 790
  680. ​"y": 400
  681. ​"wires": [
  682. ​}
  683. ​"id": "8cc674a4.10e3f8"
  684. ​"type": "ui_group"
  685. ​"z": ""
  686. ​"name": "Thứ nhất"
  687. ​"tab": "5956cdc1.91d694"
  688. ​"order":1
  689. ​"disp": true
  690. ​"width": "6"
  691. ​"collapse": tru
  692. ​}
  693. ​"id": "a532b78d.8303b8"
  694. ​"type": "ui_group"
  695. ​"z": ""
  696. ​"name": "Thứ 2"
  697. ​"tab": "5956cdc1.91d694"
  698. ​"order":2
  699. ​"disp": true
  700. ​"width": "6"
  701. ​"collapse": tru
  702. ​}
  703. ​"id": "bcd4bc94.7e8be"
  704. ​"type": "mqtt-broker"
  705. ​"z": ""
  706. ​"name": ""
  707. ​"broker": "192.168.137.202"
  708. ​"port": "1883"
  709. ​"clientid": ""
  710. ​"usetls": false
  711. ​"compatmode": true
  712. ​"keepalive": "60"
  713. ​"cleansession": true
  714. ​"willTopic": ""
  715. ​"willQos": "0"
  716. ​"willPayload": ""
  717. ​"birthTopic": ""
  718. ​"birthQos": "0"
  719. ​"birthPayload": "
  720. ​}
  721. ​"id": "5956cdc1.91d694"
  722. ​"type": "ui_tab"
  723. ​"z": ""
  724. ​"name": "Kiểm thử iNut cảm biến"
  725. ​"icon": "dashboard"
  726. ​"order":
  727. ]

Đây là code Arduino nha :

  1. #include<iNut.h>
  2. iNut sensor;
  3. staticbool blink_flag =false;
  4.  
  5. #define LED 5//chân 13 là chân LED
  6. void setup(){
  7. ​Serial.begin(9600); //bật baudrate ở mức 960
  8.  
  9. ​Serial.println("San sang nhan lenh")
  10.  
  11. ​pinMode(LED, OUTPUT)
  12. ​digitalWrite(LED, HIGH); //Bật đèn LED sán
  13.  
  14. ​//Khai báo số lượng luồn cảm biế
  15. ​sensor.setup(8); //Sẽ có 08 luồn cảm biế
  16. ​sensor.addCommand("LED", ledFunction)
  17. ​sensor.setDefaultHandler(defaultHandler)
  18. }
  19.  
  20. void loop(){
  21. #defineBlink_INIT0
  22. #defineBlink_ON1
  23. #defineBlink_Wating2
  24. #defineBlink_OFF3
  25. ​static int Blink_LED= Blink_INIT
  26. ​static unsigned long Blink_timer=0
  27. ​sensor.setValue(0, digitalRead(LED)); //đọc giá trị của đèn LE
  28.  
  29.  
  30. ​//giá trị cho các luồn từ 1-7 là giá trị rando
  31. ​///Tại sao lại sử dụng random? Vì đây là thử nghiệm, bạn có thể thay thế giá trị random bằng một giá trị cảm biến hoặc trị số mà bạn mong muốn đồng bộ lên Internet
  32. ​for(byte i=1; i <=7; i++)
  33. ​unsigned long value= random()% 10000; //trả về giá trị random - "hên xui" - tự d
  34. ​sensor.setValue(i, value); //gán giá trị trên vào luồ
  35.  
  36. ​if(blink_flag)
  37. ​static unsigned long timer=0
  38. ​if(millis()- timer> 100UL)
  39. ​timer= millis()
  40. ​digitalWrite(LED,!digitalRead(LED))
  41. ​sensor.loop()
  42. }
  43.  
  44.  
  45. //thực hiện khi nhận lệnh LED
  46. //gửi từ node RED xuống chú ý "LED", ví dụ muốn đèn sáng phải gửi lệnh là LED ON không phải mỗi ON không, chú ý viết hoa viết thường.
  47. void ledFunction(){
  48. ​char*arg= sensor.next()
  49. ​Serial.print("trạng thái arg: ")
  50. ​Serial.println(arg)
  51. ​if (*arg == NULL
  52. ​return
  53. ​if(strcmp(arg, "ON") ==0){ //nếu tham số 1 là ON. LED ON. Thì đèn sán
  54. ​digitalWrite(LED, HIGH)
  55. ​Serial.println("Bat den")
  56. } else if(strcmp(arg, "OFF") ==0){ // LED OFF. Đèn tắ
  57. ​digitalWrite(LED, LOW)
  58. ​Serial.println("Tat den")
  59. } else if(strcmp(arg, "TOGGLE") ==0){ //Đảo trạng thái của LE
  60. ​digitalWrite(LED,!digitalRead(LED))
  61. ​Serial.println("Doi trang thai den")
  62.  
  63. ​else if(strcmp(arg, "BLINK") ==0)
  64. ​blink_flag= true
  65. } else if(strcmp(arg, "BLINK_OFF") ==0)
  66. ​blink_flag= false
  67. ​else
  68. ​Serial.println("Khong nam trong tap hop lenh")
  69. }
  70.  
  71. //Nếu nhận được lệnh không phải từ những lệnh được đăng ký trước thì sẽ ghi ra ở đây
  72. void defaultHandler(constchar*command){
  73. ​Serial.print(F("---Not found handler: "))
  74. ​Serial.println(command)
  75.  
  76. ​//Đoạn chương trình dưới chỉ dùng để debug, để các bạn biết chương trình của mình ở lỗi ở đâu để khắc phục, cũng không cần hiểu nha
  77. ​int idx=0
  78. ​char*arg
  79. ​while ((arg= sensor.next()) != NULL){ //còn tham số nào thì in r
  80. ​Serial.print("-----> Gia tri thu #")
  81. ​Serial.print(idx)
  82. ​Serial.print(": ")
  83. ​Serial.println(arg)
  84. ​idx++
  85. }

Bước 3: Kết nối wifi và truy cập từ xa với từ máy tính vào Raspberry-Pi.

Ở đây mình sử dụng cách kết nối thông qua Remote Desktop Connection như những bài trước , các bạn có thể sử dụng những cách khác nha, miễn sao truy cập được từ xa với Raspberry-Pi để tiện cho quá trình cài đặt.

Bước 4: Khởi động broker trên Raspberry

  1. mosquitto_sub -d -u MOSQUITTO_USERNAME -P MOSQUITTO_PASSWORD -t mqtt/test

Nếu chưa rõ thì bạn có thể xem lại bài hướng dẫn ởđây nhé

Bước 5: Chạy thử và kiểm tra hoạt động của chương trình

Ở phẩn “Gửi lệnh xuống iNut cảm biến” bạn có thể nhập “LED ON” để bật đèn, “LED OFF” để tắt đèn, “LED BLINK” để điều khiển đèn nhấp nháy, “LED BLINK_OFF” để tắt trạng thái nhấp nháy của đèn. Sau khi nhập xong bạn nhớ Enter để thực hiện lệnh nhé.

Ngoài ra bạn có thể điều khiển led bằng cách click vào các ô vuông phía trước các ô lệnh.

Nếu đèn sáng theo đúng lệnh của bạn điều khiển thì bạn đã thành công rồi nhé. 

Các tin khác