#include <DHT.h>
#include <HX711.h>
#include <LiquidCrystal_I2C.h>
#define DHT_PIN 15 // Pin du DHT22 pour la température et l'humidité
#define DHT_TYPE DHT22
#define TRIG_PIN 23 // Pin du capteur ultrason
#define ECHO_PIN 22 // Pin du capteur ultrason
#define ALARM_PIN 4 // Pin pour l'alarme (buzzer ou LED)
#define ALERT_DISTANCE 5 // Distance d'alerte (5 cm)
#define POT_PIN 34 // Pin du potentiomètre
#define I2C_SDA 21
#define I2C_SCL 19
// Définition des broches du HX711
#define LOADCELL_DOUT_PIN 5
#define LOADCELL_SCK_PIN 18
DHT dht(DHT_PIN, DHT_TYPE); // Initialisation du capteur DHT22
HX711 scale; // Initialisation de l'amplificateur HX711 pour la cellule de charge
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Wire.begin(I2C_SDA, I2C_SCL); // Initialize I2C with custom pins
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("BeeHive");
delay(2000);
Serial.begin(115200); // Initialisation de la communication série
dht.begin(); // Initialisation du capteur DHT22
pinMode(TRIG_PIN, OUTPUT); // Déclenchement du capteur ultrason
pinMode(ECHO_PIN, INPUT); // Réception du signal
pinMode(ALARM_PIN, OUTPUT); // Alarme (buzzer, LED, etc.)
pinMode(POT_PIN, INPUT); // Pin du potentiomètre
// Initialisation du HX711
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(2280.f); // Calibration (ajustez selon votre capteur)
scale.tare(); // Mettre à zéro le capteur
}
void loop() {
// Lecture de la température et de l'humidité
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Affichage des données
Serial.print("Temp: ");
Serial.print(temperature);
Serial.print(" °C\t");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.print(temperature);
lcd.print(" °C\t");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.print(humidity);
lcd.print(" %");
delay(500);
// Mesure du niveau du miel avec le capteur ultrason
long duration, distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2; // Affichage de la distance mesurée
Serial.print("Honey level distance: ");
Serial.print(distance);
Serial.println(" cm");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("HoneyLevel: ");
lcd.setCursor(0, 1);
lcd.print(distance);
lcd.print("cm");
delay(200);
// Si le niveau du miel est supérieur à 5 cm, déclenche l'alarme
if (distance <= ALERT_DISTANCE) {
tone(ALARM_PIN, 1500);
digitalWrite(ALARM_PIN, HIGH); // Active l'alarme
Serial.println("ALERT: Honey level too high!");
lcd.clear(); // Clear the entire screen
lcd.setCursor(0, 0); // Set cursor to the first row, first column
lcd.print("ALERT!"); // Display alert message
lcd.setCursor(0, 1); // Set cursor to the second row, first column
lcd.print("Honey level high!");
delay(200);
} else {
digitalWrite(ALARM_PIN, LOW); // Désactive l'alarme
}
// Lecture de la valeur du potentiomètre (simuler la température)
int potValue = analogRead(POT_PIN); // Lire la valeur du potentiomètre
float mappedTemp = map(potValue, 0, 4095, 32, 35); // Mapper la valeur entre 32°C et 35°C
// Affichage de la température simulée par le potentiomètre
Serial.print("Mapped Temperature: ");
Serial.print(mappedTemp);
Serial.println(" °C");
// Vérification de la température simulée et déclenchement de l'alarme
if (mappedTemp < 32 || mappedTemp > 34) {
tone(ALARM_PIN, 1500);
digitalWrite(ALARM_PIN, HIGH); // Active l'alarme
Serial.println("ALERT: Check the temperature!(optimal between 32 and 35)");
lcd.clear(); // Clear the entire screen
lcd.setCursor(0, 0); // Set cursor to the first row, first column
lcd.print("ALERT!"); // Display alert message
lcd.setCursor(0, 1); // Set cursor to the second row, first column
lcd.print("Check temperature!");
} else {
digitalWrite(ALARM_PIN, LOW); // Désactive l'alarme
}
// Vérification de l'humidité et déclenchement de l'alarme
if (humidity < 40 || humidity > 60) {
tone(ALARM_PIN, 1500);
digitalWrite(ALARM_PIN, HIGH); // Active l'alarme
Serial.println("ALERT: Check the humidity!(optimal between 50 and 60)");
lcd.clear(); // Clear the entire screen
lcd.setCursor(0, 0); // Set cursor to the first row, first column
lcd.print("ALERT!"); // Display alert message
lcd.setCursor(0, 1); // Set cursor to the second row, first column
lcd.print("Check humidity!");
} else {
digitalWrite(ALARM_PIN, LOW); // Désactive l'alarme
}
// Lecture du poids de la ruche
float weight = scale.get_units(10); // Moyenne des 10 dernières lectures
Serial.print("Weight: ");
Serial.print(weight);
Serial.println(" g");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Weight:");
lcd.print(weight);
lcd.print("g");
// Si le poids est inférieur ou supérieur à un seuil, déclenche l'alarme
if ( weight > 45000) {
tone(ALARM_PIN, 1000); // Alarme sonore
Serial.println("ALERT: Unusual weight detected!");
lcd.clear(); // Clear the entire screen
lcd.setCursor(0, 0); // Set cursor to the first row, first column
lcd.print("ALERT!"); // Display alert message
lcd.setCursor(0, 1); // Set cursor to the second row, first column
lcd.print("Check weight!");
} else {
noTone(ALARM_PIN); // Désactive l'alarme si le poids est normal
}
delay(4000); // Attendre 2 secondes avant de lire à nouveau
}