Menu
CoddyTech

植物监测器:缺水警报

本课属于 Coddy Arduino 学习旅程的“项目”单元。第 19 课,共 24 课。

土壤持续干燥时,监测器会通过连接在引脚 8 上的蜂鸣器发出求救信号。但不会立即触发:读数可能会短暂下降,而无故响起的警报很快就会被忽略。规则是干燥时间超过 5 秒(真正的植物需要等上几个小时)。

要知道土壤干燥了多久,需要记下它变得干燥的时刻。这需要多记一项信息:上一次读取时土壤是否干燥。

if (moisture < 30) {
  if (wasDry == false) {
    wasDry = true;
    dryStart = millis();   // 刚刚变干了
  }
  if (millis() - dryStart > 5000) {
    tone(buzzerPin, 880, 200);
  }
} else {
  wasDry = false;
}

else 很重要:土壤浇过水后,wasDry 会恢复为 false,这样下一次干燥时段就会从自身开始时计时。

loop() 每秒读取一次,因此只要土壤保持干燥,每秒就会响起一次 200 ms 的蜂鸣声。

challenge icon

挑战

中等

添加干燥警报:

  • 记住土壤是否干燥(bool wasDry),以及土壤变干的时间(unsigned long dryStart)
  • 土壤干燥超过 5000 ms 后,每次读取后播放 tone(buzzerPin, 880, 200)
  • 当湿度达到 30% 或更高时,将 wasDry 重新设为 false

按“运行”,把旋钮调低并等待,然后按“检查”。

亲手试试

// 用旋钮代替土壤湿度传感器
const int sensorPin = A0;
// 状态指示灯:一个 RGB LED
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;

// 湿度用百分比表示:0 表示完全干燥,100 表示非常潮湿。
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// 干燥时亮红灯,湿度适中时亮绿灯,潮湿时亮蓝灯。
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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

项目中的所有课

自己练习: Arduino 在线编辑器