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
Jump to navigation
Jump to search
Mô tả dự án
_ Trong bài này, bạn sẽ làm một mô hình mô phỏng hệ thống giám sát môi trường trong nông nghiệp
_ Hệ thống sử dụng cảm biến DHT11 để lấy thông số Nhiệt độ và Độ ẩm. Và ra quyết định phù hợp.
_ Bạn lưu ý, trong mô hình này mình sẽ xem thông số Độ ẩm không khí của cảm biến như là Độ ẩm đất.
_ Dựa theo các thông tin mình tìm hiểu được:
- Độ ẩm thích hợp cho các loại cây trồng sẽ dao động trong khoảng từ 60% - 70%.
- Giới hạn độ ẩm cao nhất khi phụ thuộc vào các thành phần cơ giới và kết cấu của đất sẽ là khoảng từ 70 - 85%.
- Nếu nhiệt độ trên nhiệt kế cho biết mức nhiệt dưới 25 độ C thì bạn có thể tiến hành tưới cây một cách an toàn.
- Tuy nhiên nếu nhiệt kế cho kết quả trên 30 độ C bạn nên cân nhắc việc tưới cây trời nắng bởi có thể nó sẽ gây ảnh hưởng bất lợi đến cho cây trồng.
_ Mình sẽ lập trình cho mô hình vận hành như sau:
- Nếu độ ẩm thấp hơn 60% → còi báo.
- Và nếu nhiệt độ dưới 30 độ C → Thông báo tưới cây.
- Ngược lại nhiệt độ trên 30 độ C → Thông báo tưới cây cẩn thận.
- Nếu độ ẩm cao hơn 85% → còi báo → Thông báo xử lý đất.
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