#define trigPin 12
#define echoPin 11
const int segmentPins[] = {8, 9, 4, 5, 6, 2, 3}; // Pins for segments of 7-segment display
//const int commonCathodePin1 = 10; // Pin 10 of 7-segment display connected to GND through 220 ohm resistor
//const int commonCathodePin2 = 7; // Pin 7 of 7-segment display connected to GND through 220 ohm resistor
int buzzerPin = 10;
char segments[10] = { // Lookup table for displaying digits on 7-segment display
0b0111111, // 0
0b0000110, // 1
0b1011011, // 2
0b1001111, // 3
0b1100110, // 4
0b1101101, // 5
0b1111101, // 6
0b0000111, // 7
0b1111111, // 8
0b1101111 // 9
};
long duration; // variable to store the pulse duration
int distanceCm; // variable to store the distance in centimeters
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT); // Set trig pin as output
pinMode(echoPin, INPUT); // Set echo pin as input
pinMode(buzzerPin, OUTPUT);
for (int pin : segmentPins) {
pinMode(pin, OUTPUT);
}
//pinMode(commonCathodePin1, OUTPUT);
//pinMode(commonCathodePin2, OUTPUT);
//digitalWrite(commonCathodePin1, LOW); // Turn off display (common cathode)
//digitalWrite(commonCathodePin2, LOW); // Turn off display (common cathode)
}
void loop() {
// Trigger the HC-SR04 sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Read the echo pulse duration
duration = pulseIn(echoPin, HIGH);
// Calculate distance in centimeters
distanceCm = duration * 0.034 / 2;
// Invert the logic for water level display (higher distance = lower water level)
int waterLevel = map(distanceCm, 50, 170, 9, 0); // Adjust max distance based on your setup
//map(value, lower bound(HC-SR04 range), upper bound(HC-SR04 range), lowerbound(output digit), upper bound((output digit)) )
char dist_str[8];
dtostrf(waterLevel, 6, 2, dist_str); // int to string convertion
//Serial.println(dist_str);
// Print the water level and distance for debugging purposes
//Serial.print("Water Level (Inverted): ");
//Serial.print(waterLevel);
//Serial.print(", Distance (cm): ");
//Serial.println(distanceCm);
displayDigit(waterLevel);
//soundAlarm(waterLevel);
}
void displayDigit(int number) {
if (number < 0 || number > 9) {
// Handle invalid digit (e.g., turn off/turn on all segments)
for (int pin : segmentPins) {
digitalWrite(pin, HIGH); // Assuming common cathode, turn on all segments here HIGH = OFF
}
return;
}
//digitalWrite(commonCathodePin1, HIGH); // Turn on display
//digitalWrite(commonCathodePin2, HIGH); // Turn on display
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], !(segments[number] & (1 << i)));
}
//digitalWrite(commonCathodePin1, LOW); // Turn off display briefly
//digitalWrite(commonCathodePin2, LOW); // Turn off display briefly
}
void soundAlarm(int number) {
if (number >= 6) {
// Police siren effect
for (int i = 0; i < 3; i++) {
tone(buzzerPin, 660, 250); // E5
delay(250);
tone(buzzerPin, 440, 250); // A4
delay(250);
}
} else if (number >= 4) {
// General siren effect
for (int i = 440; i <= 880; i += 10) {
tone(buzzerPin, i, 30);
delay(30);
}
for (int i = 880; i >= 440; i -= 10) {
tone(buzzerPin, i, 30);
delay(30);
}
}
}