Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 89 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
89
Dung lượng
2,63 MB
Nội dung
HỌC VIỆN NÔNG NGHIỆP VIỆT NAM KHOA CƠ ĐIỆN ĐỒ ÁN TỐT NGHIỆP ĐỀ TÀI: ỨNG DỤNG THUẬT TOÁN YOLO PHÁT HIỆN VÀ CẢNH BÁO BỆNH SƯƠNG MAI TRÊN CÂY DƯA CHUỘT Giảng viên hướng dẫn : TS NGƠ TRÍ DƯƠNG Sinh viên thưc : NGUYỄN VĂN BIỂN Msv : 603057 Lớp : K60 – TDHB 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 riêng tơi, kết nghiên cứu trình bày đồ án trung thực, khách quan chưa dùng để bảo vệ cho đồ án môn học Tôi xin cam đoan giúp đỡ cho việc thực đồ án cám ơn, thơng tin trích dẫn đồ án rõ nguồn gốc Hà Nội, ngày… tháng ….năm 2021 Tác giả đồ án NGUYỄN VĂN BIỂN i LỜI CẢM ƠN Được phân công quý thầy cô khoa Cơ-Điện , Trường Học Viện Nông Nghiệp Việt Nam , sau gần sáu tháng thực tập em hoàn thành Khóa luận tốt nghiệp Để hồn thành nhiệm vụ giao, nỗ lực học hỏi thân cịn có hướng dẫn tận tình thầy cô Em chân thành cảm ơn thầy giáo TS NGƠ TRÍ DƯƠNG thầy giáo ThS NGƠ QUANG ƯỚC người hướng dẫn cho em suốt thời gian thực tập Mặc dù thầy bận không ngần ngại dẫn em, định hướng cho em, để em hoàn thành tốt nhiệm vụ Một lần em chân thành cảm ơn thầy chúc thầy dồi sức khoẻ Đồng thời em gửi lời cảm ơn trân thành đến tồn thể q thầy Trường Học Viện Nơng nghiệp Việt Nam nói chung, quý thầy cô Khoa Cơ – Điện mơn: Tự Động Hóa nói riêng bỏ cơng sức truyền đạt lại kiến thức cho chúng em năm theo học trường Tuy nhiên kiến thức chun mơn cịn hạn chế thân cịn thiếu nhiều kinh nghiệm thực tiễn nên nội dung báo cáo khơng tránh khỏi thiếu xót, em mong nhận góp ý, bảo thêm quý thầy tồn thể lãnh đạo để báo cáo hoàn thiện tốt Em xin chân thành cảm ơn! Hà Nội, tháng năm 2021 Sinh viên Nguyễn văn Biển 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 PHẦN MỞ ĐẦU CHƯƠNG I TỔNG QUAN TÀI LIỆU 1.1 Tổng quan xử lý ảnh 1.1.1 Khái quát xử lý ảnh 1.1.2 Những vấn đề hệ thống xử lý ảnh 1.1.3 Những vấn đề khác xử lý ảnh 1.1.4 Nhận dạng đối tượng xử lý ảnh 1.2 Ứng dụng xử lý ảnh đời sống 10 1.3 Ứng dụng xử lý ảnh tự động hóa 15 1.3.1 Ứng dụng công nghiệp .15 1.3.2 Trong lĩnh vực nông nghiệp 18 1.4 Yêu cầu thiết kế 20 CHƯƠNG NỘI DUNG VÀ PHƯƠNG PHÁP NGHIÊM CỨU .22 2.1 Đối tượng nghiêm cứu 22 2.1.1 Cây dưa chuột 22 2.1.2 Một số mơ hình thuật tốn CNN 24 2.1.3 Hạn chế việc nghiên cứu thuật toán 30 2.1.4 Đề xuất phương án xử lý ảnh thuật toán YOLO .31 2.1.5 Thiết bị chung 38 2.1.6 Cài đặt hệ điều hành cho Raspberry PI .41 2.1.7 Thư viện OpenCV .42 iii 2.1.8 Ngơn ngữ lập trình python 46 2.2 Nội dung nghiên cứu 49 2.3 Phương pháp nghiên cứu 49 CHƯƠNG KẾT QUẢ VÀ THẢO LUẬN 50 3.1 Sơ đồ tổng quát .50 3.1.1 Sơ đồ khối 50 3.1.2 Sơ đồ cấu trúc hoạt động .50 3.2 Lưu đồ thuật toán 52 3.3 Giao diện Raspberry .53 3.4 Xây dựng mẫu thuật toán YOLO .54 3.4.1 Xây dựng liệu hình ảnh bệnh sương mai 54 3.5 Chạy thực nghiệm 63 3.6 Kết thảo luận 65 3.6.1 Kết .65 3.6.2 Thảo luận 66 KẾT LUẬN VÀ ĐỀ NGHỊ 68 TÀI LIỆU THAM KHẢO 70 PHỤ LỤC .71 iv DANH MỤC BẢNG Bảng 2.1 Các kiểu mã thường dùng 48 Bảng 3.1 Các lỗi gặp phải trình thử nghiệm 65 Bảng 3.2 Kết thí nghiệm phịng thí nghiệm 66 Bảng 3.3 Kết thí nghiệm với ánh sáng khác 66 Bảng 3.4 Bảng hoạch toán 67 v DANH MỤC HÌNH Hình 1.1 Các bước hệ thống xử lý ảnh Hình 1.2.Minh họa thay đổi góc chụp Hình 1.3.Minh họa cho che khuất Hình 1.4 Sự phức tạp hình Hình 1.5 Minh họa độ sáng khác 10 Hình 1.6 Xử lý ảnh hỗ trợ bác sĩ chẩn đốn 11 Hình 1.7 Hệ thống Camera nhận dạng khuôn mặt 12 Hình 1.8 Bộ nhận dạng mặt người smartphone 14 Hình 1.9 Kiểm tra dược phẩm xử lý ảnh 16 Hình 1.10 Kiểm tra mã vạch 16 Hình 1.11 Ứng dụng xử lý ảnh quản lí kho hàng 17 Hình 1.12 Tiên đốn bảo trì thiết bị công nghệ xử lý ảnh 18 Hình 1.13 Cơng nghệ xử lý ảnh áp dụng kiểm tra chất lượng chín dâu tây 18 Hình 1.14 Hệ thống giám sát phun thuốc 19 Hình 1.15 Sử dụng máy bay khơng người lái để giám sát phát trình phát triển 19 Hình 1.16 Giám sát trồng 20 Hình 2.1 Ảnh dưa chuột 22 Hình 2.2.Ảnh bệnh sương mai câ dưa chuột 23 Hình 2.3 Sơ đồ xử lý mơ hình mạng R-CNN 25 Hình 2.4 Kiến trúc single model Fast R-CNN 26 Hình 2.5.Kiến trúc mơ hình Faster R-CNN 28 Hình 2.6 Cấu trúc Alexnet 29 Hình 2.7 Sơ đồ kiến trúc mạng YOLO 31 Hình 2.8 Các lớp mạng darknet-53 32 vi Hình 2.9 Kiến trúc output model YOLO 33 Hình 2.10 Các feature map mạng YOLOv3 34 Hình 2.11 Xác định anchor box cho vật thể 35 Hình 2.12 Khi hai vật thể người xe trùng điểm thuộc 36 Hình 2.13 Cơng thức ước lượng bounding box từ anchor box 37 Hình 2.14 non-max suppression 37 Hình 2.15 Mạch Raspberry PI 38 Hình 2.16 Module Camera Raspberry 40 Hình 2.17 Sơ đồ cắm đầu kết nối để cài hệ điều hành 41 Hình 2.18 Hướng dẫn cài đặt hệ điều hành trung tâm 42 Hình 2.19 Cài thư viện 45 Hình 2.20 Cài thư viện opencv 45 Hình 2.21.Cài thư viện OpenCV cho Raspberry PI 45 Hình 2.22 Giao diện Thonny Python IDE 48 Hình 3.1 Sơ đồ khối 50 Hình 3.2 Sơ đồ cấu trúc hoạt động 50 Hình 3.3 Lưu đồ thuật tốn q trình xử lí ảnh 52 Hình 3.4 Cài VNC Rasperry PI 53 Hình 3.5 Hình ảnh ruộng dưa chuột Viện Rau 54 Hình 3.6 Hình ảnh bệnh sương mai 54 Hình 3.7 Các hình ảnh bệnh sương mai thu thập 55 Hình 3.8 Giao diện phần mềm labellmg 55 Hình 3.9 Gán nhãn ảnh 56 Hình 3.10 Ảnh mã hoá sau gán nhãn 56 Hình 3.11 Sơ đồ trình train model google Colaboratory 57 Hình.3.12 Tạo code block 58 Hình 3.13.Dán code chọn tài khoản Google Driver 58 Hình 3.14 Tải mã nguồn YOLO Driver 58 vii Hình 3.15 UPLOAD file lên Google Driver 58 Hình 3.16 Giải nén file data.zip 59 Hình 3.17 Tạo file Yolo.Names 59 Hình 3.18 Tạo file train.txt val.txt 59 Hình 3.19 Tạo file Yolo.data 60 Hình 3.20 Biên dịch mã nguồn Darknet 60 Hình 3.21.Download pretrain weight 60 Hình 3.22 Train 60 Hình 3.23 File Weight 61 Hình 3.24 Ảnh nhận dạng bệnh sương mai 61 Hình 3.25 Thơng số kết sau test 62 Hình 3.26 Biểu đồ 62 Hình 3.27 Robot chụp ảnh dưa chuột bị bệnh sương mai 63 Hình 3.28 Gửi cảnh báo bị bệnh sương mai sim 63 Hình 3.29 Gửi cảnh báo bị bệnh sương mai email 64 Hình 3.39 Robot chụp ảnh dưa chuột khơng bị bệnh 64 Hình 3.30 Gửi cảnh báo không bị bệnh sim 64 Hình 3.31 Gửi cảnh báo không bị bệnh email 64 Hình 3.32 Ảnh hiển thị nên hình LCD 65 viii PHẦN MỞ ĐẦU Đặt vấn đề Hiện nước ta thời kỳ công nghiệp hóa, đại hóa phát triển đất nước Sự phát triển công ty, đặc biệt nước có cơng nghiệp mạnh kỹ thuật cao Nhật Bản, Hàn Quốc,… xây dựng nhà máy, chuyển giao kỹ thuật đào tạo nguồn nhân lực cho Việt Nam Sinh viên Việt Nam học hỏi, tiếp cận với trang thiết bị đại, tìm hiểu, thực hành với mức độ cao Khơng có ngành cơng nghiệp, việc ứng dụng tự động hóa vào ngành nơng nghiệp Việt Nam có bước tiến quan trọng Nông nghiệp 4.0, phát triển diễn đồng thời với phát triển giới công nghiệp 4.0 giai đoạn ứng dụng mạnh mẽ thiết bị cảm biến kết nối internet (IoT), công nghệ đèn LED, thiết bị bay không người lái, robot nơng nghiệp quản trị tài trang trại thông minh Cũng tương tự nhiều nước phát triển giới khu vực Đông - Nam Á, đến Việt Nam chưa có mơ hình Nơng nghiệp 4.0 hồn chỉnh Song thực tế nay, nơng nghiệp thơng minh bắt đầu có nghiên cứu, áp dụng thực tiễn Trí tuệ nhân tạo nằm số đó, việc đưa trí tuệ nhân tạo vào khâu sản xuất nông nghiệp đem lại tự động hóa cao, thay đổi lớn phương thức sản xuất nông nghiệp so với cách truyền thống trước Đem lại suất cao hơn, chất lượng tốt hơn, tiến tới gần với Nơng nghiệp 4.0, phụ thuộc người tham gia trực tiếp vào trình sản xuất Từ tầm quan trọng việc áp dụng công nghệ cao vào sản xuất nông nghiệp, bắt kịp xu phát triển khoa học kỹ thuật mà em tiến hành nghiên cứu thực đề tài: “Ứng dụng thuật toán yolo phát cảnh bảo bệnh sương mai dưa chuột ” Mục đích nghiên cứu Thơng qua việc nghiên cứu làm việc nghiêm túc để rèn luyện tác phong, hoàn thiện phương pháp, tư nghiên cứu, giải vấn đề Bảng 3.2 Kết thí nghiệm phịng thí nghiệm Nhận dạng Khoảng Số lượng Nhận cách thay mẫu bệnh dạng đổi (cm) sương mai 20cm 20 20 100 40cm 20 20 100 60cm 20 19 95 80cm 20 17 85 100cm 20 14 70 STT nhầm (hoặc không nhận dạng được) Độ xác % Bảng 3.3 Kết thí nghiệm với ánh sáng khác STT Điều kiện ánh sáng Hình ảnh chụp Đủ sáng (ban ngày) Ảnh chụp rõ nét Thiếu sáng ảnh bị nhịe, vỡ ảnh Nhận dạng Nhận dạng tồn ảnh bệnh có tượng nhận dạng nhầm 3.6.2 Thảo luận Kết đạt : Mơ hình làm việc ổn định điều kiện ánh sáng khác sai số nằm ngưỡng cho phép Hình ảnh chụp rõ nét, nhận dạng đối tượng tốt Từ số liệu cho thấy kết thử nghiệm điều kiện ánh sáng đầy đủ chuẩn xác, với ánh sáng đèn độ xác lên tới xấp xỉ 90% Kết với mơ hình thực tế quy mô nhỏ sở vững để phát triển đồng quy mô lớn Và nghiên cứu tối ưu kinh phí để tiến tới thương mại hóa 66 Những mặt tồn tại: Thời gian chụp xử lý ảnh cịn dài Bộ liệu cịn nên đơi nhận nhầm báo nhầm đối tượng điện thoại Khi chụp ảnh xa camera chụp ảnh không rõ nên cần thiết bị có độ phân giải cao Nội dung nghiên cứu hạn chế chưa đáp ứng số tiêu chí đề 3.7 Hoạch toán Bảng 3.4 Bảng hoạch toán STT Tên thiết bị Số Đơn giá lượng (VNĐ) Arduino Nano 80.000 Raspberry PI Model B 1.300.000 Mạch giảm áp 5VDC 50.000 Thẻ nhớ Micro SD 16G class 10 Sandisk ultra 400.000 Webcam Dahua Z2 Plus 720P 1.100.000 Nguồn cấp cho Raspberry PI 600.000 Động Servo MG996 90.000 Động Servo GM25-370 DC 900.000 Màn hình LCD inh 900.000 10 Cảm biến dị line 75.000 11 Nhơm định hình 20x20 300.000 12 Cơ cấu vít me 300.000 13 Modul L298 50.000 14 Acquy Yamato 12V 500.000 Tổng 24 6.645.000 67 KẾT LUẬN VÀ ĐỀ NGHỊ Kết luận Sau thời gian nghiên cứu tìm hiểu hướng dẫn nhiệt tình TS.Ngơ Trí Dương đề tài: “Ứng dụng thuật YOLO phát cảnh báo bệnh sương mai dưa chuột.” em hồn thành Qua q trình nghiên cứu tìm hiểu em biết thêm về: Raspberry PI máy tính nhúng hữu dụng để nghiên cứu phát triển AI, nông nghiệp 4.0 Truyền thông IoT cho nông nghiệp hay ứng dụng đời sống Chế tạo thiết bị đáp ứng vài yêu cầu đặt Chụp ảnh Xử lý liệu nhận dạng đối tượng Gửi thông báo tin nhắn email Từ đề tài cho thấy việc áp dụng cơng nghệ vào nơng nghiệp khơng cịn xa nữa, mà thực hiện, nghiên cứu Trong đồ án đưa phương pháp tối ưu với diện tích lớn thay nhiều nguồn nhân cơng hay thời gian, kịp thời canh tác thể hoạt động Ở đồ án khơng cịn phát màu với dải màu định sẵn đề tài trước đây, mà thay đổi hoàn toàn với học máy, với liệu đặc trưng để nhận dạng đối tượng đa dạng hơn, đối tượng nhận dạng đặc điểm đặc trưng Kiến nghị Trong khoảng thời gian thực đề tài có số nội dung em chưa thể tối ưu thời gian kinh phí cịn hạn hẹp, bổ sung: Bộ liệu xây dựng cịn thiếu nên cho kết chưa xác hoàn toàn nên cần xây dựng thêm liệu 68 Đối với ứng dụng nhận dạng đối tượng phát triển rộng khơng sâu bệnh cây, chăn nuôi, hay đời sống hàng ngày giám sát an ninh, nhận dạng khuôn mặt, theo dõi đối tượng Em mong quý thầy, cô tạo điều kiện hướng cho bạn sinh viên khoá sau tiếp tục phát triển cho đề tài 69 TÀI LIỆU THAM KHẢO [1] Cao Xuân Nam, Hoàng Trung Hiếu, Nguyễn Hải Triều, Vịng Chí Tài, Vũ Hải Quân, “Tự học lập trình Python bản”, Nhà xuất Đại học quốc gia Thành phố Hồ Chí Minh [2] Võ Tuấn Duy, Python Cơ Bản [3] https://docs.python.org/3/ [4] https://www.w3schools.com/python/default.asp [5] https://github.com/ [6] https://pbcquoc.github.io/cnn/ [7] https://raspberrypi.vn/ [8] https://picamera.readthedocs.io/en/release1.13/recIPes2.html#capturingto-an-opencv-object [9] Karthik R, Hariharan M, Sundar Anand, Priyanka Mathikshara, Annie Johnson, Menaka R Attention embedded residual CNN for disease detection in tomato leaves https://www.sciencedirect.com/science/article/pii/S156849461930718 [10] Paul A Viola and Michael J Jones, (2001) Rapid Object Detection using a Boosted Cascade of Simple Features IEEE Conference on Computer Vision and Pattern Recognition [11] Paul A Viola and Michael J Jones, (2004) Robust real-time face detection International Journal of Computer Vision [12] Stan Z Li and Anil K Jain (2005) Handbook of Face Recognition 70 PHỤ LỤC # Chương trình xử lý ảnh : import time import cv2 import argparse import numpy as np import os box_file = "box_file.txt" if os.path.exists(box_file): with open(box_file,'r') as text_file: box_content = text_file.read() chuoi = box_content.split(",") maxx = len(chuoi) counter = int(chuoi[maxx - 2]) else : counter = box_file = "box_file.txt" '''from picamera import PiCamera camera = PiCamera() camera.rotation=180 camera.resolution = (252, 336) import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(16,GPIO.IN, pull_up_dơn=GPIO.PUD_UP) GPIO.setup(20,GPIO.OUT) // phan GPIO.output(20,1)''' 71 phien = tam = stt = counter name ="" cll = "yolo.names" ww = 'yolov4-custom_last.weights' cc = 'yolov4-custom.cfg' def get_output_layers(net): layer_names = net.getLayerNames() output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()] return output_layers def draw_prediction(img, class_id, confidence, x, y, x_plus_w, y_plus_h): label = str(classes[class_id]) color = COLORS[class_id] cv2.rectangle(img, (x, y), (x_plus_w, y_plus_h), color, 2) cv2.putText(img, label, (x - 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) while(True): if tam == 0: #if GPIO.input(16) == False: #namechup = "chup.jpg" #camera.capture(str(namechup)) ii = "data/267.jpg" #image = cv2.imread(namechup) image = cv2.imread(ii) Width = image.shape[1] Height = image.shape[0] 72 scale = 0.00392 classes = None with open(cll, 'r') as f: classes = [line.strip() for line in f.readlines()] COLORS = np.random.uniform(0, 255, size=(len(classes), 3)) net = cv2.dnn.readNet(ww, cc) blob = cv2.dnn.blobFromImage(image, scale, (416, 416), (0, 0, 0), True, crop=False) net.setInput(blob) outs = net.forward(get_output_layers(net)) class_ids = [] confidences = [] boxes = [] conf_threshold = 0.5 nms_threshold = 0.4 # Thực xác định HOG SVM start = time.time() for out in outs: for detection in out: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: center_x = int(detection[0] * Width) center_y = int(detection[1] * Height) w = int(detection[2] * Width) h = int(detection[3] * Height) x = center_x - w / 73 y = center_y - h / class_ids.append(class_id) confidences.append(float(confidence)) boxes.append([x, y, w, h]) indices = cv2.dnn.NMSBoxes(boxes, confidences, conf_threshold, nms_threshold) print("indices = ",indices) #print(indices) for i in indices: phien = phien + i = i[0] if i >= 0: box = boxes[i] x = box[0] y = box[1] w = box[2] h = box[3] draw_prediction(image, class_ids[i], confidences[i], round(x), round(y), round(x + w), round(y + h)) if phien >= 0: stt = stt + name = "ANH/BENH SUONG MAI " + str(stt) +".jpg" #name = "ANH/BENH SUONG MAI.jpg" cv2.imwrite(name, image) print(stt) fr = open(box_file, 'a') fr.write(str(stt) + ",") fr.close() 74 #GPIO.output(20,0) cv2.imshow("object detection", image) end = time.time() cv2.waitKey(1) time.sleep(1) cv2.destroyAllWindows() phien = # Chương trình gửi tin nhắn : #include "SIM900.h" #include "sms.h" #include #define GPIO_P 12 #define GPIO_S 11 #define suong_mai #define phan_trang SoftwareSerial mySerial(4, 5); // RX, TX SMSGSM sms; int data = 0; int mang[8]; int cp_gui = 0, benh = 0; boolean started = false; //trạng thái modul sim char sdt[13] = "+84981795629"; int i = 0; unsigned long int time_gui = 0; void setup() { pinMode(GPIO_P,INPUT_PULLUP); pinMode(GPIO_S,INPUT_PULLUP); 75 Serial.begin(9600); mySerial.begin(9600); //Serial.println("khoi dong"); // tin nhan if (gsm.begin(2400)) { started = true; Serial.print("connet"); } else Serial.print("not connet"); if (started) { sms.SendSMS(sdt, "Online"); } } void loop() { if(digitalRead(GPIO_S) == 0){ benh = suong_mai; } else benh = 0; tinnhan(); if(millis() - time_gui >=500){ Serial.write(benh); mySerial.write(benh); time_gui = millis(); } } // // 76 void tinnhan() { // - - binh thuong, - thap, - cao if (benh == suong_mai) { if(cp_gui != 1){ sms.SendSMS(sdt, "CAY DANG BI BENH SUONG MAI "); // Serial.println("CAY DANG BI BENH SUONG MAI"); cp_gui = 1; } } if (benh == 0){ if(cp_gui != 3){ sms.SendSMS(sdt, "CAY KHONG BI BENH GI "); // Serial.println("CAY KHONG BI BENH GI "); cp_gui = 3; } } } # chương trình gửi thơng báo qua email: #include #include #include //needed for library #include #include #include 77 #include #include #define led #define button char auth[] = "hT3ZNU4z2NWfhMMxD0gnMLuz0r4CyOBV"; char ssid[] = ""; char pass[] = ""; WiFiClient client; WidgetLED led_1(V1); unsigned long time_gui = 0; int benh = 0, save = 0,tg = 0; int mang[10]; int set_uart = 0; void setup() { // put your setup code here, to run once: pinMode(led , OUTPUT); pinMode(button , INPUT_PULLUP); // TU DONG KET NOI WIFI WiFiManager wifiManager; wifiManager.autoConnect("ESP", "12345678"); Blynk.begin(auth, ssid, pass); nhayled(3); // Blynk.run(); // Blynk.email("vanbienbn97@gmail.com", "THONG BAO", "KHOI DONG"); // delay(5000); } 78 void loop() { Serial.print("b = "); Serial.println(benh); Serial.print("s = "); Serial.println(save); if (set_uart == 1) { Serial.begin(9600); set_uart = 2; } if (set_uart == 0) set_uart = 1; // -CAI DAT WIFI // // NHAN DU LIEU VA XU LY -// if (Serial.available()) { benh = Serial.read(); } // -BLYNK -// Blynk.run(); if (save != benh) { if (benh == 0) { Blynk.email("vanbienbn97@gmail.com", "THONG BAO", "CAY KHONG BI BENH"); } if (benh == 1) { Blynk.email("vanbienbn97@gmail.com", "THONG BAO", "CAY DANG BI BENH SUONG MAI"); } save = benh; } 79 } // -// // -// void nhayled(int lan) { int k; for (k = 0; k < lan; k++) { digitalWrite(led, LOW); delay(500); digitalWrite(led, HIGH); delay(500); } } 80