10% điểm Bảng phân công nhiệm vụ: Nguyễn Xuân Duy Nguyễn Vũ Anh Kiệt Phạm Hoàng Hùng -Nội dung báo cáo : Bài tập mức độ 3 Sử dụng hai mô-đun Raspberry Pi kết hợp với Grove Base Hat và
Trang 1BỘ CÔNG THƯƠNGTRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP HỒ CHÍ MINH
-Khoa: Công Nghệ Điện Tử
BUỔI 4: Lập trình trao đổi dữ liệu với
Server (Download)
BÀI BÁO CÁO
NHÓM 3
1 Nguyễn Xuân Duy 21135061
2 Phạm Hoàng Hùng 21098681
3 Nguyễn Vũ Anh Kiệt 21123591
Giảng viên : Phạm Quang Trí
Ngày hoàn thiện : /09/2024
Trang 2NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
Điểm lab report:
Trang 3PHẦN BÀI LÀM THỰC HÀNH Yêu cầu 1: Bố cục, phân công nhiệm vụ từng thành viên, trình bày nội dung bài báo cáo (10%
điểm)
Bảng phân công nhiệm vụ:
Nguyễn Xuân Duy Nguyễn Vũ Anh Kiệt Phạm Hoàng Hùng
-Nội dung báo cáo : ( Bài tập mức độ 3 )
Sử dụng hai mô-đun Raspberry Pi kết hợp với Grove Base Hat và các mô-đun Grove phù hợp để viết chương trình điều khiển như sau:
o Mô-đun Raspberry 1: Thực hiện việc đọc giá trị nhiệt độ, độ ẩm của môi trường
và điện áp tạo ra bởi 1 biến trở sau mỗi 1 giây Đồng thời gửi dữ liệu trung bình sau mỗi
20 giây của nhiệt độ, độ ẩm, điện áp này và một tín hiệu ngẫu nhiên (có giá trị nằm trong khoảng 0 – 100) lên Server của ThingSpeak cho một gói tin và thực hiện liên tục trong ít nhất là 30 phút Tùy chọn sử dụng giao thức HTTP hoặc MQTT
o Mô-đun Raspberry 2: Thực hiện việc đọc dữ liệu nhiệt độ, độ ẩm, điện áp trung bình và tín hiệu ngẫu nhiên từ Server (dữ liệu nhiệt độ, độ ẩm, điện áp trung bình và tín hiệu ngẫu nhiên này do Raspberry 1 tạo ra) Dữ liệu nhiệt độ, độ ẩm, điện áp trung bình
và tín hiệu ngẫu nhiên này sẽ được in ra màn hình Terminal của mô-đun Raspberry và hiển thị trên LCD 16x2 Bắt buộc nhóm 1, 3, 5, 7, 9 và 11 sử dụng giao thức HTTP; nhóm 2, 4, 6, 8, 10 và 12 sử dụng giao thức MQTT
Ngoài ra, căn cứ trên các giá trị thu thập còn có thêm các tính năng sau:
Nếu giá trị ngẫu nhiên đọc về có giá trị lớn hơn 50 thì bật LED thứ nhất, nhỏ hơn 50 thì tắt LED thứ nhất
Nếu giá trị nhiệt độ trên 25OC thì bật LED thứ hai, dưới 24OC thì tắt LED thứ hai, còn lại các giá trị khác thì giữ nguyên trạng thái hiện tại của LED thứhai
Nếu giá trị điện áp trên 2.0V thì bật LED thứ ba, dưới 1.8V thì tắt LED thứ ba, còn lại các giá trị khác thì giữ nguyên trạng thái hiện tại của LED thứ ba
Nếu giá trị độ ẩm trên 90% thì bật Relay, dưới 60% thì tắt Relay, còn lại các giá trị khác thì giữ nguyên trạng thái hiện tại của Relay
o Bắt buộc phải có tập tin Log để ghi nhận lại các hoạt động trên mô-đun Raspberry 2
Trang 4Yêu cầu 2: Sơ đồ nguyên lý chi tiết của hệ thống (bắt buộc vẽ bằng phần mềm Altium)
(15% điểm)
Yêu cầu 3: Lưu đồ giải thuật (bắt buộc vẽ bằng công cụ trực tuyến draw.io) (20% điểm)
LƯU ĐỒ CỦA PHẦN UPLOAD:
Trang 5LƯU ĐỒ CỦA PHẦN DOWNLOAD:
Trang 9Yêu cầu 4: Mã nguồn của chương trình (không chấp nhận hình chụp) (5% điểm)
CODE UPLOAD:
from urllib import request, parse
import time
from random import randint
from seeed_dht import DHT
from grove.adc import ADC
Trang 10# Khởi tạo cảm biến DHT và biến trở
result_http = request.urlopen(req_push, data_http)
dien_ap = potentiometer_value / 3299 * 3.3 # Chuyển đổi giá trị ADC
for _ in range(20): # Doc gia tri trong 20 giay (1 giay mot lan)
if doam_gtri is not None and nhietdo_gtri is not None:
return tb_nhiet_do, tb_do_am, tb_dien_ap, random_gtri
while True:
tb_nhiet_do, tb_do_am, tb_dien_ap, random_gtri= read_th_random()
push_http({'field1': tb_nhiet_do, 'field2': tb_do_am, 'field3': tb_dien_ap, 'field4': random_gtri})
CODE DOWNLOAD:
from urllib import request
Trang 11import json
from gpiozero import LED
from grove.display.jhd1802 import JHD1802
from grove.grove_relay import GroveRelay
from time import sleep
return tb_nhiet_do, tb_do_am, tb_dien_ap, random_gtri
def log_data(nhietdo, doam, dien_ap, random):
with open("log.txt", "a") as log_file:
log_file.write(f"Trung binh nhiet do: {tb_nhiet_do}, Trung binh do am:
{tb_do_am}, Trung binh dien ap: {tb_dien_ap}, Random: {random}\n")
while True:
tb_nhiet_do, tb_do_am, tb_dien_ap, random_gtri = get_http()
log_data(tb_nhiet_do, tb_do_am, tb_dien_ap, random_gtri)
Trang 12Yêu cầu 5: Giải thích tác dụng của từng dòng mã nguồn được bổ sung vào (kể cả các
hàm, các chương trình con tham khảo ) (20% điểm)
CODE UPLOAD:
from urllib import request, parse
import time
from random import randint
from seeed_dht import DHT
from grove.adc import ADC
# Khởi tạo cảm biến DHT và biến trở
cambien = DHT('11', 18)
bienTro = ADC()
#Hàm gửi dữ liệu lên thingspeak bằng http
def push_http(data_http):
#Tạo một yêu cầu HTTP POST đến URL của ThingSpeak
req_push = request.Request('https://api.thingspeak.com/update', method='POST')
Trang 13#Thêm các header cần thiết, như loại nội dung và API key của ThingSpeak để xác thực req_push.add_header('Content-Type', 'application/x-www-form-urlencoded') req_push.add_header('XTHINGSPEAKAPIKEY', 'H5HZDH744OCVHYXU')
#Mã hóa dữ liệu dưới dạng chuỗi URL
data_http = parse.urlencode(data_http).encode()
#Gửi yêu cầu HTTP với dữ liệu đã mã hóa
result_http = request.urlopen(req_push, data_http)
#Vòng lặp đọc giá trị cảm biến trong giây
for _ in range(20): # Doc gia tri trong 20 giay (1 giay mot lan)
#Kiểm nếu giá trị độ ẩm và nhiệt độ là hợp lệ
if doam_gtri is not None and nhietdo_gtri is not None:
#Thêm hai giá trị đo được vào danh sách tương ứng
gia_tri_nhiet_do.append(nhietdo_gtri)
gia_tri_do_am.append(doam_gtri)
#Kiểm nếu giá trị điện áp là hợp lệ
if dien_ap is not None:
#Thêm giá trị điện áp vào danh sách tương ứng
Trang 14tb_nhiet_do = sum(gia_tri_nhiet_do) / len(gia_tri_nhiet_do) if gia_tri_nhiet_do else 0 tb_do_am = sum(gia_tri_do_am) / len(gia_tri_do_am) if gia_tri_do_am else 0 tb_dien_ap = sum(gia_tri_dien_ap) / len(gia_tri_dien_ap) if gia_tri_dien_ap else 0
#Tạo ra giá trị ngẫu nhiên từ 0-100
tb_nhiet_do, tb_do_am, tb_dien_ap, random_gtri= read_th_random()
#Gửi giá trị của các biến trên lên Thingspeak
push_http({'field1': tb_nhiet_do, 'field2': tb_do_am, 'field3': tb_dien_ap, 'field4': random_gtri})
CODE DOWNLOAD:
from urllib import request
import json
from gpiozero import LED
from grove.display.jhd1802 import JHD1802
from grove.grove_relay import GroveRelay
from time import sleep
#Khởi tạo các đối tượng màn hình lcd , led và relay
# Gửi yêu cầu và nhận phản hồi từ server
result_get = request.urlopen(req_get)
#Đọc dữ liệu trả về từ server và giải mã nó thành chuỗi văn bản
Trang 15#Trả về giá trị của các biến
return tb_nhiet_do, tb_do_am, tb_dien_ap, random_gtri
#Hàm tạo file log
def log_data(nhietdo, doam, dien_ap, random):
#Mở file log.txt ở chế độ thêm nội dung
with open("log.txt", "a") as log_file:
#Ghi dữ liệu vào file log
log_file.write(f"Trung binh nhiet do: {tb_nhiet_do}, Trung binh do am:
{tb_do_am}, Trung binh dien ap: {tb_dien_ap}, Random: {random}\n")
#Vòng lặp chính
while True:
#Khai báo và gán giá trị đọc từ Thingspeak cho các biến tương ứng từ trái qua phải tb_nhiet_do, tb_do_am, tb_dien_ap, random_gtri = get_http()
#Gọi hàm log_data và truyền vào hàm các giá trị từ các biến để tạo file log
log_data(tb_nhiet_do, tb_do_am, tb_dien_ap, random_gtri)
#Nếu giá trị ngẫu nhiêu lớn hơn 50 thì bật led 1
Trang 16#In tất cả giá trị của các biến lên màn hình Terminal
print("TB Nhiệt độ:",tb_nhiet_do,"TB Độ ẩm:",tb_do_am,"TB Điện áp:",tb_dien_ap," Random:",random_gtri)
#Tạm dừng chương trình trong 20s
sleep(20)
Yêu cầu 6: Minh chứng kết quả thực nghiệm (3 ảnh chụp mô hình khi đang vận hành)
(5% điểm)
Trang 21Yêu cầu 7: Minh chứng kết quả thực nghiệm bằng cách quay 1 video clip và tải lên
Youtube (trong trường hợp minh chứng có nhiều video clip nhỏ thì sinh viên phải tự ghéplại thành 1 video clip tổng hợp) và ghi liên kết vào báo cáo Nội dung video gồm các phần:
o Thuyết minh giới thiệu về nhóm sinh viên và bài học (5% điểm)
o Thuyết minh mô tả quá trình thao tác thí nghiệm (5% điểm)
o Thuyết minh kết nối dây giữa Raspberry với ngoại vi (5% điểm)
o Thuyết minh những đoạn mã nguồn quan trọng để giải quyết yêu cầu bài tập (5% điểm)
o Thuyết minh đánh giá, nhận xét về kết quả (5% điểm)
Link youtube: https://youtu.be/j61UYIt-iyI