Menu
CoddyTech

Bitki İzleyici: Rapor

Coddy'nin Arduino Journey'sinin Projeler bölümünün bir parçası. Ders 20 / 24.

Son adım, saniyede bir rapor yazar: nem oranını ve DRY, OK veya WET durum sözcüğünü. Bu rapor, bitkinin yanındaki herkesin görebilmesi için LCD'ye, bilgisayar için de Serial monitöre gönderilir.

LCD her zamanki şekilde bağlanır: LiquidCrystal lcd(12, 11, 5, 4, 3, 2); ve setup() içinde lcd.begin(16, 2). Üst satırda Moisture: 42%, alt satırda ise sözcük gösterilir.

Serial monitörde sözcük, nem oranıyla aynı satırın sonunda yer alır; bu nedenle nem oranını Serial.println() ile değil, Serial.print() ile yazdır. Ardından durum ışığının üç aralığını kullanarak sözcüğü seç ve her ikisine de yazdır:

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

Eski karakterlere dikkat et. OK, DRY'den daha kısa olduğu için arada boşluk bulunan "OK " yazdır; yoksa ekranda OKY görünür. Aynı durum 100% değerinin 5% hâline gelmesi için de geçerlidir: % işaretinden sonra birkaç boşluk yazdır.

challenge icon

Görev

Orta

Raporu saniyede bir yazdır:

  • setup() içinde LCD'yi (12, 11, 5, 4, 3, 2 pinleri) kur
  • üst satır: Moisture: 42%, ardından boşluklarla
  • alt satır: %30'un altında DRY, %30 ile %70 arasında OK, %70'in üzerinde WET; boşluklarla doldurulmuş
  • Seri monitör: Moisture: 42% OK gibi tek satır

Durum ışığını ve alarmı koru. Run'a, ardından Check'e bas.

Kendin dene

// Döner düğme, toprak nem sensörünün yerine geçer
const int sensorPin = A0;
// Durum ışığı: bir RGB LED
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;
// Alarm
const int buzzerPin = 8;

bool wasDry = false;         // son okumada toprak kuru muydu?
unsigned long dryStart = 0;  // ne zaman kuruduğu

// Yüzde cinsinden nem: 0 kupkuru, 100 sırılsıklam demektir.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// Kuruysa kırmızı, nemi uygunsa yeşil, ıslaksa mavi.
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);
  }
}

// Toprak 5 saniyeden uzun süredir kuruysa saniyede bir kez bip sesi çıkar.
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Projeler bölümündeki tüm dersler

Kendi başına pratik yap: Arduino playground