Menu
CoddyTech

植物监测器:报告

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

最后一步每秒输出一次报告:湿度和一个状态词,DRY、OK 或 WET。报告会显示在 LCD 上,方便植物旁边的人查看,也会发送到电脑的 Serial 监视器。

LCD 按常见方式接线:LiquidCrystal lcd(12, 11, 5, 4, 3, 2);,并在 setup() 中调用 lcd.begin(16, 2)。顶行显示 Moisture: 42%,底行显示状态词。

在 Serial 监视器中,状态词要和湿度显示在同一行,因此要用 Serial.print() 输出湿度,而不是 println()。然后根据状态灯的三个范围选择状态词,并将它同时输出到两处:

if (moisture < 30) {
  lcd.print("DRY");
  Serial.println("DRY");
} else if (moisture <= 70) {
  lcd.print("OK ");
  Serial.println("OK");
} else {
  lcd.print("WET");
  Serial.println("WET");
}

注意屏幕上残留的旧字符。OK 比 DRY 短,所以要输出带空格的 "OK ",否则屏幕上会显示 OKY。100% 变成 5% 时也是如此:在 % 后面输出几个空格。

challenge icon

挑战

中等

每秒输出一次报告:

  • 在 setup() 中设置 LCD(引脚 12、11、5、4、3、2)
  • 顶行:Moisture: 42%,后面加上空格
  • 底行:低于 30% 时显示 DRY,从 30% 到 70% 时显示 OK,高于 70% 时显示 WET,并用空格补齐
  • Serial 监视器:输出类似 Moisture: 42% OK 的一行

保留状态灯和警报。按“运行”,然后按“检查”。

亲手试试

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

bool wasDry = false;         // 上次读取时土壤是否干燥?
unsigned long dryStart = 0;  // 土壤开始干燥的时间

// 湿度以百分比表示: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);
  }
}

// 土壤持续干燥超过 5 秒后,每秒响一声。
void checkAlarm(int moisture) {
  if (moisture < 30) {
    if (wasDry == false) {
      wasDry = true;
      dryStart = millis();
    }
    if (millis() - dryStart > 5000) {
      tone(buzzerPin, 880, 200);
    }
  } else {
    wasDry = false;
  }
}

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);
  checkAlarm(moisture);
  delay(1000);
}
quiz icon自我测试

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

项目中的所有课

自己练习: Arduino 在线编辑器