(Đồ án HCMUTE) nghiên cứu, thiết kế và chế tạo táp lô xe tự hành

96 4 0
(Đồ án HCMUTE) nghiên cứu, thiết kế và chế tạo táp lô xe tự hành

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP NGÀNH CÔNG NGHỆ KỸ THUẬT Ô TÔ NGHIÊN CỨU, THIẾT KẾ VÀ CHẾ TẠO TÁP LÔ XE TỰ HÀNH GVHD: NGUYỄN THÀNH TUYÊN SVTH: LÊ NGUYÊN KHANG NGUYỄN HỮU THỊNH SKL009182 Tp Hồ Chí Minh, tháng 08/2022 i TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƯỢNG CAO NGÀNH CÔNG NGHỆ KỸ THUẬT Ô TÔ -o0o - ĐỒ ÁN TỐT NGHIỆP NGHIÊN CỨU, THIẾT KẾ VÀ CHẾ TẠO TÁP LÔ XE TỰ HÀNH GVHD : THS NGUYỄN THÀNH TUYÊN SVTH : LÊ NGUYÊN KHANG MSSV : 18145149 SVTH : NGUYỄN HỮU THỊNH MSSV : 18145251 LỚP : 18145CL2B Tp Hồ Chí Minh, tháng 08 năm 2022 i TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƯỢNG CAO NGÀNH CÔNG NGHỆ KỸ THUẬT Ô TÔ -o0o - ĐỒ ÁN TỐT NGHIỆP NGHIÊN CỨU, THIẾT KẾ VÀ CHẾ TẠO TÁP LÔ XE TỰ HÀNH GVHD : THS NGUYỄN THÀNH TUYÊN SVTH : LÊ NGUYÊN KHANG MSSV : 18145149 SVTH : NGUYỄN HỮU THỊNH MSSV : 18145251 LỚP : 18145CL2B Tp Hồ Chí Minh, tháng 08 năm 2022 i CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc *** Tp Hồ Chí Minh, ngày…tháng…năm 2022 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Lê Nguyên Khang MSSV: 18145149 Nguyễn Hữu Thịnh MSSV: 18145251 Ngành: Công nghệ kỹ thuật ô tô Lớp: 18145CL2B Giảng viên hướng dẫn: ThS Nguyễn Thành Tuyên ĐT: 0392409518 Ngày nhận đề tài: Ngày nộp đề tài: 11/08/2022 26/02/2022 Tên đề tài: Nghiên cứu, thiết kế chế tạo Táp Lô xe tự hành Các số liệu, tài liệu ban đầu: Tài liệu mạng CAN, tài liệu Raspberry Pi Nội dung thực đề tài: - Tìm hiểu hệ thống hiểu thị thơng tin xe - Tìm hiểu sở lý thuyết mạng CAN, giao tiếp SPI - Thiết kế giao diện Táp Lô xe phần mềm QT designer - Thiết kế khung Dashboard phần mềm Solidworks - Hồn thiện hệ thống hiển thị thơng tin Táp Lô xe tự hành Sản phẩm: - thuyết minh đề tài - Mơ hình hệ thống hiển thị thông tin xe tự hành XÁC NHẬN CỦA TRƯỞNG NGÀNH GIẢNG VIÊN HƯỚNG DẪN i CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc *** PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Họ tên sinh viên: Lê Nguyên Khang MSSV: 18145149 Nguyễn Hữu Thịnh MSSV: 18145251 Ngành: Công nghệ kỹ thuật ô tô Tên đề tài: Nghiên cứu, thiết kế chế tạo Táp Lô xe tự hành Họ tên Giáo viên hướng dẫn: ThS Nguyễn Thành Tuyên NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm: ……………… (Bằng chữ: ) ……………………………………………………………………………………… Tp Hồ Chí Minh, ngày tháng năm 2022 Giáo viên hướng dẫn (Ký & ghi rõ họ tên) i CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc *** PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN Họ tên sinh viên: Lê Nguyên Khang MSSV: 18145149 Nguyễn Hữu Thịnh MSSV: 18145251 Ngành: Công nghệ kỹ thuật ô tô Tên đề tài: Nghiên cứu, thiết kế chế tạo Táp Lô xe tự hành Họ tên Giáo viên phản biện: ThS Lê Quang Vũ NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm: ……………… (Bằng chữ: ) Tp Hồ Chí Minh, ngày tháng năm 2022 Giáo viên phản biện (Ký & ghi rõ họ tên) i LỜI CẢM ƠN Lời đầu tiên, nhóm em xin chân thành cảm ơn tồn thể quý thầy cô trường Đại Học Sư Phạm Kỹ Thuật Thành phố Hồ Chí Minh, đặc biệt quý thầy Khoa Cơ Khí Động Lực nhiệt tình giảng dạy truyền đạt kiến thức quý báu cho chúng em suốt thời gian học tập trường Nhóm em đặc biệt cảm ơn thầy Nguyễn Thành Tuyên – giảng viên hướng dẫn nhiệt tình hỗ trợ, định hướng gợi ý cho nhóm q trình thực để hồn thành tốt đề tài với hướng Một lần nữa, chúng em xin chân thành cảm ơn kính chúc quý thầy cô Trường Đại Học Sư Phạm Kỹ Thuật Thành phố Hồ Chí Minh nói chung, q thầy khoa Cơ Khí Động Lực nói riêng dồi sức khỏe, niềm vui thành công công việc giảng dạy nghiên cứu Tp Hồ Chí Minh, ngày 15 tháng 07 năm 2022 Nhóm sinh viên thực Lê Nguyên Khang_Nguyễn Hữu Thịnh i i TÓM TẮT Cùng với phát triển mạnh mẽ ngành công nghiệp ô tô, xe tự hành trở thành phương tiện ứng dụng rộng rãi tương lai gần Nhận thấy cần thiết việc nghiên cứu phát triển tơ tự hành, nhóm đề xuất với giáo viên hướng dẫn đề tài liên quan đến lĩnh vực Cụ thể hệ thống hiển thị thơng tin mơ hình xe tự hành Đi với thay đổi ngày đại thiết bị xe, hệ thống Táp Lô cải thiện Từ hiển thị sang hiển thị điện tử, khả đáp ứng nhanh xác trước, cho phép người sử dụng thay đổi giao diện xe hoạt động chế độ khác Để kết nối tín hiệu đầu vào cấu chấp hành với hình hiển thị thông tin cần thông qua mạng CAN giao tiếp SPI Nhóm nghiên cứu thiết kế Táp Lơ phần mềm Qt Designer, thiết kế mơ hình mơ Dashboard để hiển thị thông tin việc giao tiếp CAN MCP 2515 giao tiếp Raspberry Pi với Arduino Uno để hiển thị lên LCD 7inch ii i MỤC LỤC LỜI CẢM ƠN ………………………………………………………………………i TÓM TẮT ………… …………………………………………………………… ii MỤC LỤC … ………………………………………………………………… iii DANH MỤC CÁC TỪ VIẾT TẮT vi DANH MỤC CÁC BẢNG BIỂU vii DANH MỤC HÌNH ẢNH viii Chương TỔNG QUAN ĐỀ TÀI 1.1 Lịch sử vấn đề nghiên cứu 1.2 Tính cấp thiết đề tài 1.3 Mục tiêu đề tài 1.4 Đối tượng phạm vi nghiên cứu 1.4.1 Đối tượng nghiên cứu 1.4.2 Phạm vi nghiên cứu 1.5 Phương pháp nghiên cứu 1.6 Giới hạn đề tài 1.7 Nội dung thực 1.8 Bố cục đồ án: Chương CƠ SỞ LÍ THUYẾT 2.1 Hệ thống hiển thị thông tin ô tô 2.1.1 Tổng quát hệ thống hiển thị thông tin ô tô 2.2 Tổng quan mạng CAN 2.2.1 Lịch sử phát triển mạng CAN 2.2.2 Đặc điểm mạng CAN 2.2.2.1 Một số khái niệm 2.2.2.2 Tốc độ truyền liệu 2.2.2.3 Giá trị Bus CAN 2.2.2.4 Cơ chế giao tiếp 10 2.2.2.5 Cấu trúc mạng CAN [4] 10 2.2.2.6 Cấu trúc phân lớp 11 2.2.2.7 Cấu trúc điện 12 2.3 Giao tiếp SPI 21 iii i Chương SƠ LƯỢC VỀ PHẦN CỨNG VÀ PHẦN MỀM 22 3.1 Sơ lược phần mềm sử dụng 22 3.1.1 Giới thiệu phần mềm Arduino IDE 22 3.1.2 Giới thiệu phần mềm Python 22 3.1.3 Giới thiệu phần mềm thiết kế Qt Designer 23 3.1.4 Giới thiệu phần mềm Adobe Illustrator 24 3.1.5 Giới thiệu phần mềm Solidworks 24 3.1.6 Giới thiệu phần mềm Pycharm 25 3.2 Sơ lược phần cứng sử dụng 26 3.2.1 Arduino Uno 26 3.2.2 MCP 2515 28 3.2.3 Raspberry Pi 29 3.2.4 Màn hình LCD 31 3.2.5 Mạch Waveshare UPS HAT For Raspberry Pi 32 3.2.7 Cảm biến nhiệt độ DHT 11 33 3.2.8 Cảm biến tốc độ 34 Chương THIẾT KẾ, THỰC NGHIỆM MƠ HÌNH HỆ THỐNG HIỂN THỊ THƠNG TIN TRÊN XE TỰ HÀNH 35 4.1 Thiết kế đồ họa 35 4.1.1 Tham khảo ý tưởng xây dựng layout 35 4.1.2 Thiết kế giao diện Qt Designer 37 4.1.3 Sử dụng python để thiết kế vòng tròn tốc độ dung lượng pin 38 4.2 Thiết lập truyền tín hiệu 42 4.2.1 Chương trình truyền nhận tín hiệu mơ giao tiếp CAN 42 4.2.2 Chương trình Python cho Raspberry Pi 45 4.3 Thiết kế khung Táp Lô phần mềm Solidworks 47 4.4 Mơ hình thực nghiệm 49 Chương KẾT QUẢ THỰC NGHIỆM VÀ ĐÁNH GIÁ MƠ HÌNH TÁP LƠ XE TỰ HÀNH 53 5.1 Đánh giá thiết bị phần cứng 53 5.2 Kết thực nghiệm xe đứng yên chỗ 54 5.3 Kết thực nghiệm xe chạy đường trời 56 Chương KẾT LUẬN VÀ KIẾN NGHỊ 58 iv i self.flash_right_off() else: self.flash_right() def flash_right_off(self): self.ui.Turn_Right.setStyleSheet("borderimage:url(:/speedometer/picture/Turn_Right_Off.jpg)") def flash_right(self): if self.flag_right: self.ui.Turn_Right.setStyleSheet("borderimage:url(:/speedometer/picture/Turn_Right_On.jpg)") else: self.ui.Turn_Right.setStyleSheet("borderimage:url(:/speedometer/picture/Turn_Right_Off.jpg)") self.flag_right = not self.flag_right # TURN LEFT def turn_left(self, value): if value == 1: self.flash_left_off() else: self.flash_left() def flash_left_off(self): self.ui.Turn_Left.setStyleSheet("borderimage:url(:/speedometer/picture/Turn_Left_Off.jpg)") def flash_left(self): if self.flag_left: self.ui.Turn_Left.setStyleSheet("borderimage:url(:/speedometer/picture/Turn_Left_On.jpg)") else: self.ui.Turn_Left.setStyleSheet("borderimage:url(:/speedometer/picture/Turn_Left_Off.jpg)") self.flag_left = not self.flag_left #HEAD def Head(self, value): if value == 1: self.ui.Head.setStyleSheet("borderimage:url(:/speedometer/picture/Head_Off.jpg)") else: self.ui.Head.setStyleSheet("borderimage:url(:/speedometer/picture/Head_On.jpg)") 67 i # HIGH BEAM def high_beam(self, value): if value == 1: self.ui.HighBeam.setStyleSheet("borderimage:url(:/speedometer/picture/HighBeam_Off.jpg)") else: self.ui.HighBeam.setStyleSheet("borderimage:url(:/speedometer/picture/HighBeam_On.jpg)") # SET VALUE OF SPEED def setting_value(self, value): self.change_value_Speed(value) class ThreadClass(QThread): signal_real_speed = pyqtSignal(int) signal_real_head = pyqtSignal(int) signal_real_highbeam = pyqtSignal(int) signal_real_temp = pyqtSignal(int) signal_real_right = pyqtSignal(int) signal_real_left = pyqtSignal(int) signal_real_day = pyqtSignal(int) signal_real_month = pyqtSignal(int) signal_real_hour = pyqtSignal(int) signal_real_minute = pyqtSignal(int) signal_real_cap = pyqtSignal(int) def init (self, index=0): super(). init () self.index = index def run(self): self.save_signal = [] self.nums_of_signal = self.n = self.j = # SET STABILITY while self.n < 5: if Arduino_Serial.inWaiting(): for i in range(0, self.nums_of_signal): self.first_value = Arduino_Serial.readline() print(self.first_value) self.n += # ARRANGE SIGNAL while self.j < 1: self.first_value = Arduino_Serial.readline().decode().split('\r\n') if int(self.first_value[0]) == 250: 68 i self.save_signal.clear() self.j = # WHILE MAIN while True: if Arduino_Serial.inWaiting(): for i in range(0,self.nums_of_signal): self.first_value = Arduino_Serial.readline().decode().split('\r\n') self.save_signal.append(int(self.first_value[0])) self.value_speed = round(self.save_signal[0]) self.value_left = self.save_signal[1] self.value_right = self.save_signal[2] self.value_head = self.save_signal[3] self.value_flash = self.save_signal[4] self.value_temp = self.save_signal[5] self.value_cap = 80 self.datetime = datetime.now() # SEND SIGNAL TO MAIN WINDOW self.signal_real_speed.emit(self.value_speed) self.signal_real_cap.emit(self.value_cap) self.signal_real_head.emit(self.value_head) self.signal_real_highbeam.emit(self.value_flash) self.signal_real_temp.emit(self.value_temp) self.signal_real_right.emit(self.value_right) self.signal_real_left.emit(self.value_left) self.signal_real_day.emit(self.datetime.day) self.signal_real_month.emit(self.datetime.month) self.signal_real_hour.emit(self.datetime.hour) self.signal_real_minute.emit(self.datetime.minute) self.save_signal.clear() time.sleep(0.2) • if name == " main ": app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec()) Code Qt designer: # -*- coding: utf-8 -*# Form implementation generated from reading ui file 'tablo_LCD.ui' # # Created by: PyQt5 UI code generator 5.15.7 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is 69 i # run again Do not edit this file unless you know what you are doing from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1024, 600) MainWindow.setMinimumSize(QtCore.QSize(1024, 600)) MainWindow.setMaximumSize(QtCore.QSize(1024, 600)) self.container = QtWidgets.QWidget(MainWindow) self.container.setMinimumSize(QtCore.QSize(1024, 600)) self.container.setMaximumSize(QtCore.QSize(1024, 600)) self.container.setStyleSheet("") self.container.setObjectName("container") self.verticalLayout = QtWidgets.QVBoxLayout(self.container) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.centralwidget = QtWidgets.QFrame(self.container) self.centralwidget.setStyleSheet("QFrame{\n" "background-color:none\n" "\n" "}") self.centralwidget.setFrameShape(QtWidgets.QFrame.StyledPanel) self.centralwidget.setFrameShadow(QtWidgets.QFrame.Raised) self.centralwidget.setObjectName("centralwidget") self.container_speed = QtWidgets.QFrame(self.centralwidget) self.container_speed.setGeometry(QtCore.QRect(10, 140, 320, 320)) self.container_speed.setMinimumSize(QtCore.QSize(320, 320)) self.container_speed.setMaximumSize(QtCore.QSize(320, 320)) self.container_speed.setStyleSheet("background:none;\n" "border-image:url(:/speedometer/picture/satanmini.jpg)") self.container_speed.setFrameShape(QtWidgets.QFrame.NoFrame) self.container_speed.setFrameShadow(QtWidgets.QFrame.Raised) self.container_speed.setObjectName("container_speed") self.container_Cap = QtWidgets.QFrame(self.centralwidget) self.container_Cap.setGeometry(QtCore.QRect(694, 140, 320, 320)) self.container_Cap.setMinimumSize(QtCore.QSize(320, 320)) self.container_Cap.setMaximumSize(QtCore.QSize(320, 320)) self.container_Cap.setStyleSheet("QFrame{\n" "background:none;\n" "border-image:url(:/speedometer/picture/satanmini.jpg);\n" "}") self.container_Cap.setFrameShape(QtWidgets.QFrame.NoFrame) self.container_Cap.setFrameShadow(QtWidgets.QFrame.Raised) 70 i self.container_Cap.setObjectName("container_Cap") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.container_Cap) self.verticalLayout_3.setContentsMargins(10, 10, 10, 10) self.verticalLayout_3.setSpacing(0) self.verticalLayout_3.setObjectName("verticalLayout_3") self.background = QtWidgets.QLabel(self.centralwidget) self.background.setGeometry(QtCore.QRect(0, 0, 1024, 600)) self.background.setStyleSheet("borderimage:url(:/speedometer/picture/santa_background.jpg)") self.background.setFrameShadow(QtWidgets.QFrame.Raised) self.background.setText("") self.background.setAlignment(QtCore.Qt.AlignCenter) self.background.setObjectName("background") self.container_datetime = QtWidgets.QFrame(self.centralwidget) self.container_datetime.setGeometry(QtCore.QRect(270, 10, 511, 81)) self.container_datetime.setFrameShape(QtWidgets.QFrame.NoFrame) self.container_datetime.setFrameShadow(QtWidgets.QFrame.Raised) self.container_datetime.setObjectName("container_datetime") self.horizontalLayout = QtWidgets.QHBoxLayout(self.container_datetime) self.horizontalLayout.setContentsMargins(10, 10, 10, 10) self.horizontalLayout.setSpacing(20) self.horizontalLayout.setObjectName("horizontalLayout") self.date = QtWidgets.QLabel(self.container_datetime) self.date.setText("") self.date.setObjectName("date") self.horizontalLayout.addWidget(self.date) self.time = QtWidgets.QLabel(self.container_datetime) self.time.setText("") self.time.setObjectName("time") self.horizontalLayout.addWidget(self.time) self.temp = QtWidgets.QLabel(self.container_datetime) self.temp.setText("") self.temp.setObjectName("temp") self.horizontalLayout.addWidget(self.temp) self.Car = QtWidgets.QLabel(self.centralwidget) self.Car.setGeometry(QtCore.QRect(380, 150, 281, 281)) self.Car.setStyleSheet("borderimage:url(:/speedometer/picture/27dadae306e6d0b49080bc2d5bae70a8_cut.j pg)") self.Car.setText("") self.Car.setObjectName("Car") self.Turn_Left = QtWidgets.QLabel(self.centralwidget) self.Turn_Left.setGeometry(QtCore.QRect(230, 70, 40, 40)) self.Turn_Left.setStyleSheet("borderimage:url(:/speedometer/picture/Turn_Left_Off.jpg)") 71 i self.Turn_Left.setText("") self.Turn_Left.setObjectName("Turn_Left") self.Turn_Right = QtWidgets.QLabel(self.centralwidget) self.Turn_Right.setGeometry(QtCore.QRect(754, 70, 40, 40)) self.Turn_Right.setStyleSheet("borderimage:url(:/speedometer/picture/Turn_Right_Off.jpg)") self.Turn_Right.setText("") self.Turn_Right.setObjectName("Turn_Right") self.HighBeam = QtWidgets.QLabel(self.centralwidget) self.HighBeam.setGeometry(QtCore.QRect(551, 110, 50, 50)) self.HighBeam.setStyleSheet("borderimage:url(:/speedometer/picture/HighBeam_Off.jpg)") self.HighBeam.setText("") self.HighBeam.setObjectName("HighBeam") self.Head = QtWidgets.QLabel(self.centralwidget) self.Head.setGeometry(QtCore.QRect(433, 110, 50, 50)) self.Head.setStyleSheet("borderimage:url(:/speedometer/picture/Head_Off.jpg)") self.Head.setText("") self.Head.setObjectName("Head") self.background.raise_() self.container_speed.raise_() self.container_Cap.raise_() self.Car.raise_() self.container_datetime.raise_() self.Turn_Left.raise_() self.Turn_Right.raise_() self.HighBeam.raise_() self.Head.raise_() self.verticalLayout.addWidget(self.centralwidget) MainWindow.setCentralWidget(self.container) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) import speedometer_rc if name == " main ": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() 72 i • ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_()) Module widget from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from _datetime import datetime # CLASS CIRCLE SPEED class CircularProgress_Speed(QWidget): def init (self): QWidget. init (self) #CUSTOM PROPERTIES self.value = self.width = 200 self.height = 200 self.progress_width = 10 self.progress_rounded_cap = True self.progress_color = 0x8dd9cc self.max_value = 240 #TEXT self.enable_text = True self.font_family = "Segoe UI" self.font_size = 26 self.suffix = "km/h" self.text_color = 0xffffff self.enable_shadow = True # BG self.enable_bg = True self.bg_color = 0x44475a # SET DEFAULT SIZE WITHOUT LAYOUT self.resize(self.width, self.height) # ADD Shadow def add_shadow(self, enable): self.shadow = QGraphicsDropShadowEffect(self) self.shadow.setBlurRadius(15) self.shadow.setXOffset(0) self.shadow.setYOffset(0) self.shadow.setColor(QColor(0, 0, 0, 20)) 73 i self.setGraphicsEffect(self.shadow) # SET VALUE def set_value(self, value): self.value = value self.repaint() # Render progress bar after value # PAINT EVENT (DESIGN YOUR CIRCULAR PROGRESS HERE) def paintEvent(self, e): # SET PROGRESS PARAMETER width = self.width - self.progress_width height = self.height - self.progress_width margin = self.progress_width / value = self.value * 360 / self.max_value # PAINER paint = QPainter() paint.begin(self) # remove pixelated edges paint.setRenderHint(QPainter.Antialiasing) paint.setFont(QFont(self.font_family, self.font_size)) # CREATE RECTANGLE rect = QRect(0, 0, self.width, self.height) paint.setPen(Qt.NoPen) paint.drawRect(rect) #PEN pen = QPen() pen.setColor(QColor(self.progress_color)) pen.setWidth(self.progress_width) # SET ROUND CAP if self.progress_rounded_cap: pen.setCapStyle(Qt.RoundCap) # ENABLE BG if self.enable_bg: pen.setColor(QColor(self.bg_color)) paint.setPen(pen) paint.drawArc(margin, margin, width, height, 0, 360 * 16) # CREATE ARC / CIRCULAR PROGRESS pen.setColor(QColor(self.progress_color)) paint.setPen(pen) paint.drawArc(margin, margin, width, height, -90 * 16, -value * 16) 74 i # CREATE TEXT pen.setColor(QColor(self.text_color)) paint.setPen(pen) paint.drawText(rect, Qt.AlignCenter, f"{self.value}{self.suffix}") #END paint.end() # CLASS CIRCLE CAPACITY(SOC) class CircularProgress_Cap(QWidget): def init (self): QWidget. init (self) #CUSTOM PROPERTIES self.value = self.width = 200 self.height = 200 self.progress_width = 10 self.progress_rounded_cap = True self.progress_color = 0x66ff07 self.max_value = 100 #TEXT self.enable_text = True self.font_family = "Segoe UI" self.font_size = 26 self.suffix = "%" self.text_color = 0xffffff self.enable_shadow = True # BG self.enable_bg = True self.bg_color = 0x44475a # SET DEFAULT SIZE WITHOUT LAYOUT self.resize(self.width, self.height) # ADD Shadow def add_shadow(self, enable): self.shadow = QGraphicsDropShadowEffect(self) self.shadow.setBlurRadius(15) self.shadow.setXOffset(0) self.shadow.setYOffset(0) self.shadow.setColor(QColor(0, 0, 0, 20)) self.setGraphicsEffect(self.shadow) 75 i # SET VALUE def set_value(self, value): self.value = value self.repaint() # Render progress bar after value # PAINT EVENT (DESIGN YOUR CIRCULAR PROGRESS HERE) def paintEvent(self, e): # SET PROGRESS PARAMETER width = self.width - self.progress_width height = self.height - self.progress_width margin = self.progress_width / value = self.value * 360 / self.max_value # PAINER paint = QPainter() paint.begin(self) # remove pixelated edges paint.setRenderHint(QPainter.Antialiasing) paint.setFont(QFont(self.font_family, self.font_size)) # CREATE RECTANGLE rect = QRect(0, 0, self.width, self.height) paint.setPen(Qt.NoPen) paint.drawRect(rect) #PEN pen = QPen() pen.setColor(QColor(self.progress_color)) pen.setWidth(self.progress_width) # SET ROUND CAP if self.progress_rounded_cap: pen.setCapStyle(Qt.RoundCap) # ENABLE BG if self.enable_bg: pen.setColor(QColor(self.bg_color)) paint.setPen(pen) paint.drawArc(margin, margin, width, height, 0, 360 * 16) # CREATE ARC / CIRCULAR PROGRESS pen.setColor(QColor(self.progress_color)) paint.setPen(pen) paint.drawArc(margin, margin, width, height, -90 * 16, value * 16) # CREATE TEXT 76 i pen.setColor(QColor(self.text_color)) paint.setPen(pen) paint.drawText(rect, Qt.AlignCenter, f"{self.value}{self.suffix}") #END paint.end() # CLASS SET DATE class Date(QWidget): def init (self): QWidget. init (self) # TEXT self.day = datetime.now().day self.month = datetime.now().month self.width = 200 self.height = 200 self.enable_text = True self.font_family = "Segoe UI" self.font_size = 16 self.text_color = 0x9bc4e2 self.enable_shadow = True def set_day(self, value): self.day = value self.repaint() # Render progress bar after value def set_month(self, value): self.month = value self.repaint() # Render progress bar after value def paintEvent(self, e): # PAINER paint = QPainter() paint.begin(self) # remove pixelated edges paint.setRenderHint(QPainter.Antialiasing) paint.setFont(QFont(self.font_family, self.font_size)) # CREATE RECTANGLE rect = QRect(0, 0, self.width, self.height) paint.setPen(Qt.NoPen) paint.drawRect(rect) #PEN 77 i pen = QPen() # CREATE TEXT pen.setColor(QColor(self.text_color)) paint.setPen(pen) paint.drawText(rect, Qt.AlignCenter, f"{self.day}-{self.month}") # CLASS SET TIME class Time(QWidget): def init (self): QWidget. init (self) # TEXT self.hour = datetime.now().hour self.minute = datetime.now().minute self.width = 200 self.height = 200 self.enable_text = True self.font_family = "Segoe UI" self.font_size = 20 self.text_color = 0x9bc4e2 self.enable_shadow = True def set_hour(self, value): self.hour = value self.repaint() # Render progress bar after value def set_minute(self, value): self.minute = value self.repaint() # Render progress bar after value def paintEvent(self, e): # PAINER paint = QPainter() paint.begin(self) # remove pixelated edges paint.setRenderHint(QPainter.Antialiasing) paint.setFont(QFont(self.font_family, self.font_size)) # CREATE RECTANGLE rect = QRect(0, 0, self.width, self.height) paint.setPen(Qt.NoPen) paint.drawRect(rect) # PEN 78 i pen = QPen() # CREATE TEXT pen.setColor(QColor(self.text_color)) paint.setPen(pen) paint.drawText(rect, Qt.AlignCenter, f"{self.hour}:{self.minute}") # CLASS SET TEMPERATURE class TempSignal(QWidget): def init (self): QWidget. init (self) #CUSTOM PROPERTIES self.value = self.width = 200 self.height = 200 self.progress_width = 10 self.progress_rounded_cap = True self.progress_color = 0x43EF98 self.max_value = 200 #TEXT self.enable_text = True self.font_family = "Segoe UI" self.font_size = 16 self.suffix = "oC" self.text_color = 0x9bc4e2 self.enable_shadow = True # SET DEFAULT SIZE WITHOUT LAYOUT self.resize(self.width, self.height) # SET VALUE def set_value(self, value): self.value = value self.repaint() # Render progress bar after value # PAINT EVENT (DESIGN YOUR CIRCULAR PROGRESS HERE) def paintEvent(self, e): # SET PROGRESS PARAMETER width = self.width - self.progress_width height = self.height - self.progress_width margin = self.progress_width / value = self.value * 360 / self.max_value # PAINER 79 i paint = QPainter() paint.begin(self) # remove pixelated edges paint.setRenderHint(QPainter.Antialiasing) paint.setFont(QFont(self.font_family, self.font_size)) # CREATE RECTANGLE rect = QRect(0, 0, self.width, self.height) paint.setPen(Qt.NoPen) paint.drawRect(rect) #PEN pen = QPen() pen.setColor(QColor(self.progress_color)) pen.setWidth(self.progress_width) # CREATE TEXT pen.setColor(QColor(self.text_color)) paint.setPen(pen) paint.drawText(rect, Qt.AlignCenter, f"{self.value}{self.suffix}") #END paint.end() 80 i S i K L 0

Ngày đăng: 08/05/2023, 17:45