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: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 40: | Line 40: | ||
<source lang="C++"> | <source lang="C++"> | ||
// Thêm bộ thư viện LCD | // 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 <LiquidCrystal_I2C.h> | ||
#include <DHT.h> | #include <DHT.h> | ||
Line 65: | Line 65: | ||
DHT dht(9, DHT11); | DHT dht(9, DHT11); | ||
// Các biến lưu giá trị "nhiệt độ" và "độ ẩm" đọc từ cảm biến | // 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; | float temp, humi; | ||
// Tạo biến lưu giá trị của cảm biến ánh sáng LDR | // 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 valueLDR = 0; | ||
int count = 0; | int count = 0; | ||
// | // Tạo các biến trạng thái Logic | ||
bool warning1 = false; | bool warning1 = false; | ||
bool warning2 = false; | bool warning2 = false; | ||
Line 86: | Line 83: | ||
void setup() | void setup() | ||
{ | { | ||
// Mở cổng Serial Baudrate | // Mở cổng Serial Baudrate 115200bps | ||
Serial.begin(115200); | Serial.begin(115200); | ||
Line 101: | Line 98: | ||
lcd.backlight(); | 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.setCursor(0, 0); // Cột | |||
lcd.print("Light SS Calib"); | lcd.print("Light SS Calib"); | ||
lcd.setCursor(0, 1); // Cột | lcd.setCursor(0, 1); // Cột 0 dòng 1 | ||
lcd.print("Cover the sensor"); | lcd.print("Cover the sensor"); | ||
Serial.println("Xin để cảm biến ở chỗ tối nhất!"); | Serial.println("Xin để cảm biến ở chỗ tối nhất!"); | ||
delay(2000); | delay(2000); | ||
for (count = 5; count >= 1; count--) | for (count = 5; count >= 1; count--) | ||
{ | { | ||
Line 129: | Line 121: | ||
lcd.clear(); | lcd.clear(); | ||
// In khung nội dung mẫu lên LCD | |||
lcd.setCursor(0, 0); // Cột | lcd.setCursor(0, 0); // Cột 0 dòng 0 | ||
lcd.print("T:"); | lcd.print("T:"); | ||
lcd.setCursor(10, 0); // Cột | lcd.setCursor(10, 0); // Cột 10 dòng 0 | ||
lcd.print("H:"); | lcd.print("H:"); | ||
lcd.setCursor(0, 1); // Cột 1 | lcd.setCursor(0, 1); // Cột 0 dòng 1 | ||
lcd.print("LDR: "); | lcd.print("LDR: "); | ||
// Khởi động cảm biến DHT11 | |||
dht.begin(); | |||
} | } | ||
Line 142: | Line 137: | ||
void loop() | void loop() | ||
{ | { | ||
// Lấy dữ liệu từ cảm biến DHT11 | // Lấy dữ liệu từ cảm biến DHT11 và cảm biến ánh sáng | ||
rawLDR = analogRead(LDR_PIN); | rawLDR = analogRead(LDR_PIN); | ||
temp = dht.readTemperature(); | temp = dht.readTemperature(); | ||
humi = dht.readHumidity(); | 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); | valueLDR = map(rawLDR, 0, minlightValue, 100, 0); | ||
//Hiển thị các giá trị lên Serial Monitor | |||
Serial.print("LDR: "); | Serial.print("LDR: "); | ||
Serial.println(rawLDR); | Serial.println(rawLDR); | ||
Line 155: | Line 152: | ||
Serial.println(humi); | Serial.println(humi); | ||
// In giá trị "nhiệt độ" tại vị trí cột 2 dòng 0 | |||
// In giá trị "nhiệt độ" tại vị trí cột | |||
lcd.setCursor(2, 0); | lcd.setCursor(2, 0); | ||
lcd.print(temp, 1); | lcd.print(temp, 1); | ||
lcd.write(0xDF); // In kí tự (°) | lcd.write(0xDF); // In kí tự (°) | ||
lcd.print("C "); | lcd.print("C "); | ||
// In giá trị "độ ẩm" tại vị trí cột | // In giá trị "độ ẩm" tại vị trí cột 12 dòng 0 | ||
lcd.setCursor(12, 0); | lcd.setCursor(12, 0); | ||
lcd.print(humi, 0); | lcd.print(humi, 0); | ||
lcd.print("% "); | lcd.print("% "); | ||
// In giá trị "quang trở" tại vị trí cột | // In giá trị "quang trở" tại vị trí cột 5 dòng 1 | ||
lcd.setCursor(5, 1); | lcd.setCursor(5, 1); | ||
lcd.print(valueLDR); | lcd.print(valueLDR); | ||
lcd.print("% - "); | 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) | if (valueLDR >= 30) | ||
lcd.print("DAY "); | lcd.print("DAY "); | ||
Line 175: | Line 171: | ||
lcd.print("NIGHT "); | 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) | if (humi > 85) | ||
{ | { | ||
warning1 = true; // Bật cảnh báo | warning1 = true; // Bật cảnh báo | ||
Serial.println("Độ ẩm cao vượt mức quy định (85)"); | Serial.println("Độ ẩm cao vượt mức quy định (85)"); | ||
lcd.setCursor(15, 0); // Cột | lcd.setCursor(15, 0); // Cột 15 dòng 0 | ||
lcd.print("!"); | lcd.print("!"); | ||
} | } | ||
Line 188: | Line 183: | ||
warning1 = true; // Bật cảnh báo | warning1 = true; // Bật cảnh báo | ||
Serial.println("Độ ẩm thấp dưới mức quy định (40)"); | Serial.println("Độ ẩm thấp dưới mức quy định (40)"); | ||
lcd.setCursor(15, 0); // Cột | lcd.setCursor(15, 0); // Cột 15 dòng 0 | ||
lcd.print("!"); | lcd.print("!"); | ||
} | } | ||
Line 194: | Line 189: | ||
{ | { | ||
warning1 = false; // Tắt cảnh báo | warning1 = false; // Tắt cảnh báo | ||
lcd.setCursor(15, 0); // Cột | lcd.setCursor(15, 0); // Cột 15 dòng 0 | ||
lcd.print(" "); | 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) | if (temp > 30) | ||
{ | { | ||
warning2 = true; // Bật cảnh báo | warning2 = true; // Bật cảnh báo | ||
Serial.println("Cảnh báo!: Nhiệt độ cao quá mức quy định (30)"); | Serial.println("Cảnh báo!: Nhiệt độ cao quá mức quy định (30)"); | ||
lcd.setCursor(8, 0); // Cột | lcd.setCursor(8, 0); // Cột 8 dòng 0 | ||
lcd.print("!"); | lcd.print("!"); | ||
} | } | ||
Line 209: | Line 205: | ||
warning2 = true; // Bật cảnh báo | 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)"); | Serial.println("Cảnh báo!: Nhiệt độ thấp dưới mức quy định (25)"); | ||
lcd.setCursor(8, 0); // Cột | lcd.setCursor(8, 0); // Cột 8 dòng 0 | ||
lcd.print("!"); | lcd.print("!"); | ||
} | } | ||
Line 215: | Line 211: | ||
{ | { | ||
warning2 = false; // Tắt cảnh báo | warning2 = false; // Tắt cảnh báo | ||
lcd.setCursor(8, 0); // Cột | lcd.setCursor(8, 0); // Cột 8 dòng 0 | ||
lcd.print(" "); | lcd.print(" "); | ||
} | } | ||
// | // Bật cảnh báo nếu có giá trị vượt mức quy định. | ||
if (warning2||warning1) | if (warning2||warning1) | ||
{ | { | ||
Line 227: | Line 222: | ||
} | } | ||
// Chờ 0.5s mới đo lại | // Chờ 0.5s mới đo lại. | ||
delay(500); | delay(500); | ||
} | } |
Revision as of 08:43, 15 July 2023
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
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
Tạo code
- Mở phần mềm IDE Arduino và thêm các bộ thư viện sau vào IDE (nếu chưa có):
- "LiquidCrystal_I2C"
- "Adafruit_Sensor.h"
- "DHT.h"
- Sau đó tạo một Sketch mới và copy đoạn code sau vào file dự án.
// 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