Bài 10: Mô phỏng hệ thống giám sát môi trường trong nông nghiệp thông minh (Tổng hợp) - MakerEdu Starter Kit for Arduino
Mô tả dự án
Trong bài thực hành tổng hợp này các bạn sẽ thực hiện mô phỏng lại một hệ thống giám sát môi trường trong nông nghiệp thông minh với các thông số ánh sáng, nhiệt độ, độ ẩm và báo hiệu khi các thông số vượt quá mức quy định.
Các bước thực hiện
Danh sách thiết bị
- 1x Mạch Vietduino Uno (Arduino Uno Compatible)
- 1x Mạch MakerEdu Shield for Vietduino
- 1x Cáp USB-C
- 1x Cảm biến độ ẩm nhiệt độ MKE-S14 DHT11 temperature and humidity sensor
- 1x Cảm biến ánh sáng quang trở MKE-S02 LDR light sensor
- 1x Mạch còi báo MKE-M03 buzzer module
- 1x Mạch hiển thị MKE-M07 LCD1602 I2C module
Chuẩn bị trước dự án
- Kết nối mạch MakerEdu Shield với mạch Vietduino Uno theo hướng dẫn.
- Kết nối mạch Vietduino Uno với máy tính qua cáp USB-C sẽ thấy đèn nguồn (ON) trên mạch MakerEdu Shield phát sáng, cài đặt Driver và cấu hình mạch trên phần mềm Arduino theo hướng dẫn tại đây.
- Tìm hiểu về cấu trúc của một chương trình trên phầm mềm Arduino và ngôn ngữ lập trình Arduino tại đây.
Cài đặt bộ thư viện (Library)
- Tải và cài đặt bộ thư viện LiquidCrystal_I2C theo hướng dẫn tại đây.
- Tải và cài đặt bộ thư viện DHT-sensor-library theo hướng dẫn tại đây.
- Tải và cài đặt bộ thư viện Adafruit_Sensor theo hướng dẫn tại đây. (bộ thư viện này cần cài đặt để có thể chạy được bộ thư viện DHT-sensor-library ở phía trên).
Chương trình
- Mở phần mềm IDE Arduino và tạo một chương trình (Sketch) mới.
- Copy đoạn code sau vào chương trình và tiến nạp chương trình (Upload).
// Hệ thống giám sát môi trường nông nghiệp thông minh / MakerEdu Starter Kit for Arduino /* ----------------------------------------------------- */ // Thêm bộ thư viện cho cảm biến DHT và LCD #include <LiquidCrystal_I2C.h> #include <DHT.h> /* ----------------------------------------------------- */ // Chọn chân đọc cảm biến Quang trở #define LDR_PIN A1 // A1 // Chọn chân điều khiển còi Buzzer #define BUZZ_PIN 10 // D10 /* ----------------------------------------------------- */ // Khởi tạo màn hình MKE-M07 LCD1602 I2C với đối tượng là "lcd" LiquidCrystal_I2C lcd(0x27,16,2); // Cài đặt địa chỉ I2C là 0x27 // Mỗi dòng 16 ký tự // 2 dòng hiển thị // Khởi tạo cảm biến MKE-S14 DHT11 với đối tượng là "dht" tại Port D9 DHT dht(9, DHT11); // Các biến lưu giá trị "nhiệt độ" và "độ ẩm" đọc từ cảm biến theo kiểu số thực float temp, humi; // Tạo biến lưu giá trị của cảm biến ánh sáng LDR và biến đếm int rawLDR = 0; int minlightValue = 0; int valueLDR = 0; int count = 0; // Tạo các biến trạng thái Logic bool warning1 = false; bool warning2 = false; bool stateBuzz = 0; /* ----------------------------------------------------- */ void setup() { // Mở cổng Serial Baudrate 115200bps Serial.begin(115200); // Thiết lập chân D10 là Output để điều khiển còi pinMode(BUZZ_PIN, OUTPUT); // Khi mới khởi động, tắt còi digitalWrite(BUZZ_PIN, LOW); // Khởi động màn hình LCD lcd.init(); // Xóa toàn bộ nội dung trên màn hình LCD (nếu có) lcd.clear(); // Bật đèn nền màn hình LCD lcd.backlight(); //Căn chỉnh giá trị của cảm biến ánh sáng lcd.setCursor(0, 0); // Cột 0 dòng 0 lcd.print("Light SS Calib"); lcd.setCursor(0, 1); // Cột 0 dòng 1 lcd.print("Cover the sensor"); Serial.println("Xin để cảm biến ở chỗ tối nhất!"); delay(2000); for (count = 5; count >= 1; count--) { delay(1000); //Đọc giá trị cảm biến ánh sáng LDR rawLDR = analogRead(LDR_PIN); minlightValue = minlightValue + rawLDR; Serial.println(rawLDR); } //Lấy giá trị trung bình 5 lần đo + 10% sai số minlightValue = minlightValue / 4.5; Serial.print("Đo giá trị cảm biến lúc tối nhất:"); Serial.println(minlightValue); // Xóa toàn bộ nội dung trên màn hình LCD (nếu có) lcd.clear(); // In khung nội dung mẫu lên LCD lcd.setCursor(0, 0); // Cột 0 dòng 0 lcd.print("T:"); lcd.setCursor(10, 0); // Cột 10 dòng 0 lcd.print("H:"); lcd.setCursor(0, 1); // Cột 0 dòng 1 lcd.print("LDR: "); // Khởi động cảm biến DHT11 dht.begin(); } /* ----------------------------------------------------- */ void loop() { // Lấy dữ liệu từ cảm biến DHT11 và cảm biến ánh sáng rawLDR = analogRead(LDR_PIN); temp = dht.readTemperature(); humi = dht.readHumidity(); // Quy đổi dử liệu cảm biến ánh sáng ra dạng 0~100% valueLDR = map(rawLDR, 0, minlightValue, 100, 0); //Hiển thị các giá trị lên Serial Monitor Serial.print("LDR: "); Serial.println(rawLDR); Serial.print("Temp: "); Serial.println(temp); Serial.print("Humi: "); Serial.println(humi); // In giá trị "nhiệt độ" tại vị trí cột 2 dòng 0 lcd.setCursor(2, 0); lcd.print(temp, 1); lcd.write(0xDF); // In kí tự (°) lcd.print("C "); // In giá trị "độ ẩm" tại vị trí cột 12 dòng 0 lcd.setCursor(12, 0); lcd.print(humi, 0); lcd.print("% "); // In giá trị "quang trở" tại vị trí cột 5 dòng 1 lcd.setCursor(5, 1); lcd.print(valueLDR); lcd.print("% - "); //So sánh giá trị cảm biến ánh sáng để hiện thông báo Ngày / if (valueLDR >= 30) lcd.print("DAY "); else lcd.print("NIGHT "); // So sánh giá trị độ ẩm với giá trị định mức bật cảnh báo. if (humi > 85) { warning1 = true; // Bật cảnh báo Serial.println("Độ ẩm cao vượt mức quy định (85)"); lcd.setCursor(15, 0); // Cột 15 dòng 0 lcd.print("!"); } else if (humi < 40) { warning1 = true; // Bật cảnh báo Serial.println("Độ ẩm thấp dưới mức quy định (40)"); lcd.setCursor(15, 0); // Cột 15 dòng 0 lcd.print("!"); } else { warning1 = false; // Tắt cảnh báo lcd.setCursor(15, 0); // Cột 15 dòng 0 lcd.print(" "); } // So sánh giá trị nhiệt độ với giá trị định mức bật cảnh báo. if (temp > 30) { warning2 = true; // Bật cảnh báo Serial.println("Cảnh báo!: Nhiệt độ cao quá mức quy định (30)"); lcd.setCursor(8, 0); // Cột 8 dòng 0 lcd.print("!"); } else if (temp < 25) { warning2 = true; // Bật cảnh báo Serial.println("Cảnh báo!: Nhiệt độ thấp dưới mức quy định (25)"); lcd.setCursor(8, 0); // Cột 8 dòng 0 lcd.print("!"); } else { warning2 = false; // Tắt cảnh báo lcd.setCursor(8, 0); // Cột 8 dòng 0 lcd.print(" "); } // Bật cảnh báo nếu có giá trị vượt mức quy định. if (warning2||warning1) { stateBuzz = !stateBuzz; digitalWrite(BUZZ_PIN, stateBuzz); } // Chờ 0.5s mới đo lại. delay(500); }
Giải thích code
Quá trình vận hành của chương trình như sau: _ Trước khi bắt đầu, chương trình sẽ mở cổng giao tiếp Serial, khởi động LCD và cảm biến DHT11. _ Xong các bước chuẩn bị trên, chương trình sẽ thực hiện tuần tự như sau, và cứ thế lặp lại:
- Lấy giá trị Nhiệt độ và độ ẩm từ cảm biến DHT11.
- Cho hiển thị 2 giá trị mới nhất này lên màn hình LCD.
- Lấy giá trị (%) cường độ sáng từ cảm biến Quang trở.
- Cho hiển thị giá trị mới nhất này lên màn hình LCD.
- Đồng thời cũng cho biết luôn đang là "DAY" hay "NIGHT".
- Dùng giá trị Nhiệt độ và Độ ẩm vừa rồi, để ra xử lý có bật còi hay không cũng như có gửi thông báo lên Serial hay ko.
- Nếu còi được phép thì bật còi, để tạo âm thanh cảnh báo tick...tick
Sơ đồ kết nối
MakerEDU Shield | Thiết bị |
---|---|
Port D9 | [MKE-S14] - Cảm biến DHT11 |
Port A1 | [MKE-S02] - Cảm biến Quang trở |
Port D10 | [MKE-M03] - Mạch còi Buzzer |
Port I2C | [MKE-M07] - LCD 16x02 |
Nạp code
- Kết nối Module DHT11 đến Port D9 của MakerEdu Shield.
- Kết nối Cảm biến Quang trở đến Port A1 của MakerEdu Shield.
- Kết nối Module Buzzer đến Port D10 của MakerEdu Shield.
- Kết nối Module LCD 16x02 đến Port I2C của MakerEdu Shield.
- Dùng cáp USB-C kết nối giữa bo Vietduino Uno và máy tính.
- Vào mục Tools... thiết lập các cấu hình cho đúng với bo Vietduino Uno đang dùng.
- Nhấn vào "nút →" hoặc phím tắt [Ctrl+U] để nạp code cho bo mạch.
Kết quả
- Sau khi đã nạp code thành công.
- Bạn hãy thử đặt ngón tay lên cảm biến DHT11 và xem kết quả phản hồi như thế nào.
- Tương tự với cảm biến Quang trở bạn hãy thử lấy tay che cảm biến lại.
Tip: Phía sau Module màn hình LCD, có một biến trở (màu xanh dương) để chỉnh "độ tương phản" hiển thị trên màn hình. |
... thêm ảnh hay hoặc video