Menu
CoddyTech

Thiết bị theo dõi cây: Cảnh báo khô

Thuộc phần Dự án trong hành trình Arduino của Coddy. Bài học 19 trên 24.

Khi đất vẫn khô, bộ theo dõi sẽ phát tín hiệu cầu cứu bằng còi buzzer ở chân 8. Không phát ngay lập tức: chỉ số có thể giảm trong chốc lát, và chuông báo động kêu oan sẽ sớm bị phớt lờ. Quy tắc là đất phải khô hơn 5 giây (với cây thật thì phải đợi hàng giờ).

Để biết đất đã khô bao lâu, hãy ghi lại thời điểm đất bắt đầu khô. Cần thêm một phần bộ nhớ: đất có khô ở lần đọc trước hay không.

if (moisture < 30) {
  if (wasDry == false) {
    wasDry = true;
    dryStart = millis();   // Nó vừa chuyển sang trạng thái khô
  }
  if (millis() - dryStart > 5000) {
    tone(buzzerPin, 880, 200);
  }
} else {
  wasDry = false;
}

else rất quan trọng: khi đất được tưới nước, wasDry trở lại false, nên lần đất khô tiếp theo sẽ được tính giờ từ lúc bắt đầu khô.

loop() đọc một lần mỗi giây, vì vậy tiếng bíp kéo dài 200 ms sẽ phát mỗi giây khi đất vẫn khô.

challenge icon

Thử thách

Trung bình

Thêm cảnh báo khi đất khô:

  • ghi nhớ đất có khô hay không (bool wasDry) và thời điểm đất bắt đầu khô (unsigned long dryStart)
  • khi đất đã khô hơn 5000 ms, phát tone(buzzerPin, 880, 200) sau mỗi lần đọc
  • khi độ ẩm đạt từ 30% trở lên, đặt lại wasDry thành false

Nhấn Chạy, vặn núm xuống rồi chờ, sau đó nhấn Kiểm tra.

Tự làm thử

// Núm xoay mô phỏng cảm biến độ ẩm đất
const int sensorPin = A0;
// Đèn báo trạng thái: một đèn LED RGB
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;

// Độ ẩm tính theo phần trăm: 0 là khô hoàn toàn, 100 là ướt sũng.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Đèn đỏ khi đất khô, xanh lá khi độ ẩm phù hợp, xanh dương khi đất ướt.
void showStatus(int moisture) {
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(bluePin, LOW);
  if (moisture < 30) {
    digitalWrite(redPin, HIGH);
  } else if (moisture <= 70) {
    digitalWrite(greenPin, HIGH);
  } else {
    digitalWrite(bluePin, HIGH);
  }
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int moisture = readMoisture();
  Serial.print("Moisture: ");
  Serial.print(moisture);
  Serial.println("%");
  showStatus(moisture);
  delay(1000);
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Dự án

Tự luyện tập: Playground Arduino