#include <LiquidCrystal_I2C.h> // ייבוא ספרייה לתקשורת עם מסך LCD דרך I2C
// הגדרת פינים
int echoPin = 6; // פין לקבלת האות החוזר מהחיישן האולטרסוני
int trigPin = 7; // פין לשליחת האות מהחיישן האולטרסוני
int buzzer = 4; // פין להפעלת הזמזם
int ledRed = 13; // פין עבור נורית LED אדומה - מצב סכנה
int ledYellow = 12; // פין עבור נורית LED צהובה - מצב כוננות
int ledGreen = 11; // פין עבור נורית LED ירוקה - מצב בטוח
LiquidCrystal_I2C lcd(0x27, 20, 4); // יצירת אובייקט LCD עם כתובת I2C 0x27, גודל 20 תווים ו-4 שורות
void setup() { // פונקציה שרצה פעם אחת בהתחלת התוכנית
// הגדרת פינים
pinMode(ledRed, OUTPUT); // הגדרת פין LED אדום כיציאה
pinMode(ledYellow, OUTPUT); // הגדרת פין LED צהוב כיציאה
pinMode(ledGreen, OUTPUT); // הגדרת פין LED ירוק כיציאה
pinMode(trigPin, OUTPUT); // הגדרת פין השליחה של החיישן כיציאה
pinMode(echoPin, INPUT); // הגדרת פין הקבלה של החיישן ככניסה
pinMode(buzzer, OUTPUT); // הגדרת פין הזמזם כיציאה
Serial.begin(9600); // התחלת תקשורת סריאלית במהירות 9600 baud
lcd.init(); // אתחול מסך LCD
lcd.backlight(); // הדלקת תאורת הרקע של LCD
// בדיקת מערכת - הדלקת כל הנוריות לבדיקה
digitalWrite(ledRed, HIGH); // הדלקת LED אדום
digitalWrite(ledYellow, HIGH); // הדלקת LED צהוב
digitalWrite(ledGreen, HIGH); // הדלקת LED ירוק
tone(buzzer, 300, 500); // הפעלת זמזם בתדר 300Hz למשך 500ms - לבדיקת תפקוד
lcd.setCursor(0, 0); // מיקום הסמן בשורה 0, עמודה 0
lcd.print("Detektor Banjir"); // הצגת כותרת "Detektor Banjir" על המסך
delay(3000); // המתנה של 3 שניות להצגת הכותרת
// איפוס LED ולניקוי LCD
digitalWrite(ledRed, LOW); // כיבוי LED אדום
digitalWrite(ledYellow, LOW); // כיבוי LED צהוב
digitalWrite(ledGreen, LOW); // כיבוי LED ירוק
lcd.clear(); // ניקוי מסך LCD
}
float getDepth() { // פונקציה למדידת עומק המים
digitalWrite(trigPin, LOW); // כיבוי פין השליחה
delayMicroseconds(2); // המתנה של 2 מיקרושניות לייצוב
digitalWrite(trigPin, HIGH); // הדלקת פין השליחה
delayMicroseconds(10); // שליחת אות במשך 10 מיקרושניות
digitalWrite(trigPin, LOW); // כיבוי פין השליחה
return 400 - pulseIn(echoPin, HIGH) * 0.034 / 2; // חישוב עומק: 400cm (גובה מקסימלי) פחות המרחק הנמדד
}
void displayStatus(float depth, String status, int ledPin, int frequency = 0) { // פונקציה להצגת סטטוס
// כיבוי כל הנוריות
digitalWrite(ledRed, LOW); // כיבוי LED אדום
digitalWrite(ledYellow, LOW); // כיבוי LED צהוב
digitalWrite(ledGreen, LOW); // כיבוי LED ירוק
// הדלקת הנורית הרלוונטית
digitalWrite(ledPin, HIGH); // הדלקת הנורית המתאימה למצב הנוכחי
// הצגה על LCD
lcd.clear(); // ניקוי מסך LCD
lcd.setCursor(0, 0); // מיקום הסמן בשורה הראשונה
lcd.print("Kdlmn: " + String(depth) + " cm"); // הצגת עומק המים בסנטימטרים
lcd.setCursor(0, 1); // מיקום הסמן בשורה השנייה
lcd.print("Status: " + status); // הצגת סטטוס הבטיחות
// הפעלת צליל במידת הצורך
if (frequency > 0) { // אם נדרש צליל אזהרה
tone(buzzer, frequency, 500); // הפעלת זמזם בתדר הנתון למשך 500ms
}
delay(1000); // המתנה של שנייה להצגת המידע
lcd.clear(); // ניקוי מסך LCD
delay(100); // המתנה קצרה לפני המדידה הבאה
}
void loop() { // לולאה ראשית הרצה ללא הפסקה
float depth = getDepth(); // קריאה לפונקציה למדידת עומק המים
if (depth > 350) { // אם עומק המים גבוה מ-350cm - מצב סכנה
displayStatus(depth, "Bahaya", ledRed, 1000); // הצגת מצב סכנה עם LED אדום וזמזם חזק
} else if (depth >= 300) { // אם עומק המים בין 300-350cm - מצב כוננות
displayStatus(depth, "Siaga", ledYellow, 100); // הצגת מצב כוננות עם LED צהוב וזמזם חלש
} else { // אם עומק המים מתחת ל-300cm - מצב בטוח
displayStatus(depth, "Aman", ledGreen); // הצגת מצב בטוח עם LED ירוק ובלי זמזם
}
}