Menu
CoddyTech

植物モニター:レポート

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つほど出力してください。

challenge icon

チャレンジ

中級

レポートを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);
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

プロジェクトのすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド