Nghiên cứu, chế tạo máy chẩn đoán cầm tay cho một số dòng xe

94 1 0
Nghiên cứu, chế tạo máy chẩn đoán cầm tay cho một số dòng xe

Đ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 CNKT Ô TÔ NGHIÊN CỨU, CHẾ TẠO MÁY CHẨN ĐỐN CẦM TAY CHO MỘT SỐ DỊNG XE GVHD: THS LÊ QUANG VŨ SVTH: NGUYỄN TUẤN KIỆT PHAN VĂN NHỰT SKL009416 Tp.Hồ Chí Minh, tháng 8/2022 TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ĐỒ ÁN TỐT NGHIỆP NGHIÊN CỨU, CHẾ TẠO MÁY CHẨN ĐOÁN CẦM TAY CHO MỘT SỐ DÒNG XE SVTH: NGUYỄN TUẤN KIỆT MSSV: 18145164 PHAN VĂN NHỰT MSSV: 18145197 Khóa: 2018 Ngành: CÔNG NGHỆ KỸ THUẬT Ô TÔ GVHD: ThS LÊ QUANG VŨ Tp Hồ Chí Minh, tháng năm 2022 n TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ĐỒ ÁN TỐT NGHIỆP NGHIÊN CỨU, CHẾ TẠO MÁY CHẨN ĐOÁN CẦM TAY CHO MỘT SỐ DÒNG XE SVTH: NGUYỄN TUẤN KIỆT MSSV: 18145164 PHAN VĂN NHỰT MSSV: 18145197 Khóa: 2018 Ngành: CÔNG NGHỆ KỸ THUẬT Ô TÔ GVHD: ThS LÊ QUANG VŨ Tp Hồ Chí Minh, tháng năm 2022 n 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: Nguyễn Tuấn Kiệt MSSV: 18145164 Lớp: 18145CL5B Phan Văn Nhựt MSSV: 18145197 Lớp: 18145CL5B Ngành: Cơng Nghệ Kỹ thuật Ơ tơ Giảng viên hướng dẫn: ThS LÊ QUANG VŨ ĐT: 0973777077 Ngày nhận đề tài: 22/02/2022 Ngày nộp đề tài: 09/08/2022 Tên đề tài: Nghiên cứu, chế tạo máy chẩn đoán cầm tay cho số dòng xe Các số liệu, tài liệu ban đầu: Tài liệu mạng giao tiếp, mơ hình hệ thống mạng CAN Nội dung thực đề tài: • Tìm hiểu loại máy chẩn đốn phổ biến thị trường • Tìm hiểu cấu trúc liệu truyền nhận qua mạng CAN • Thiết kế thi cơng máy chẩn đốn cầm tay • Lập trình giao diện phân tích liệu mã lỗi cho máy chẩn đốn • Thực nghiệm chẩn đốn đọc liệu cho số xe hành Sản phẩm: • Một thuyết minh đề tài • Máy chẩn đoán TRƯỞNG NGÀNH GIẢNG VIÊN HƯỚNG DẪN i n 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: Nguyễn Tuấn Kiệt MSSV: 18145164 Phan Văn Nhựt MSSV: 18145197 Nghành: Cơng Nghệ Kỹ thuật Ơ tơ Tên đề tài: Nghiên cứu, chế tạo máy chẩn đoán cầm tay cho số dòng xe Họ tên Giáo viên hướng dẫn: ThS LÊ QUANG VŨ NHẬT 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) ii n 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: Nguyễn Tuấn Kiệt MSSV: 18145164 Phan Văn Nhựt MSSV: 18145197 Nghành: Cơng Nghệ Kỹ thuật Ơ tơ Tên đề tài: Nghiên cứu, chế tạo máy chẩn đoán cầm tay cho số dòng xe Họ tên Giáo viên phản biện: ThS Nguyễn Thành Tuyên NHẬT 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) iii n LỜI CẢM ƠN Được phân công Khoa Đào tạo chất lượng cao - Trường Đại học Sư phạm Kỹ thuật TP.HCM, với đồng ý giảng viên hướng dẫn ThS Lê Quang Vũ giảng viên trưởng ngành ô tô ThS Vũ Đình Huấn Nhóm thực xin chân thành cảm ơn tất Q Thầy Cơ khoa Cơ khí Động lực trường Đại học Sư phạm Kỹ thuật TP Hồ Chí Minh tận tình giảng dạy truyền đạt kiến thức kinh nghiệm quý báu suốt thời gian học tập Nhóm đặc biệt gửi lời cảm ơn chân thành đến ThS Lê Quang Vũ, khoa Cơ khí Động lực, Trường Đại học Sư phạm Kỹ thuật TP Hồ Chí Minh – người tận tình hướng dẫn truyền đạt kiến thức, giúp nhóm hồn thành đồ án cách tốt Nhóm thực xin chân thành cảm ơn tập thể thầy cô trường Đại học Sư phạm Kỹ thuật Tp Hồ Chí Minh nói chung, thầy khoa Cơ Khí Động Lực nói riêng truyền đạt kiến thức đại cương chuyên ngành, giúp nhóm có sở lý thuyết vững vàng tạo điều kiện giúp đỡ suốt trình học tập Xin chúc Quý thầy cô dồi sức khoẻ để tiếp tục cống hiến cho nghiệp giáo dục nước nhà nói chung trường Đại học Sư phạm Kỹ thuật TP Hồ Chí Minh nói riêng! Tp Hồ Chí Minh, ngày…tháng…năm 2022 Nhóm sinh viên thực Nguyễn Tuấn Kiệt – Phan Văn Nhựt iv n TÓM TẮT ĐỒ ÁN Với phát triển nước ta việc sở hữu ô tô riêng nhu cầu thiết yếu gia đình thời kỳ hội nhập Chính lẽ lượng tiêu thụ loại xe tơ từ hãng ngồi nước ngày tăng cao Báo cáo Hiệp hội nhà sản xuất ô tô Việt Nam (VAMA), thị trường tơ Việt Nam đón nhận số bán xe kỷ lục từ trước đến nay, đạt 47.865 xe, tăng 31.6% so với tháng trước tăng 45% so với tháng 12/2019 Trên thực tế nhiều xe đời bán thị trường đồng nghĩa với việc người dùng hồn tồn tự theo dõi, chẩn đốn tình trạng hư hỏng phương tiện thiết bị bán chun vơ hữu ích Thơng qua mạng CAN (Control Area Network) có mặt phương tiện tơ đời việc trở nên dễ dàng hết Đề tài nghiên cứu thực từ tháng 2/2022 đến tháng 9/2022 Nội dung sở lý thuyết phương pháp nghiên cứu đề tài chủ yếu lý thuyết mạng CAN, hệ thống chẩn đốn lỗi tơ (OBD) ngơn ngữ lập trình Arduino Nội dung đồ án trình bày cách đầy đủ việc xây dựng phần mềm chẩn đốn với tính hiển thị thơng số hành, đọc xóa lỗi hệ thống báo v n MỤC LỤC TRANG PHỤ BÌA TRANG NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP i PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN ii PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN iii LỜI CẢM ƠN iv TÓM TẮT ĐỒ ÁN v DANH MỤC CÁC TỪ VIẾT TẮT x DANH MỤC BẢNG BIỂU xi DANH MỤC HÌNH ẢNH xii Chương TỔNG QUAN ĐỀ TÀI 1.1 Lý chọn đề tài 1.2 Mục tiêu đề tài 1.3 Phương pháp nghiên cứu 1.4 Phạm vi nghiên cứu 1.5 Bố cục đề tài Chương CƠ SỞ LÍ THUYẾT 2.1 Nguyên nhân lịch sử phát triển 2.1.1 Định nghĩa CAN Bus 2.1.2 Nguyên nhân đời CAN Bus 2.1.3 Lịch sử mạng CAN 2.2 Thuộc tính, ưu điểm ứng dụng CAN Bus 2.2.1 Thuộc tính ưu điểm CAN Bus 2.2.2 Phạm vi ứng dụng CAN Bus 2.3 Cấu trúc CAN Bus vi n 2.3.1 Cấu trúc phân lớp giao thức CAN 2.3.2 Các thành phần mạng CAN 2.3.3 Trạng thái tín hiệu chuẩn truyền mạng CAN 2.4 Các loại khung truyền giao thức CAN 11 2.4.1 Khung liệu (Data Frame) 11 2.4.2 Khung yêu cầu (Remote Frame) 15 2.4.3 Khung báo lỗi (Error Frame) 16 2.4.4 Khung báo tải (Overload frame) 17 2.5 Khoảng liên khung 18 2.5.1 Vai trò cấu trúc 18 2.5.2 Cấu tạo vùng 19 2.6 Quy luật nhồi bit (Bit Stuffing) 20 2.7 Ưu điểm mạng CAN 20 2.8 Cách nhận biết mạng CAN ô tô 21 2.9 Cách kiểm tra hệ thống CAN 22 Chương 23 TÌM HIỂU VỀ OBD - CÁC LOẠI MÁY CHẨN ĐOÁN 23 3.1 OBD (On – Board Diagnostics) – Hệ thống chẩn đoán lỗi xe 23 3.1.1 Khái niệm OBD 23 3.1.2 Mục đích đời 23 3.1.3 Nguyên lý hoạt động cấu tạo chung 23 3.2 Các giao diện chuẩn ô tô 25 3.2.1 OBD-I 25 3.2.2 OBD-II 26 3.2.3 Ý nghĩa mã lỗi OBD-II 28 3.3 Các giao thức tín hiệu OBD-II 29 vii n TÀI LIỆU THAM KHẢO [1] Hồ Hữu Chấn, NGHIÊN CỨU CHẾ TẠO MÁY CHẨN ĐOÁN CÁC LOẠI ECU ĐIỀU KHIỂN ĐỘNG CƠ, Trường Đại học Sư phạm Kỹ thuật Tp.HCM, năm 2005 [2] TS Lê Thanh Phúc, Hệ thống điều khiển động cơ, Điện ô tô 2, Trường Đại học Sư phạm Kỹ thuật Tp.HCM [3] The CAN Protocol: https://www.kvaser.com/can-protocol-tutorial/ [4] CAN – CANBus: https://mesidas.com/can-canbus/ [5] Hệ thống OBD tơ gì? Mục đích & Cách phân loại chi tiết: https://oto.edu.vn/vatc-huong-dan-thong-obd-tren-o-to-la-gi/ [6] Thư viện mã lỗi OBD: https://www.obdadvisor.com/codes/#:~:text=The%20%27P%27%20means%20that %20the,%2C%20an%20over-speed%20condition [7] Tổng hợp thành phần, giá trị hệ thống OBD PIDs: https://en.wikipedia.org/wiki/OBD-II_PIDs?fbclid=IwAR1NWZvOVIs0eAk1_Wp9YmfcN_dvvRa6WIIgcrACYQLu4fgXuXOy6jx5O0#Service_01 [8] Wikipedia, On-Board Diagnostics: https://en.wikipedia.org/wiki/On-board_diagnostics#OBDII_Diagnostic_Trouble_Codes [9] CCS Electronics, OBD2 Explain – A Simple Intro (2020): https://www.csselectronics.com/pages/obd2-explained-simple-intro 63 n PHỤ LỤC: CODE ARDUINO #include #include #include "mcp2515_can.h" #include #include #include #define CAN_CS_PIN 53 mcp2515_can CAN(CAN_CS_PIN); // Set CAN CS pin /#define CAN_ID_PID 0x7DF unsigned char buf[8]; byte len; File myFile; String Str = "" ; int giaTri[7]; int counterro = 0; String array1[20], b; byte flag, k, count = 0; //****************OBD-II PIDs Mode 3*****************************// const byte so_sanh[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; const String DTCs12[16] = {"P0", "P1", "P2", "P3", "C0", "C1", "C2", "C3", "B0", "B1", "B2", "B3", "U0", "U1", "U2", "U3"}; // // void set_mask_filt() { CAN.init_Mask(0, 0, 0x7FC); CAN.init_Filt(0, 0, 0x7E8); CAN.init_Filt(1, 0, 0x7E8); CAN.init_Mask(1, 0, 0x7FC); CAN.init_Filt(2, 0, 0x7E8); CAN.init_Filt(3, 0, 0x7E8); 64 n CAN.init_Filt(4, 0, 0x7E8); CAN.init_Filt(5, 0, 0x7E8); } // // void CAN_Send(unsigned char mode, unsigned char PID) { if (mode == 0x01) { unsigned char tmp[8] = {0x02, mode, PID, 0, 0, 0, 0, 0}; CAN.sendMsgBuf(CAN_ID_PID, 0, 8, tmp); } else { unsigned char tmp[8] = {0x01, mode, 0, 0, 0, 0, 0, 0}; CAN.sendMsgBuf(CAN_ID_PID, 0, 8, tmp); } } // // void CAN_Recieve() { for (byte i = 0; i < 8; i++) { buf[i] = 0; } if (CAN_MSGAVAIL == CAN.checkReceive()) { CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf } } // - print data void printdata() { for (int i = 0; i < len; i++) { Serial.print("0x"); Serial.print(buf[i], HEX); Serial.print("\t"); } } 65 n // void setup() { Serial.begin(9600); Serial1.begin(9600); if (!SD.begin(4)) { Serial.println("Initialization failed!"); while (1); } SPI.begin(); while (!Serial) { ; // wait for serial port to connect Needed for native USB port only } while (CAN_OK != CAN.begin(CAN_500KBPS) ) { // init can bus : baudrate = 500k or 1000k delay(100); } Serial.println("CAN BUS Shield init ok!"); set_mask_filt(); } // SELECT MODE -// void loop() { readUART(); if (giaTri[0] == 101 && giaTri[1] == && giaTri[2] == && giaTri[3] == && giaTri[4] == 255 && giaTri[5] == 255 && giaTri[6] == 255) { Mode4(); } if (giaTri[0] == 101 && giaTri[1] == && giaTri[2] == && giaTri[3] == && giaTri[4] == 255 && giaTri[5] == 255 && giaTri[6] == 255) { Mode1(); Serial.println(); } 66 n if (giaTri[0] == 101 && giaTri[1] == && giaTri[2] == && giaTri[3] == && giaTri[4] == 255 && giaTri[5] == 255 && giaTri[6] == 255) { Mode3(); } } // MODE 1: READ DATA void Mode1() { unsigned char mode_send = 0x01; CAN_Send(mode_send, 0x04); // Engine Load 0x04 { CAN_Recieve(); } while ((buf[1] != 0x01) && (buf[2] != 0x04)); printdata(); unsigned int EngineLoad = buf[3] / 2.55; Serial.print("Engine Load : "); Serial.print(EngineLoad); Serial.println(); Serial1.print("EL.val="); Serial1.print(EngineLoad); Serial1.print("\xFF\xFF\xFF"); delay(10); /* -*/ CAN_Send(mode_send, 0x05); // Engine coolant temperature 0x05 { CAN_Recieve(); } while ((buf[1] != 0x01) && (buf[2] != 0x05)); printdata(); Serial.print("Engine coolant temperature : "); Serial.print(buf[3] - 40); Serial.println(); 67 n Serial1.print("CT.val="); Serial1.print(buf[3] - 40); Serial1.print("\xFF\xFF\xFF"); delay(10); /* -*/ CAN_Send(mode_send, 0x06); // Short term fuel trim - Bank 0x06 { CAN_Recieve(); } while ((buf[1] != 0x01) && (buf[2] != 0x06)); printdata(); int ShortTermFuelTrim = buf[3] / 1.28 - 100; Serial.print("Short term fuel trim - Bank : "); Serial.print(ShortTermFuelTrim); Serial.println(); delay(10); /* -*/ CAN_Send(mode_send, 0x07); // Long term fuel trim - Bank 0x07 { CAN_Recieve(); } while ((buf[1] != 0x01) && (buf[2] != 0x07)); printdata(); int LongTermFuelTrim = buf[3] / 1.28 - 100; Serial.print("Long term fuel trim - Bank : "); Serial.print(LongTermFuelTrim); Serial.println(); delay(10); /* -*/ CAN_Send(mode_send, 0x0C); // RPM 0x0C { CAN_Recieve(); } while ((buf[1] != 0x01) && (buf[2] != 0xC)); printdata(); unsigned int RPM = buf[3] * 64 + buf[4] / 4; Serial.print("RPM : "); 68 n Serial.print(RPM); Serial.println(); Serial1.print("RPM.val="); Serial1.print(buf[3] * 64 + buf[4] / 4); Serial1.print("\xFF\xFF\xFF"); delay(10); /* -*/ CAN_Send(mode_send, 0x0D); // Vehicle Speed 0x0D { CAN_Recieve(); } while ((buf[1] != 0x01) && (buf[2] != 0xD)); printdata(); unsigned int VehicleSpeed = buf[3]; Serial.print("Vehicle speed : "); Serial.print(VehicleSpeed); Serial.println(); Serial1.print("VS.val="); Serial1.print(buf[3]); Serial1.print("\xFF\xFF\xFF"); delay(10); /* -*/ CAN_Send(mode_send, 0x0E); // Timing Advance 0x0E { CAN_Recieve(); } while ((buf[1] != 0x01) && (buf[2] != 0x0E)); printdata(); int TimingAdvance = buf[3] / - 64; Serial.print("Timing Advance : "); Serial.print(TimingAdvance); Serial.println(); delay(10); /* -*/ CAN_Send(mode_send, 0x0F); // Intake air temperature 0x0F { 69 n CAN_Recieve(); } while ((buf[1] != 0x01) && (buf[2] != 0x0F)); printdata(); Serial.print("Intake air temperature : "); Serial.print(buf[3] - 40); Serial.println(); Serial1.print("IAT.val="); Serial1.print(buf[3] - 40); Serial1.print("\xFF\xFF\xFF"); delay(10); /* -*/ CAN_Send(mode_send, 0x11); { CAN_Recieve();; } while ((buf[1] != 0x01) && (buf[2] != 0x11)); printdata(); unsigned int ThrottlePosition = buf[3] / 2.55; Serial.print("Throttle position : "); Serial.print(ThrottlePosition); Serial.println(); Serial1.print("TP.val="); Serial1.print(ThrottlePosition); Serial1.print("\xFF\xFF\xFF"); delay(1000); // Throttle position 0x11 } // -MODE 3: DIAGNOSTIC -void Mode3() { CAN_Send(0x03, 0); printdata(); Serial.println(); { CAN_Recieve(); } while (buf[1] != 0x43); 70 n /*đưa mã lỗi*/ for (byte i = 3; i < buf[0]; i = i + 2) { for (byte j = 0; j < 16; j++) { if (buf[i] / 16 == so_sanh[j]) { String a[4]; a[0] = DTCs12[j]; a[1] = buf[i] % 16, HEX; a[2] = buf[i + 1] / 16, HEX; a[3] = buf[i + 1] % 16, HEX; b = a[0] + a[1] + a[2] + a[3] + ".txt" ; flag = 1; for (k = 0; k < count; k++) { if (array1[k] == b) { flag = 0; break; } } if (flag == 1) { array1[count] = b; //open the file for reading: myFile = SD.open(b); if (myFile) { //String Str = ""; char a; // read from the file until there's nothing else in it: while (myFile.available()) { 71 n a = myFile.read(); Serial.print(a); Str += String(a); } switch (counterro) { case 0: Serial1.print("error1.t"); Serial1.print(0); Serial1.print(".txt=\""); Serial1.print(Str); Serial1.print("\""); Serial1.write(0xff); Serial1.write(0xff); Serial1.write(0xff); break; case 1: Serial1.print("error1.t"); Serial1.print(1); Serial1.print(".txt=\""); Serial1.print(Str); Serial1.print("\""); Serial1.write(0xff); Serial1.write(0xff); Serial1.write(0xff); break; case 2: Serial.print("error1.t"); Serial.print(2); Serial.print(".txt=\""); Serial.print(Str); Serial.print("\""); Serial.write(0xff); Serial.write(0xff); 72 n Serial.write(0xff); break; case 3: Serial1.print("error2.t"); Serial1.print(3); Serial1.print(".txt=\""); Serial1.print(Str); Serial1.print("\""); Serial1.write(0xff); Serial1.write(0xff); Serial1.write(0xff); break; case 4: Serial1.print("error2.t"); Serial1.print(4); Serial1.print(".txt=\""); Serial1.print(Str); Serial1.print("\""); Serial1.write(0xff); Serial1.write(0xff); Serial1.write(0xff); break; case 5: Serial.print("error2.t"); Serial.print(5); Serial.print(".txt=\""); Serial.print(Str); Serial.print("\""); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); break; case 6: Serial.print("error3.t"); 73 n Serial.print(6); Serial.print(".txt=\""); Serial.print(Str); Serial.print("\""); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); break; case 7: Serial.print("error3.t"); Serial.print(7); Serial.print(".txt=\""); Serial.print(Str); Serial.print("\""); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); break; case 8: Serial.print("error3.t"); Serial.print(8); Serial.print(".txt=\""); Serial.print(Str); Serial.print("\""); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); break; } Str = ""; counterro = counterro + 1; //close the file: myFile.close(); } 74 n else { // if the file didn't open, print an error: Serial.println("error opening"); } count++; }}}} } void Mode4() // CLEAR ERROR -{ CAN_Send(0x04, 0); delay(2000); Serial.println("Done!!!"); Serial1.print("error1.t0.txt="""); Serial1.print("error1.t1.txt="""); Serial1.print("error1.t2.txt="""); Serial1.print("error2.t3.txt="""); Serial1.print("error2.t4.txt="""); Serial1.print("error2.t5.txt="""); Serial1.print("error3.t6.txt="""); Serial1.print("error3.t7.txt="""); Serial1.print("error3.t8.txt="""); } // TouchData void readUART() { if (Serial1.available()) { for (byte i = 0; i < 7; i++) { giaTri[i] = (int)Serial1.read(); Serial.print(giaTri[i]); Serial.print("\t"); } 75 n Serial.print("\n"); } delay(500); } 76 n S K L 0

Ngày đăng: 10/05/2023, 14:57

Tài liệu cùng người dùng

Tài liệu liên quan