Menu
CoddyTech

Surveillance de la plante : Alarme de sécheresse

Fait partie de la section Projets du Journey Arduino de Coddy. Leçon 19 sur 24.

Lorsque la terre reste sèche, le moniteur appelle à l’aide avec le buzzer sur la broche 8. Pas immédiatement : une mesure peut baisser pendant un instant, et une alarme qui se déclenche pour rien finit vite par être ignorée. La règle est que la terre doit rester sèche pendant plus de 5 secondes (une vraie plante attendrait des heures).

Pour savoir depuis combien de temps la terre est sèche, note le moment où elle est devenue sèche. Il faut pour cela une information mémorisée supplémentaire : savoir si elle était sèche lors de la dernière mesure.

if (moisture < 30) {
  if (wasDry == false) {
    wasDry = true;
    dryStart = millis();   // Il vient de devenir sec
  }
  if (millis() - dryStart > 5000) {
    tone(buzzerPin, 880, 200);
  }
} else {
  wasDry = false;
}

Le else est important : lorsque la terre est arrosée, wasDry repasse à false, afin que la période sèche suivante soit chronométrée à partir de son propre début.

loop() effectue une lecture par seconde. Le bip de 200 ms retentit donc une fois par seconde tant que la terre reste sèche.

challenge icon

Défi

Moyen

Ajoute l’alarme de sécheresse :

  • mémorise si le sol était sec (bool wasDry) et quand il est devenu sec (unsigned long dryStart)
  • une fois qu’il est resté sec pendant plus de 5000 ms, joue tone(buzzerPin, 880, 200) après chaque lecture
  • lorsqu’il est à 30 % ou plus, remets wasDry à false

Appuie sur Run, baisse le bouton et attends, puis appuie sur Check.

Essayez vous-même

// Le bouton rotatif remplace un capteur d’humidité du sol
const int sensorPin = A0;
// Le voyant d’état : une LED RGB
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;

// L’humidité en pourcentage : 0 signifie complètement sec, 100 signifie détrempé.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Rouge quand le sol est sec, vert quand l’humidité est adéquate, bleu quand le sol est humide.
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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Projets

Entraînez-vous par vous-même : Playground Arduino