Tải bản đầy đủ (.pdf) (43 trang)

môn chuyên đề iot báo cáo kết quả thực hành

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (7.34 MB, 43 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>KHOA CÔNG NGHỆ ĐIỆN TỬBÀI BÁO CÁO TUẦN 6</b>

<b>Mơn: Chun đề IoTGVHD: Phạm Quang TríLớp: DHIOT16A – 420301413301</b>

<b>Nhóm SV thực hiện: Nhóm 1</b>

<i><b>TP.HCM, Ngày 27 Tháng 9 Năm 2023</b></i>

<b>BÁO CÁO KẾT QUẢ THỰC HÀNH</b>

<b> Bài tập mức độ 3 (10 điểm):</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

Sử dụng 2 mô-đun Raspberry Pi kết hợp với Grove Base Hat và các mơ-đun Grovephù hợp để viết chương trình điều khiển như sau:

o <b>Web: Viết giao diện Web có:</b>

* 4 nút nhấn (ON, OFF, Auto và Manual). Trong đó: Nút 1 để chọn chế độAuto/Manual; Nút 2, 3, 4 dễ điều khiển LED đơn, Buzzer và Relay.* Đồ thị thể hiện hai giá trị nhiệt độ và độ ẩm đọc được từ Server.* Có các biểu tượng để thể hiện trạng thái hiện tại của LED đơn, Buzzer vàRelay là đang bật hoặc tắt.

* Có cửa sổ hiển thị con số kích thước lớn giá trị nhiệt độ và độ ẩm đọcđược từ Server (hiển thị giá trị của lần cập nhật cuối cùng).

* Có cửa sổ hiển thị thời gian hiện tại.

o <b>Mô-đun Raspberry 1: Thực hiện việc đọc giá trị nhiệt độ, độ ẩm của mỗi</b>

trường. Đồng thời gửi dữ liệu nhiệt độ, độ ẩm lên Server của Thingspeakmỗi 20 giây cho một gói tin và thực hiện lên liên tục trong ít nhất 30 phút.Tùy chọn sử dụng giao thức HTTP hoặc MQTT. Chương trình bắt buộcphải khởi động lại (reset) khi xảy ra lỗi cảm biến, rớt mạng.

o <b>Mô-đun Raspberry 2: Thực hiện việc đọc giá trị nhiệt độ, độ ẩm từ</b>

Server và in ra màn hình LCD 16x2. Tùy chọn sử dụng giao thức HTTPhoặc MQTT. Ngoài ra cịn có thêm các tính năng sau:

+ Nếu ở chế độ Manual, sẽ bật/tắt LED đơn và Relay từ điều khiển trêngiao diện

<b>Sau đó, thực hiện các bước để chương trình có khả năng tự khởi động khi bật</b>

<b>nguồn cho mô-đun Raspberry. Lưu ý:</b>

<b>. Bắt buộc chương trình phải có có khả năng tự khởi động khi bật nguồn cho mơ-đun </b>

<b>. Bắt buộc chương trình phải tự khởi động lại (reset) khi có lỗi phát sinh trong quá trình </b>

hoạt động. Thao tác chạy chương trình thủ công sẽ không được chấp nhận.

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>. Minh chứng trong báo cáo phải bổ sung thêm phần hình ảnh đồ thị dữ liệu của từng loại </b>

cảm biến trên Server ThingSpeak trong 30 phút

<b>. Trong cả ba mức độ bài tập, hai gói tin kề nnhau thể hiện trong Server có thời gian 90 </b>

giây mới được xem là liên tục. Khi không đáp ứng được u cầu này thì khơng được chấp nhận

<b>. Đối với mức độ 2 và 3, nếu tồn tại dữ liệu bất thường được gửi lên Server sẽ làm mất </b>

tính liên tục của dữ liệu. Trong quá trình gửi dữ liệu lên Server, nếu dữ liệu cảm biến bị lỗi thì khơng được Server mà phải đọc lại và gửi liệu khác.

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

Nhóm 1

<b>MỤC LỤC BÁO CÁO</b>

<i><b> Yêu cầu 1: Trong quyển báo cáo, dựa vào yêu cầu của bài tập đã chọn, phải vẽ sơ đồ</b></i>

nguyên lý kết nối phần cứng của toàn bộ hệ thống sử dụng Raspberry Pi.

<i><b> Yêu cầu 2: Trong quyển báo cáo, trình bày rõ ràng lưu đồ giải thuật và mã nguồn của</b></i>

chương trình điều khiển.

<i><b> Yêu cầu 3: Nạp chương trình vào mơ-đun Raspberry Pi và thực hiện cho chạy thử trên</b></i>

phần cứng trong phòng thực hành. Quay video clip minh chứng kết quả thực hiện, tải lênYoutube duy nhất 1 video clip (trong trường hợp minh chứng có nhiều video clip nhỏ thìsinh viên phải tự ghép lại thành 1 video clip tổng hợp) và ghi liên kết vào báo cáo.

 <i><b>Yêu cầu 4:</b></i> Trong video clip phải có:

o Thuyết minh mơ tả q trình thao tác thí nghiệm. o Trình bày kết nối dây giữa Raspberry với các mơ-đun.

o Trình bày chức năng từng dòng lệnh Python trong mã nguồn của chương trình điềukhiển.

o Trình bày và nhận xét kết quả thí nghiệm.

<b>your phone? Save to</b>

read later on yourcomputer

Save to a Studylist

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

 Yêu cầu 1: Dựa vào yêu cầu của bài tập đã chọn, phải vẽ sơ đồ nguyên lý kết nối phần cứng của toàn bộ hệ thống sử dụng

Raspberry Pi.

Hình 1: Sơ đồ nguyên lý kết nối phần cứng Mô-đun Raspberry.

-Sau khi đã chuẩn bị phần cứng, ta thực hiện kết nối cảm biến vớichân 16, LED với chân 5, buzzer với chân 12, relay với chân 18 vàkết nối LCD với chân I2C trên Mơ-đun Raspberry Pi như hình:

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Hình 2: Sơ đồ kết nối phần cứng thực tế Mơ-đun Raspberry.

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

 u cầu 2: Trình bày rõ ràng lưu đồ giải thuật và mã nguồn của chương trình điều khiển.

 Lưu đồ giải thuật code gửi dữ liệu:

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

Hình 5: Lưu đồ giải thuật của chương trình của Mơ-đun Raspberry (gửidữ liệu).

 Mã nguồn chương trình gửi dữ liệu:import time

from seeed_dht import DHT

from grove.display.jhd1802 import JHD1802import paho.mqtt.client as mqtt

sensor = DHT('11',16)lcd = JHD1802()

client = mqtt.Client("FCgIKBQ2JxsdNzsXBjoLDxY")

client.username_pw_set(username="FCgIKBQ2JxsdNzsXBjoLDxY", password="nvu7+BljulolhBKbwuBVKu+2")

client.connect("mqtt3.thingspeak.com", 1883, 60)

def thingspeak_mqtt(temp, humi):

payload = "field1=%s&field2=%s" % (temp, humi) client.publish("channels/2272959/publish", payload)

while True: try:

humi,temp = sensor.read() thingspeak_mqtt(temp, humi)

t = time.strftime("%H:%M:%S", time.localtime(time.time())) print("time:",t)

thingspeak_mqtt(temp, humi)

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

print("Nhiet do: {}C, Do am: {}%".format(temp,humi)) print('---')

time.sleep(20) except:

print('Khơng có kếết nơếi m ng')ạ time.sleep(2)

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

 Lưu đồ giải thuật code đọc dữ liệu:

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Hình 6: Lưu đồ giải thuật của chương trình của Mơ-đun Raspberry (đọc dữ liệu).

 Mã nguồn chương trình đọc dữ liệu:import paho.mqtt.client as mqtt

from urllib import request, parse from gpiozero import LEDfrom gpiozero import Buzzer

from grove.display.jhd1802 import JHD1802from grove.grove_relay import GroveRelayimport time

import json

led = LED(5)buzzer = Buzzer(12)relay = GroveRelay(18)lcd=JHD1802()

apiKeyRead = "SUW0M4PPFHG1VNUY"channelID = "2272959"

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

def getTemp():

apiKeyRead = "SUW0M4PPFHG1VNUY" channelID = "2272959"

req=request.Request(" r = request.urlopen(req) respone_data=r.read().decode() respone_data=json.loads(respone_data) field1 = respone_data['field1'] return field1

def getHumi():

apiKeyRead = "SUW0M4PPFHG1VNUY" channelID = "2272959"

req=request.Request(" r = request.urlopen(req) respone_data=r.read().decode() respone_data=json.loads(respone_data) field2 = respone_data['field2'] return field2

def getMode():

apiKeyRead = "SUW0M4PPFHG1VNUY" channelID = "2272959"

req=request.Request(" (channelID,apiKeyRead), method="GET")

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

r = request.urlopen(req) resData = r.read().decode() resData = json.loads(resData) value = resData["field3"] return value

def getLed():

apiKeyRead = "SUW0M4PPFHG1VNUY" channelID = "2272959"

req=request.Request(" (channelID,apiKeyRead), method="GET")

r = request.urlopen(req) resData = r.read().decode() resData = json.loads(resData) value = resData["field4"] return value

def getBuzzer():

apiKeyRead = "SUW0M4PPFHG1VNUY" channelID = "2272959"

req=request.Request(" (channelID, apiKeyRead), method="GET")

r = request.urlopen(req) resData = r.read().decode() resData = json.loads(resData) value = resData["field5"] return value

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

def getRelay():

apiKeyRead = "SUW0M4PPFHG1VNUY" channelID = "2272959"

req=request.Request(" (channelID, apiKeyRead), method="GET")

r = request.urlopen(req) resData = r.read().decode() resData = json.loads(resData) value = resData["field6"] return value

while True: try:

humi = getHumi() temp = getTemp() mode = getMode() led_value = getLed() relay_value = getRelay() buzzer_value = getBuzzer()

t = time.strftime("%H:%M", time.localtime(time.time()))

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

print("time:",t) if int(temp) > 35: print("Led b t")ậ led_value = 1 led.on() elif int(temp) < 31: print("Led tắết") led_value = 0 led.off()

if int(humi) > 90: print("Relay b t")ậ relay.on() relay_value = 1 elif int(humi) < 60: print("Relay tắết") relay.off() relay_value = 0

time.sleep(2)

elif int(mode) == 0: print("Chếế đ manual")ộ if int(led_value) == 1: led.on()

elif int(led_value) == 0: led.off()

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

if int(buzzer_value) == 1: buzzer.beep(1) elif int(buzzer_value) == 0: buzzer.beep(0)

if int(relay_value) == 1: relay.on()

elif int(relay_value) == 0: relay.off()

"id": "1c9045a12c2015d1", "type": "tab",

"label": "Flow 1", "disabled": false, "info": "", "env": [] }, {

"id": "c08cf61c01bb41a7", "type": "group",

"z": "1c9045a12c2015d1", "name": "Điều khiển", "style": {

"label": true },

"nodes": [

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

"eb6f9a5d6bee49ba", "b860bc78f9046665", "4d86439518905ad4", "d457bcc02e519370", "66772ae5fb0235a7" ],

"x": 274, "y": 639, "w": 532, "h": 242 }, {

"id": "6a94d4326648bb75", "type": "group",

"z": "1c9045a12c2015d1", "name": "Thông tin", "style": {

"label": true },

"nodes": [

"323e492a722355ea", "157ad405792ccc1f", "3a25a460e53b6624", "c4fdbf3d853b60e4", "0e7a6e868624476a", "9b582e55d7c92916", "42f73af5e9cb28aa", "e4591f562b7b0473", "ee179b7bb37c97e7" ],

"x": 914, "y": 299, "w": 632, "h": 322 }, {

"id": "47ee909f92cd65cf", "type": "group", "z": "1c9045a12c2015d1", "name": "Trạng thái ĐK", "style": {

"label": true },

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

"nodes": [

"67402672a439fb03", "d82285a1e8f1951e", "0175e4e76e5c5a33", "e5f64b35e34b87a4", "18cabb594afcbadc", "3440130fa2876852" ],

"x": 854, "y": 679, "w": 632, "h": 202 }, {

"id": "a5d13390d3e85a63", "type": "group",

"z": "1c9045a12c2015d1", "name": "Chế độ", "style": { "label": true },

"nodes": [

"87bc9f85598d8c88", "69adbd7b7b201d99", "6109e9bcd8e856b3" ],

"x": 274, "y": 359, "w": 532, "h": 142 }, {

"id": "87bc9f85598d8c88", "type": "ui_switch", "z": "1c9045a12c2015d1", "g": "a5d13390d3e85a63", "name": "",

"label": "Tự động/Thủ công", "tooltip": "",

"group": "16218864ac8ed31f", "order": 1,

"width": 5, "height": 2,

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

"passthru": true, "decouple": "false", "topic": "topic", "topicType": "msg", "style": "",

"onvalue": "field3=0", "onvalueType": "str", "onicon": "", "oncolor": "", "offvalue": "field3=1", "offvalueType": "str", "officon": "", "offcolor": "", "animate": false, "className": "", "x": 390, "y": 440, "wires": [ [

"69adbd7b7b201d99", "6109e9bcd8e856b3" ]

] }, {

"id": "eb6f9a5d6bee49ba", "type": "ui_switch", "z": "1c9045a12c2015d1", "g": "c08cf61c01bb41a7", "name": "",

"label": "LED", "tooltip": "",

"group": "66d8dafc3e1522c4", "order": 1,

"width": 3, "height": 2, "passthru": true, "decouple": "false", "topic": "topic", "topicType": "msg", "style": "",

"onvalue": "field4=1", "onvalueType": "str",

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

"onicon": "wb_sunny", "oncolor": "orange", "offvalue": "field4=0", "offvalueType": "str", "officon": "wb_sunny", "offcolor": "gray", "animate": true, "className": "", "x": 370, "y": 680, "wires": [ [

"d457bcc02e519370", "66772ae5fb0235a7" ]

] }, {

"id": "b860bc78f9046665", "type": "ui_switch", "z": "1c9045a12c2015d1", "g": "c08cf61c01bb41a7", "name": "",

"label": "BUZZER", "tooltip": "",

"group": "66d8dafc3e1522c4", "order": 2,

"width": 3, "height": 2, "passthru": true, "decouple": "false", "topic": "topic", "topicType": "msg", "style": "",

"onvalue": "field5=1", "onvalueType": "str", "onicon": "volume_up", "oncolor": "orange", "offvalue": "field5=0", "offvalueType": "str", "officon": "volume_off", "offcolor": "gray", "animate": true,

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

"className": "", "x": 360, "y": 760, "wires": [ [

"66772ae5fb0235a7", "d457bcc02e519370" ]

] }, {

"id": "4d86439518905ad4", "type": "ui_switch", "z": "1c9045a12c2015d1", "g": "c08cf61c01bb41a7", "name": "",

"label": "RELAY", "tooltip": "",

"group": "66d8dafc3e1522c4", "order": 3,

"width": 3, "height": 2, "passthru": true, "decouple": "false", "topic": "topic", "topicType": "msg", "style": "",

"onvalue": "field6=1", "onvalueType": "str", "onicon": "check_box", "oncolor": "orange", "offvalue": "field6=0", "offvalueType": "str",

"officon": "check_box_outline_blank", "offcolor": "gray",

"animate": true, "className": "", "x": 360, "y": 840, "wires": [ [

"66772ae5fb0235a7", "d457bcc02e519370"

</div>

×