Untitled
unknown
plain_text
a year ago
3.5 kB
4
Indexable
#include <Wire.h> // Standard I2C communication library
#include <jm_LiquidCrystal_I2C.h> // jm_LiquidCrystal_I2C library for I2C LCD communication
// Initialize the LCD
jm_LiquidCrystal_I2C lcd; // Declare the LCD object
// Define ultrasonic sensor pins
#define TRIG_PIN 8
#define ECHO_PIN 9
// Define relay module pin
#define RELAY_PIN 7
// Define push button pins
#define BUTTON_ON 10
#define BUTTON_OFF 11
// Variables for ultrasonic sensor
long duration;
float distance;
// Water level thresholds (in cm)
const float LOW_WATER_THRESHOLD = 10.0; // Adjust as needed
const float HIGH_WATER_THRESHOLD = 5.0; // Adjust as needed
// Relay state
bool relayState = false;
void setup() {
// Initialize serial communication for debugging
Serial.begin(9600);
// Initialize LCD
lcd.begin(0x27, 20, 4); // Initialize the LCD with address 0x27, 16 columns, and 2 rows
lcd.backlight(); // Enable the backlight
lcd.setCursor(0, 0);
lcd.print("Water Level Sys");
delay(2000);
lcd.clear();
// Set pin modes
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUTTON_ON, INPUT_PULLUP);
pinMode(BUTTON_OFF, INPUT_PULLUP);
// Turn relay off initially
digitalWrite(RELAY_PIN, LOW);
// Display system ready message
lcd.setCursor(0, 0);
lcd.print("System Ready");
delay(2000);
lcd.clear();
}
void loop() {
// Measure water level distance
distance = measureDistance();
// Display water level on the LCD
lcd.setCursor(0, 0);
lcd.print("Water Level: ");
if (distance == 999.0) {
lcd.setCursor(0, 1);
lcd.print("Error "); // Display error if no valid reading
} else {
lcd.setCursor(0, 1);
lcd.print(distance);
lcd.print(" cm "); // Clear trailing characters
}
// Manual override using buttons (with debouncing)
if (digitalRead(BUTTON_ON) == LOW) {
delay(50); // Debounce delay
if (digitalRead(BUTTON_ON) == LOW) {
relayState = true;
}
}
if (digitalRead(BUTTON_OFF) == LOW) {
delay(50); // Debounce delay
if (digitalRead(BUTTON_OFF) == LOW) {
relayState = false;
}
}
// Automatic control based on water level
if (distance != 999.0) { // Avoid erroneous relay control
if (distance > LOW_WATER_THRESHOLD) {
relayState = true;
} else if (distance < HIGH_WATER_THRESHOLD) {
relayState = false;
}
}
// Update relay state
digitalWrite(RELAY_PIN, relayState ? HIGH : LOW);
// Print data to serial monitor
Serial.print("Distance: ");
if (distance == 999.0) {
Serial.println("Error: No valid reading");
} else {
Serial.print(distance);
Serial.println(" cm");
}
delay(500); // Short delay for stability
}
// Function to measure distance using the ultrasonic sensor
float measureDistance() {
// Send a 10us pulse to the trigger pin
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Measure the duration of the echo pulse
duration = pulseIn(ECHO_PIN, HIGH, 30000); // Timeout after 30ms
// If no echo is detected, return a large invalid value
if (duration == 0) {
return 999.0; // Error value
}
// Calculate distance in cm
float distance = (duration * 0.034) / 2.0;
return distance;
}
Editor is loading...
Leave a Comment