Nghiên cứu phát triển phần mềm và phân loại một số bệnh trên vật nuôi (đồ án tốt nghiệp cơ điện)

97 0 0
Nghiên cứu phát triển phần mềm và phân loại một số bệnh trên vật nuôi (đồ án tốt nghiệp cơ điện)

Đ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

HỌC VIỆN NÔNG NGHIỆP VIỆT NAM KHOA CƠ - ĐIỆN  ĐỒ ÁN TỐT NGHIỆP ĐỀ TÀI: NGHIÊN CỨU PHÁT TRIỂN PHẦN MỀM VÀ PHÂN LOẠI MỘT SỐ BỆNH TRÊN VẬT NUÔI Giáo viên hướng dẫn : TS NGUYỄN THÁI HỌC Sinh viên thực : VŨ THỊ HỒNG MSV : 603004 Lớp : K60-TĐHB Chuyên ngành : TỰ ĐỘNG HÓA Hà Nội – 2021 LỜI CAM ĐOAN Tôi xin cam đoan cơng trình nghiên cứu độc lập cá nhân Tơi với hướng dẫn TS Nguyễn Thái Học …, kết nghiên cứu trình bày đồ án trung thực, khách quan Tôi xin cam đoan giúp đỡ cho việc thực đồ án cảm ơn, tất nguồn tài liệu công bố đầy đủ Hà Nội, ngày tháng năm 2021 Tác giả đồ án Vũ Thị Hồng i LỜI CẢM ƠN Sau năm năm học tập rèn luyện trường, khóa luận tốt nghiệp đại học tập cuối em trước hoàn thành chương trình học tập Khóa luận phần thể kiến thức em học tập, đúc kết suốt năm năm rèn luyện giảng đường đại học Chính vậy, em cố gắng hồn thiện khóa luận cách tốt Để hồn thiện khóa luận này, em nhận giúp đỡ tận tình, tạo điều kiện thầy cô giáo Khoa Cơ Điện,Học viện nông nghiệp Việt Nam, đặc biệt TS Nguyễn Thái Học người trực tiếp hướng dẫn em thực khóa luận Em xin gửi lời cảm ơn tới quý Thầy, Cô khoa Cơ Điện , Học Viện Nông Nghiệp Việt Nam tận tình truyền đạt kiến thức suốt năm năm học qua, trang bị cho em kiến thức học tập, sống làm hành trang vững tương lai Em xin tỏ lịng kính trọng biết ơn sâu sắc đến TS Nguyễn Thái Học người trực tiếp hướng dẫn em thực khóa luận này, tận tình hướng dẫn, giúp đỡ, tạo điều kiện động viên em nhiều suốt thời gian thực làm khóa luận tốt nghiệp Em xin gửi lời cảm ơn chân thành đến gia đình, bạn bè ln bên cạnh, khích lệ, động viên em suốt thời gian qua để hồn thành khóa luận tốt nghiệp cách tốt Cuối em xin kính chúc quý Thầy, Cô giáo khoa Cơ Điện, thầy cô Học viện Nơng nghiệp Việt Nam tồn thể bạn bè, người thân sức khỏe, hạnh phúc thành đạt Em xin chân thành cảm ơn! Hà nội, ngày….tháng….năm 2021 Sinh viên Vũ Thị Hồng ii MỤC LỤC LỜI CAM ĐOAN i LỜI CẢM ƠN ii MỤC LỤC iii DANH MỤC BẢNG v DANH MỤC HÌNH vi LỜI MỞ ĐẦU CHƯƠNG I TỔNG QUAN TÀI LIỆU 1.1 Tổng quan camera ảnh nhiệt 1.2 Một số ứng dụng camera ảnh nhiệt 1.2.1 Cơ chế sinh nhiệt thể vật nuôi 14 1.3 Quy trình thay đổi nhiệt độ thể lợn mắc bệnh 22 1.3.1 Cơ chế biến đổi thân nhiệt thể lợn mắc số bệnh thông thường [15],[17],[18],[19],[21] 22 1.3.2 Ý nghĩa việc đo thân nhiệt 22 1.3.3 Phương pháp đo thân nhiệt 23 1.3.4 Khái quát xử lý ảnh 26 1.3.5 Một số vấn đề xử lý ảnh 29 1.3.6 Các loại tệp xử lý ảnh 31 CHƯƠNG II : NỘI DUNG VÀ PHƯƠNG PHÁP NGHIÊN CỨU 37 2.1 Sơ đồ công nghệ 37 2.2 Lựa chọn cấu trúc phần cứng phần mềm điều khiển hệ thống phần mềm phân loại số bệnh vật nuôi 38 2.2.1 Giới thiệu camera Flir TG267 39 2.2.2 Giới thiệu Arduino uno R3 40 2.2.3 Giới thiệu module sim 900A 41 2.2.4 Sơ đồ nguyên lí mạch cảnh báo 43 iii 2.3 Tìm hiểu ngơn ngữ lập trình Python phần mềm OpenCV 43 2.3.1 Ngơn ngữ lập trình Python 43 2.3.2 Thư viện Open CV 44 2.4 Cơ sở lưu đồ thuật toán 45 2.4.1 Cơ sở thuật toán 45 2.4.2 Lưu đồ thuật toán 52 CHƯƠNG III: KẾT QUẢ VÀ THẢO LUẬN 57 3.1 Các bước xây dựng mơ hình hệ thống phần mềm phân loại số bệnh vật nuôi 57 3.2 Khảo nghiệm mô hình 58 3.2.1 Ảnh nhiệt có chứa vùng bất thường không chứa vùng bất thường 58 3.3 Thành lập bảng kết chạy thử chương trình 61 3.3.1 Bảng kết dùng chương trình để phân tích ảnh 61 3.3.2 So sánh giá trị kinh tế 64 3.4 Đánh giá thảo luận 67 3.4.1 Đánh giá 67 3.4.2 Thảo luận 68 3.5 Những mặt hạn chế hướng phát triển 68 3.5.1 Những mặt hạn chế 68 3.5.2 Hướng phát triển đề tài 68 KẾT LUẬN VÀ KIẾN NGHỊ 69 Kết luận 69 Kiến nghị 69 TÀI LIỆU THAM KHẢO 70 PHỤ LỤC 73 iv DANH MỤC BẢNG Bảng 1.1: Nhiệt da (° C) trước bị nhiễm bệnh[18] 18 Bảng 1.2: Bảng chế biển đổi thân nhiệt thể lợn 22 Bảng 3.1: Bảng kết phân tích với đầu vào ảnh lợn bị dịch tả lợn cổ điển thời điểm ngày 62 Bảng 3.2: Bảng kết phân tích với đầu vào ảnh lợn bị stress thời điểm ngày 63 Bảng 3.3: Bảng kết phân tích với đầu vào ảnh lợn bị cảm sốt lợn sinh thời điểm ngày 64 Bảng 3.4: Bảng so sánh giá trị kinh tế 65 v DANH MỤC HÌNH Hình 1.1: Hình ảnh bước sóng [2] Hình 1.2: Hình ảnh vật thể tái tạo hình ảnh nhiệt có dạng sau [2] Hình 1.3: Ứng dụng camera nhiệt theo dõi an ninh[23] Hình 1.4: Ứng dụng camera nhiệt theo dõi để kiểm sốt hỏa hoạn[4] Hình 1.5: Đo thân nhiệt người sân bay camera ảnh nhiệt[5] Hình 1.6: Ứng dụng camera nhiệt sửa chữa máy móc[6] Hình 1.7: Camera nhiệt dùng để kiểm tra, sửa chữa linh kiện điện tử 10 Hình 1.8: Ứng dụng thực thi pháp luật[8] 10 Hình 1.9: Ảnh nhiệt chụp lại vị trí thể người[10] 11 Hình 1.10: Phát nước thấm camera nhiệt[11] 12 Hình 1.11: Camera nhiệt kiểm tra thiết bị điện có dấu hiệu bất thường nhiệt[13] 13 Hình 1.12: Hình ảnh nhiệt đầu lợn tăng bị stress[15] 15 Hình 1.13: = sở tai trái (BEAR_L); = sở bên phải tai (BEAR_R) ;3 = chóp tai trái (TEAR_L); = chóp tai phải (TEAR_R); = mắt trái mắt phải (EYE_O);6=nhiệt độ trung bình từ đầu đến mơng (AVCRL)[17] 16 Hình 1.14: Biểu đồ biểu thị thay đổi nhiệt độ vị trí T1,T2,T3,T4 [18]19 Hình 1.15: Hình ảnh nhiệt thể lợn mắc bệnh dịch tả lợn cổ điển 19 Hình 1.16: Ảnh lợn bị cảm sốt 21 Hình 1.17: Tác giả sử dụng nhiệt kế NURSE ANGIE đo phương pháp tiếp xúc 23 Hình 1.18: Lợn gắn cảm biến tai[22] 24 Hình 1.19: Tác giả đo thân nhiệt lợn camera flir TG267 25 Hình 1.20: Quá trình xử lý ảnh[24] 26 vi Hình 1.21: Các bước hệ thống xử lý ảnh 27 Hình 1.22: Cấu trúc tệp ảnh dạng PCX 33 Hình 2.1: Sơ đồ cơng nghệ phần mềm phân loại số bệnh lợn 37 Hình 2.2: Camera ảnh nhiệt cầm tay FLIR TG267 39 Hình 2.3: Arduino uno 40 Hình 2.4: Module sim 900A 41 Hình 2.5: Sơ đồ chân module sim 900A 42 Hình 2.6: Sơ đồ ngun lí mạch cảnh báo 43 Hình 2.7: Trackbars sau tạo 45 Hình 2.8: Kết sau điều chỉnh giá trị 45 Hình 2.9: Ảnh khơng gian màu HSV[31] 46 Hình 2.10: Ảnh sau lọc màu 47 Hình 2.11: Ảnh sau xám hóa nhị phân 47 Hình 2.12: Chuyển đổi hệ thống màu RGB sang Grayscale[20] 48 Hình 2.13: Ví dụ minh họa với ngưỡng 127[35] 51 Hình 2.14: Lưu đồ thuật tốn chương trình 52 Hình 2.15: Lưu đồ thuật toán xác định nhiệt độ lớn 53 Hình 2.16: Lưu đồ thuật tốn gửi tin nhắn cảnh báo 54 Hình 3.1: Kết nối camera nhiệt với máy tính để lấy liệu 57 Hình 3.2: Kết nối mơ hình hệ thống phân tích 57 Hình 3.3: a: Ảnh nhiệt thể lợn có chứa vùng bất thường, b: Ảnh nhiệt thể lợn không chứa vùng bất thường[35] 58 Hình 3.4: Ảnh sau lọc màu 58 Hình 3.5: Ảnh sau xám hóa 59 Hình 3.6: Ảnh sau nhị phân hóa 59 Hình 3.7: Kết cuối phần mềm đưa 60 Hình 3.8: Tin nhắn cảnh báo gửi qua tin nhắn sms 60 vii LỜI MỞ ĐẦU Đặt vấn đề Ngày có nhiều cách để chuẩn đốn, xác định bệnh phổ biến lợn như: quan sát - nhìn, sờ nắn, gõ, nghe, Các phương pháp chuẩn đốn cần tiếp xúc trực tiếp với thể lợn, điều phần ảnh hưởng tới kết chuẩn đốn tình trạng lợn tiếp xúc trực tiếp gây hoảng loạn tạo stress cho lợn làm cho bệnh nghiêm trọng gây lây nhiễm bệnh từ lợn qua người Do đó, việc ứng dụng camera ảnh nhiệt công nghệ xử lý ảnh đem lại hiệu ưu việt phương pháp chuẩn đốn truyền thống cách tiếp xúc vật lí Khi sử dụng camera ảnh nhiệt để chuẩn đoán giúp ta thu thập liệu cách hiệu quả, xác nhanh chóng mà khơng cần tiếp xúc trực tiếp Hiện giới Việt Nam ứng dụng hiệu công nghệ camera ảnh nhiệt công nghệ xử lý ảnh việc chuẩn đốn số bệnh thơng thường vật lợn Việc ứng dụng cơng nghệ mang lại nhiều ưu điểm việc chuẩn đoán bệnh thể lợn như: Đưa kết nhanh chóng xác Giúp thu thập thơng tin quan trọng mà khơng cần tiếp xúc vật lí Cung cấp cho ta thông tin sơ bệnh, mức độ nghiêm trọng bệnh mà biện pháp kiểm tra vật lí khơng thể phát Mặc dù có nhiều ưu điểm việc chuẩn đốn bệnh việc sử dụng camera ảnh nhiệt để thu thập liệu tồn số nhược điểm sau: Chỉ áp dụng với bệnh liên quan đến việc thay đổi nhiệt độ thể vật ni Nguồn pin có thời lượng sử dụng định, cần kiểm tra bổ sung kịp thời để đảm bảo khả vận hành không bị gián đoạn q trình sử dụng Cần có hệ thống xử lý người có trình độ chun mơn cao để xử lý nên áp dụng trang trại với cán có trình độ Trong khn khổ đề tài em cung cấp cho người đọc nhìn tổng quan việc ứng dụng camera ảnh nhiệt công công nghệ xử lý ảnh việc chuẩn đoán số bệnh gia súc, gia cầm áp dụng giới Việt Nam Từ tình hình thực tế, việc nghiên cứu chế tạo mơ hình hệ thống tự động phát chuẩn đoán số bệnh gây tăng thân nhiệt từ xa góp phần thúc đẩy ngành chăn ni nước ta theo hướng đại hóa Vì em chọn ý tưởng nghiên cứu là: “NGHIÊN CỨU PHÁT TRIỂN PHẦN MỀM VÀ PHÂN LOẠI MỘT SỐ BỆNH TRÊN VẬT NI” Mục đích nghiên cứu đề tài Tìm cá thể lợn có nhiệt độ tăng bất thường ảnh thân nhiệt đàn lợn Xác định vị trí giá trị nhiệt độ lớn cá thể bị nhiễm bệnh Nhận diện phân loại số loại bệnh lợn tăng nhiệt độ bất thường Gửi tin nhắn SMS cảnh báo số điện thoại người quản lý cài đặt sẵn Đối tượng nghiên cứu Phần mềm Open CV (phần mềm sử dụng ngôn ngữ) Ngơn ngữ lập trình Python Camera ảnh nhiệt Arduino uno module sim 900A Nội dung phương pháp nghiên cứu 4.1 Nội dung Chương 1: Tổng quan đề tài Chương 2: Nội dung phương pháp nghiên cứu Chương 3: Kết thảo luận np.uint8([1, 176, 175]) ] window = Tk() filename = '' foundCOM = serial.tools.list_ports.comports() url = Label(window,text="Chọn Cổng COM") url.grid(row=1, column=0 ,padx=10,pady=10) variable = StringVar(window) variable.set("") # default value w = OptionMenu(window , variable, *(window, variable) + tuple(foundCOM)) w.grid(row=1, column=1) def process_image(frame, ser, index): global filename a, file_extension = os.path.splitext(filename) img = frame hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower = list_lower[10] upper = list_upper[0] white_mask = cv2.inRange(hsv, lower, upper) 75 result = cv2.bitwise_and(frame, frame, mask = white_mask) cv2.imshow('inrange', result) gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY) cv2.imshow('gray', gray) ret, thresh = cv2.threshold(gray ,1 ,255, cv2.THRESH_BINARY) cv2.imshow('thresh', thresh) contours, hier = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img, contours, -1, (0,255,0), 3) print(len(contours)) if (len(contours) > 0): # get biggest contour biggest_contour = contours[0] max_area = for contour in contours: area = cv2.contourArea(contour) if max_area < area: max_area = area biggest_contour = contour M = cv2.moments(biggest_contour) cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) 76 # font font = cv2.FONT_HERSHEY_SIMPLEX # org org = (250, 250) # fontScale fontScale = # Blue color in BGR color = (0, 0, 0) # Line thickness of px thickness = # text = '[' + str(cx) + ',' + str(cy) + ']' # cv2.putText(img, text, org, font, # fontScale, color, thickness, cv2.LINE_AA) # print(cx, cy) # cv2.imshow("origin after", img) # cv2.imwrite("output/origin after [" + str(cx) + "," + str(cy) + "].png", img) # cv2.imwrite("output/origin after ALL" + str(index) + ".png", img) flag = True for i in range(10, 0, -1): print(i) 77 lower = list_lower[i] upper = list_upper[i] white_mask = cv2.inRange(hsv, lower, upper) result = cv2.bitwise_and(frame, frame, mask = white_mask) #cv2.imshow('inrange', result) gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY) #cv2.imshow('gray', gray) ret, thresh = cv2.threshold(gray ,1 ,255, cv2.THRESH_BINARY) #cv2.imshow('thresh', thresh) contours, hier = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img, contours, -1, (0,0,0), 12) print(len(contours)) if (len(contours) > 0): # get biggest contour biggest_contour = contours[0] max_area = for contour in contours: area = cv2.contourArea(contour) if max_area < area: max_area = area biggest_contour = contour 78 M = cv2.moments(biggest_contour) # cx = int(M['m10']/M['m00']) # cy = int(M['m01']/M['m00']) # font font = cv2.FONT_HERSHEY_SIMPLEX # org org = (90, 90) # fontScale fontScale = # Blue color in BGR color = (255, 255, 255) # Line thickness of px thickness = # text = '[' + str(cx) + ',' + str(cy) + ']' text = '{}'.format(i*0.1 + 36.5) cv2.putText(img, text, org, font, fontScale, color, thickness, cv2.LINE_AA) # print(cx, cy) cv2.imshow("origin after", img) # cv2.imwrite("output/origin after [" + str(cx) + "," + str(cy) + "].png", img) 79 cv2.imwrite("output/origin after" + ' ' + str(index)+ "[" + str(i*0.1 + 36.5) + "].png",img) a = urlparse(filename) print(os.path.basename(a.path)) # Send To Arduino textToSend = str(index) + "[" + str(i*0.1 + 36.5) + "].png" + '*' print(textToSend) if variable.get() != '': ser.write(textToSend.encode()) # output = ser.read(10) if file_extension != '.mp4': # mess = "{} [{},{}] có dấu hiệu bất thường nhiệt cần kiểm tra sức khoẻ".format(os.path.basename(a.path), str(cx), str(cy)) #mess = "Nhiệt độ: {} => có dấu hiệu bất thường nhiệt cần kiểm tra sức khoẻ".format(i*0.1 + 36.5) tkinter.messagebox.showwarning(title="Bất thường", message=mess) # Found Highest temperature flag = False break if flag: print("Not Found") 80 # output = ser.read(10) a = urlparse(filename) print(os.path.basename(a.path)) textToSend = '' #textToSend = str(index) + '.png' print(textToSend) if variable.get() != '': ser.write(textToSend.encode()) if file_extension != '.mp4': #mess = a.path + " khơng có dấu hiệu bất thường nhiệt ý theo dõi thường xuyên" tkinter.messagebox.showinfo(title="Bình thường", message=mess) def getFile(): global filename filename = filedialog.askopenfilename(initialdir = "C:/Users/Admin/Desktop/python",title = "Select file",filetypes = (("jpeg files","*.jpg"),("mp4 files","*.mp4"),("all files","*.*"))) e.delete(0,"end") e.insert(0, filename) def process_video(filename, ser): print(filename) cap = cv2.VideoCapture(filename) current_time = time.time() 81 i=0 while cap.isOpened(): ret, frame = cap.read() if (ret): cv2.imshow('frame',frame) # print(time.time() - current_time) if time.time() - current_time >= 5: cv2.imwrite('temp/' + str(i) + '.png', frame) if variable.get() != '': process_image(frame, ser, i) else: process_image(frame, None, i) current_time = time.time() i=i+1 if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() def process(): global filename if (filename == ''): tkinter.messagebox.showerror(title="Lỗi file ảnh", message="Chưa chọn file ảnh") elif (variable.get() == ''): 82 tkinter.messagebox.showerror(title="Lỗi COM", message="Chưa chọn COM") a, file_extension = os.path.splitext(filename) index = if variable.get() != '': for com in foundCOM: if (str(com) == variable.get()): break index = index + # Mở cổng COM ser = Serial(foundCOM[index].device, baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE) time.sleep(2) if file_extension == '.jpg' or file_extension == '.jpeg' or file_extension == '.png': # Kiểm tra ảnh img = cv2.imread(filename) a = urlparse(filename) print(os.path.basename(a.path)) print(variable.get()) if variable.get() != '': 83 process_image(img, ser, 0) else: process_image(img, None, 0) elif file_extension == '.mp4': # Kiểm tra video dịnh dạng mp4 x = threading.Thread(target=process_video, args=(filename, ser)) x.start() # Đợi để kích hoạt cổng COM time.sleep(2) window.title("Welcome Thermal Detection") url = Label(window,text="Đường dẫn") url.grid(row=0, column=0 ,padx=10,pady=10) e = Entry(window, width=50) e.grid(row=0, column=1) e.focus_set() gridFrame = tk.Frame(window) b = Button(gridFrame, text="Chọn Ảnh/Video", width=20, command=getFile).pack(side=tk.LEFT) runbtn = Button(gridFrame, text="Chạy", width=10, command=process).pack(side=tk.LEFT) gridFrame.grid(row = 3, column = 1, padx=20) window.mainloop() 84 2.Chương trình tạo trackbars import cv2 import sys import numpy as np img_path = sys.argv[1] def nothing(x): pass cv2.namedWindow("Trackbars") cv2.createTrackbar("L - H", "Trackbars", 0, 179, nothing) cv2.createTrackbar("L - S", "Trackbars", 0, 255, nothing) cv2.createTrackbar("L - V", "Trackbars", 0, 255, nothing) cv2.createTrackbar("U - H", "Trackbars", 179, 179, nothing) cv2.createTrackbar("U - S", "Trackbars", 255, 255, nothing) cv2.createTrackbar("U - V", "Trackbars", 255, 255, nothing) def process(frame): #frame = cv2.resize(frame, (320, 160)) #frame = frame[90:160, 0:320] ##### Tracking bar ####### l_h = cv2.getTrackbarPos("L - H", "Trackbars") l_s = cv2.getTrackbarPos("L - S", "Trackbars") l_v = cv2.getTrackbarPos("L - V", "Trackbars") u_h = cv2.getTrackbarPos("U - H", "Trackbars") u_s = cv2.getTrackbarPos("U - S", "Trackbars") u_v = cv2.getTrackbarPos("U - V", "Trackbars") hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of white color in HSV 85 lower = np.array([l_h, l_s, l_v]) upper = np.array([u_h, u_s, u_v]) mask = cv2.inRange(hsv, lower, upper) white_mask = cv2.inRange(hsv, lower, upper) result = cv2.bitwise_and(frame, frame, mask = white_mask) cv2.imshow('bbb', result) while True: img = cv2.imread(img_path) process(img) # cv2.imshow('aaa', qimg) if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() 86 3.Chương trình Arduino #include #include SoftwareSerial mySerial(2, 3); unsigned long bauds = 9600; char code[] = "0000"; String phone = "\"0973140102\""; char msg[] = "Hello World!"; String inputString = ""; bool stringComplete = false; void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(bauds); while (!Serial) {;} mySerial.begin(9600); delay(5000); } void(* resetFunc) (void) = 0; void loop() { if (mySerial.available()){ char c = mySerial.read(); Serial.print(c); } if (Serial.available()){ char c = Serial.read(); 87 Serial.print(c); if ((c != '*')){ inputString += c; } if (c == '*'){ // Co dau hieu bat thuong digitalWrite(LED_BUILTIN, HIGH); delay(300); digitalWrite(LED_BUILTIN, LOW); delay(300); sendSMS(inputString); } else { digitalWrite(LED_BUILTIN, HIGH); delay(300); digitalWrite(LED_BUILTIN, LOW); delay(300); } } } void toggle(){ digitalWrite(LED_BUILTIN, HIGH); delay(300); digitalWrite(LED_BUILTIN, LOW); delay(300); } void sendSMS(String inputString){ 88 mySerial.println("AT+CMGF=1"); toggle(); delay(1000); mySerial.println("AT+CMGS=" + phone); toggle(); delay(1000); mySerial.println(inputString + "co dau hieu bat thuong ve nhiet"); toggle(); delay(1000); mySerial.println((char)26); toggle(); delay(2000); // resetFunc(); } 89

Ngày đăng: 06/07/2023, 21:41

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

Tài liệu liên quan