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

From MakerLab Wiki
Revision as of 08:43, 15 July 2023 by Hnaoab (talk | contribs)
Jump to navigation Jump to search

Danh sách thiết bị

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

  1. 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"
  2. 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:

  1. Lấy giá trị Nhiệt độ và độ ẩm từ cảm biến DHT11.
  2. Cho hiển thị 2 giá trị mới nhất này lên màn hình LCD.
  3. Lấy giá trị (%) cường độ sáng từ cảm biến Quang trở.
  4. Cho hiển thị giá trị mới nhất này lên màn hình LCD.
  5. Đồng thời cũng cho biết luôn đang là "DAY" hay "NIGHT".
  6. 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.
  7. 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

  1. Kết nối Module DHT11 đến Port D9 của MakerEdu Shield.
  2. Kết nối Cảm biến Quang trở đến Port A1 của MakerEdu Shield.
  3. Kết nối Module Buzzer đến Port D10 của MakerEdu Shield.
  4. Kết nối Module LCD 16x02 đến Port I2C của MakerEdu Shield.
  5. Dùng cáp USB-C kết nối giữa bo Vietduino Uno và máy tính.
  6. 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.
  7. Nhấn vào "nút →" hoặc phím tắt [Ctrl+U] để nạp code cho bo mạch.

Kết quả

  1. Sau khi đã nạp code thành công.
  2. 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.
  3. 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.
Icon-Info-White.png 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