Menu
CoddyTech

Monitor de Plantas: Alerta de Secura

Parte da seção Projetos do Journey de Arduino da Coddy. Lição 19 de 24.

Quando o solo permanece seco, o monitor pede ajuda com o buzzer no pino 8. Não imediatamente: uma leitura pode cair por um momento, e um alarme que dispara à toa logo é ignorado. A regra é permanecer seco por mais de 5 segundos (uma planta de verdade esperaria horas).

Para saber há quanto tempo o solo está seco, registre o momento em que ele ficou seco. Isso exige mais uma informação na memória: se ele estava seco na última leitura.

if (moisture < 30) {
  if (wasDry == false) {
    wasDry = true;
    dryStart = millis();   // acabou de ficar seco
  }
  if (millis() - dryStart > 5000) {
    tone(buzzerPin, 880, 200);
  }
} else {
  wasDry = false;
}

O else é importante: quando o solo é regado, wasDry volta a false, então o próximo período de seca é cronometrado a partir do próprio início.

loop() faz uma leitura por segundo, então o bipe de 200 ms soa uma vez por segundo enquanto o solo permanecer seco.

challenge icon

Desafio

Médio

Adicione o alarme de solo seco:

  • lembre-se se o solo estava seco (bool wasDry) e quando ficou seco (unsigned long dryStart)
  • depois que ele ficar seco por mais de 5000 ms, toque tone(buzzerPin, 880, 200) após cada leitura
  • quando estiver em 30% ou mais, defina wasDry novamente como false

Pressione Run, gire o botão para baixo e espere; em seguida, Check.

Experimente você mesmo

// O botão giratório simula um sensor de umidade do solo
const int sensorPin = A0;
// A luz indicadora de status: um LED RGB
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;

// A umidade em porcentagem: 0 é completamente seco, 100 é encharcado.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Vermelho quando está seco, verde quando a umidade está adequada, azul quando está úmido.
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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Projetos

Pratique por conta própria: Playground de Arduino