#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include "HX711.h"
// Define pins
#define SDA_PIN A4
#define SCL_PIN A5
#define DT_PIN 2
#define SCK_PIN 3
#define SERVO_PIN 9
#define ULTRASONIC_TRIG_PIN 7
#define ULTRASONIC_ECHO_PIN 6
HX711 scale;
bool state, pump;
// Initialize components
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servoMotor;
void setup() {
scale.begin(A1, A0);
Wire.begin();
lcd.init();
lcd.backlight();
pinMode(DT_PIN, INPUT);
pinMode(SCK_PIN, INPUT);
servoMotor.attach(SERVO_PIN);
pinMode(ULTRASONIC_TRIG_PIN, OUTPUT);
pinMode(ULTRASONIC_ECHO_PIN, INPUT);
}
void loop() {
lcd.clear();
int distance = getDistance();
lcd.setCursor(0, 0);
lcd.print("Water Level: %");
lcd.setCursor(12, 0);
lcd.print(distance);
lcd.setCursor(5,1);
lcd.print(pump ? "ON " : "OFF");
lcd.setCursor(10,1);
lcd.print(digitalRead(11) ? "AUTO " : "MANUAL");
lcd.setCursor(0,2);
lcd.print("Weight:");
lcd.setCursor(8,2);
lcd.print(scale.get_units()/420);
lcd.setCursor(14,2);
lcd.print("KG");
if (distance < 10) { // Assuming a low water level threshold as 10 cm
servoMotor.write(90); // Assuming 90 degrees is the position to start pouring water
delay(500);
}else {
servoMotor.write(0); // Stop pouring
delay(500);
}
delay(100);
}
int getDistance() {
digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASONIC_TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
long duration = pulseIn(ULTRASONIC_ECHO_PIN, HIGH);
int distance = duration * 0.034 / 2; // Convert the time into distance (cm)
return distance;
}