ניטור צמחים: דיווח
חלק מהיחידה פרויקטים במסלול ה-Arduino של Coddy. שיעור 20 מתוך 24.
השלב האחרון כותב דוח פעם בשנייה: הלחות ומילת מצב — DRY, OK או WET. הוא מוצג על ה-LCD לכל מי שנמצא ליד הצמח, ועל צג ה-Serial עבור מחשב.
ה-LCD מחובר באופן המקובל: LiquidCrystal lcd(12, 11, 5, 4, 3, 2); ו-lcd.begin(16, 2) בתוך setup(). בשורה העליונה מופיע Moisture: 42% ובשורה התחתונה המילה.
בצג ה-Serial המילה מופיעה בסוף אותה שורה כמו הלחות, לכן יש להדפיס את הלחות עם Serial.print(), ולא עם println(). לאחר מכן בוחרים את המילה לפי שלושת הטווחים של נורית החיווי ומדפיסים אותה בשניהם:
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%: הדפיסו כמה רווחים אחרי %.
אתגר
בינוניהצג את הדיווח פעם בשנייה:
- הגדר את ה-LCD (פינים 12, 11, 5, 4, 3, 2) בתוך
setup() - השורה העליונה:
Moisture: 42%, עם רווחים אחריה - השורה התחתונה:
DRYמתחת ל-30%,OKמ-30% עד 70%,WETמעל 70%, עם ריפוד של רווחים - צג Serial: שורה אחת כמו
Moisture: 42% OK
השאר את נורית החיווי ואת האזעקה. לחץ על Run, ואז על Check.
נסו בעצמכם
// הכפתור משמש במקום חיישן לחות קרקע
const int sensorPin = A0;
// נורית החיווי: נורית LED מסוג RGB
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 שניות.
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);
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פרויקטים
תרגלו בעצמכם: Arduino אונליין