植物监测器:缺水警报
本课属于 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 的蜂鸣声。
挑战
中等添加干燥警报:
- 记住土壤是否干燥(
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);
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
项目中的所有课
自己练习: Arduino 在线编辑器