植物モニター:レポート
CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 20/24。
最後のステップでは、1秒ごとにレポートを出力します。水分量と、DRY、OK、WETのいずれかの状態を表す語です。植物のそばにいる人向けにLCDに表示し、コンピューター向けにシリアルモニターにも出力します。
LCDは通常の方法で配線します。LiquidCrystal lcd(12, 11, 5, 4, 3, 2);と、setup()内のlcd.begin(16, 2)です。上の行にはMoisture: 42%を表示し、下の行には状態を表す語を表示します。
シリアルモニターでは、水分量と同じ行の末尾に状態を表す語が来るので、水分量の出力にはprintln()ではなくSerial.print()を使います。次に、状態ランプの3つの範囲に応じて語を選び、両方に出力します。
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%になることがあります。%の後にスペースを2つほど出力してください。
チャレンジ
中級レポートを1秒に1回表示します:
setup()でLCDを設定します(ピン12、11、5、4、3、2)- 上の行:
Moisture: 42%。後ろにスペースを入れます - 下の行:30%未満は
DRY、30%から70%まではOK、70%を超えるとWET。スペースで埋めます - シリアルモニター:
Moisture: 42% OKのような1行
ステータスライトとアラームはそのままにします。Runを押してから、Checkを押します。
自分で試してみよう
// つまみは土壌水分センサーの代わり
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秒を超えたら、1秒に1回ビープ音を鳴らす。
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);
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド