Menu
CoddyTech

Monitor de Plantas: Relatório

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

A última etapa escreve um relatório uma vez por segundo: a umidade e uma palavra de status, DRY, OK ou WET. Ele vai para o LCD, para quem estiver perto da planta, e para o monitor Serial, para um computador.

O LCD é conectado da maneira usual: LiquidCrystal lcd(12, 11, 5, 4, 3, 2); e lcd.begin(16, 2) em setup(). A linha de cima mostra Moisture: 42% e a linha de baixo mostra a palavra.

No monitor Serial, a palavra termina na mesma linha que a umidade, então imprima a umidade com Serial.print(), não println(). Em seguida, escolha a palavra usando as três faixas da luz de status e imprima-a em ambos:

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");
}

Fique atento aos caracteres antigos. OK é mais curto que DRY, então imprima "OK " com um espaço, ou a tela mostrará OKY. O mesmo acontece quando 100% se torna 5%: imprima alguns espaços depois do %.

challenge icon

Desafio

Médio

Exiba o relatório uma vez por segundo:

  • configure o LCD (pinos 12, 11, 5, 4, 3, 2) em setup()
  • linha superior: Moisture: 42%, com espaços depois
  • linha inferior: DRY abaixo de 30%, OK de 30% a 70%, WET acima de 70%, preenchida com espaços
  • monitor Serial: uma linha como Moisture: 42% OK

Mantenha a luz de status e o alarme. Pressione Run e, em seguida, Check.

Experimente você mesmo

// O botão giratório substitui 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;
// O alarme
const int buzzerPin = 8;

bool wasDry = false;         // o solo estava seco na última leitura?
unsigned long dryStart = 0;  // quando o solo ficou seco

// 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 está adequado, 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);
  }
}

// Emite um bipe por segundo quando o solo está seco há mais de 5 segundos.
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 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