#include <Arduino.h>
#include <DHT.h>
#include <HX711.h>
#define DHT_PIN 2
#define TRIG_PIN 3
#define ECHO_PIN 4
#define LED_FILL_LOW 7
#define LED_FILL_MEDIUM 8
#define LED_FILL_HIGH 9
#define LED_TEMP_LOW 10
#define LED_TEMP_NORMAL 11
#define LED_TEMP_HIGH 12
#define LED_HUM_LOW 13
#define LED_HUM_NORMAL 14
#define LED_HUM_HIGH 15
#define LED_WEIGHT 16
DHT dht(DHT_PIN, DHT22); // Specify DHT type (DHT22)
HX711 scale; // Create HX711 object
void setup() {
Serial.begin(9600); // Initialize Serial for debugging
// Initialize DHT22
dht.begin();
// Initialize HX711
scale.begin(5, 6); // Set data pin and clock pin
scale.set_scale();
scale.tare();
// Initialize HC-SR04 pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Initialize LED pins
for (int pin = LED_FILL_LOW; pin <= LED_WEIGHT; pin++) {
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW); // Turn off all LEDs initially
}
}
float readDistance() {
// Trigger HC-SR04
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Measure echo duration
long duration = pulseIn(ECHO_PIN, HIGH);
// Calculate distance in cm
float distance = (duration * 0.0343) / 2;
return distance;
}
void setFillLevelLED(float distance) {
const float LOW_THRESHOLD = 120; // Distance in cm for low fill
const float MEDIUM_THRESHOLD = 100; // Distance in cm for medium fill
const float HIGH_THRESHOLD = 80; // Distance in cm for high fill
// Set LED states based on distance
if (distance <= HIGH_THRESHOLD) {
digitalWrite(LED_FILL_HIGH, HIGH);
digitalWrite(LED_FILL_MEDIUM, LOW);
digitalWrite(LED_FILL_LOW, LOW);
} else if (distance <= MEDIUM_THRESHOLD) {
digitalWrite(LED_FILL_HIGH, LOW);
digitalWrite(LED_FILL_MEDIUM, HIGH);
digitalWrite(LED_FILL_LOW, LOW);
} else if (distance <= LOW_THRESHOLD) {
digitalWrite(LED_FILL_HIGH, LOW);
digitalWrite(LED_FILL_MEDIUM, LOW);
digitalWrite(LED_FILL_LOW, HIGH);
} else {
digitalWrite(LED_FILL_HIGH, LOW);
digitalWrite(LED_FILL_MEDIUM, LOW);
digitalWrite(LED_FILL_LOW, LOW);
}
}
void setTemperatureLED(float temperature) {
digitalWrite(LED_TEMP_LOW, temperature < 15);
digitalWrite(LED_TEMP_NORMAL, temperature >= 15 && temperature <= 25);
digitalWrite(LED_TEMP_HIGH, temperature > 25);
}
void setHumidityLED(float humidity) {
digitalWrite(LED_HUM_LOW, humidity < 30);
digitalWrite(LED_HUM_NORMAL, humidity >= 30 && humidity <= 60);
digitalWrite(LED_HUM_HIGH, humidity > 60);
}
void loop() {
// Read temperature and humidity
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
} else {
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" °C, Humidity: ");
Serial.print(h);
Serial.println(" %");
setTemperatureLED(t);
setHumidityLED(h);
}
// Read weight from HX711
float weight = scale.get_units(10);
Serial.print("Weight: ");
Serial.print(weight);
Serial.println(" g");
digitalWrite(LED_WEIGHT, weight > 1000); // Example threshold for weight
// Read distance from HC-SR04
float distance = readDistance();
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
setFillLevelLED(distance); // Update LEDs based on distance
delay(2000); // Wait for 2 seconds before next reading
}