#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
// ===========================================================================
// Définitions des broches et des capteurs
// ===========================================================================
// DS18B20
#define ONE_WIRE_BUS 4 // GPIO4 pour le capteur de température DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// DHT22
#define DHTPIN 16 // GPIO16 pour le capteur DHT22
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
// Capteur de pH (Analogique)
const int PH_PIN = 34; // GPIO34 (ADC1_CH6) pour le capteur de pH
// Calibration du pH (à ajuster)
const float VREF_PH = 3.3; // Tension de référence ADC de l'ESP32
const float PH_SLOPE = -5.7; // Exemple de pente, à déterminer par calibration
const float PH_INTERCEPT = 21.34; // Exemple d'interception, à déterminer par calibration
// Capteur EC (Analogique)
const int EC_PIN = 35; // GPIO35 (ADC1_CH7) pour le capteur EC
// Calibration EC (à ajuster)
const float VREF_EC = 3.3; // Tension de référence ADC de l'ESP32
const float EC_K_VALUE = 1.0; // Facteur de conversion, à déterminer par calibration
const float EC_OFFSET = 0.0; // Offset, à déterminer par calibration
// Capteur DO (Analogique)
const int DO_PIN = 32; // GPIO32 (ADC1_CH4) pour le capteur DO
// Calibration DO (à ajuster)
const float VREF_DO = 3.3; // Tension de référence ADC de l'ESP32
const float DO_K_VALUE = 1.0; // Facteur de conversion, à déterminer par calibration
const float DO_OFFSET = 0.0; // Offset, à déterminer par calibration
// LCD 20x4 I2C
// Adresse I2C de l'écran LCD (0x27 ou 0x3F sont les plus courants)
LiquidCrystal_I2C lcd(0x27, 20, 4);
// ===========================================================================
// Variables pour les lectures des capteurs
// ===========================================================================
float tempDS18B20 = 0.0;
float humidityDHT = 0.0;
float tempDHT = 0.0;
float pHValue = 0.0;
float ecValue = 0.0;
float doValue = 0.0;
// ===========================================================================
// Fonctions de lecture des capteurs
// ===========================================================================
void readDS18B20() {
sensors.requestTemperatures();
tempDS18B20 = sensors.getTempCByIndex(0);
if (tempDS18B20 == DEVICE_DISCONNECTED_C) {
Serial.println("DS18B20: Erreur de lecture!");
tempDS18B20 = -999.0; // Indiquer une erreur
}
}
void readDHT22() {
humidityDHT = dht.readHumidity();
tempDHT = dht.readTemperature();
if (isnan(humidityDHT) || isnan(tempDHT)) {
Serial.println("DHT22: Erreur de lecture!");
humidityDHT = -999.0;
tempDHT = -999.0;
}
}
float readAnalogSensor(int pin, float vref, float slope, float intercept) {
long sum = 0;
for (int i = 0; i < 10; i++) {
sum += analogRead(pin);
delay(10);
}
float analogValue = sum / 10.0;
float voltage = analogValue * (vref / 4095.0);
return (slope * voltage + intercept);
}
// ===========================================================================
// Fonctions d'affichage LCD
// ===========================================================================
void updateLCD() {
lcd.clear();
// Ligne 0: Température (DS18B20) et Humidité (DHT22)
lcd.setCursor(0, 0);
lcd.print("T:");
if (tempDS18B20 != -999.0) {
lcd.print(tempDS18B20, 1);
lcd.print((char)223); // Symbole degré
lcd.print("C");
} else {
lcd.print("Err");
}
lcd.print(" H:");
if (humidityDHT != -999.0) {
lcd.print(humidityDHT, 1);
lcd.print("%");
} else {
lcd.print("Err");
}
// Ligne 1: Température (DHT22) et pH
lcd.setCursor(0, 1);
lcd.print("T(DHT):");
if (tempDHT != -999.0) {
lcd.print(tempDHT, 1);
lcd.print((char)223); // Symbole degré
lcd.print("C");
} else {
lcd.print("Err");
}
lcd.print(" pH:");
lcd.print(pHValue, 2);
// Ligne 2: EC
lcd.setCursor(0, 2);
lcd.print("EC:");
lcd.print(ecValue, 2);
lcd.print(" mS/cm");
// Ligne 3: DO
lcd.setCursor(0, 3);
lcd.print("DO:");
lcd.print(doValue, 2);
lcd.print(" mg/L");
}
// ===========================================================================
// Setup et Loop
// ===========================================================================
void setup() {
Serial.begin(115200);
Serial.println("Démarrage du système de surveillance du bioréacteur...");
// Initialisation des capteurs
sensors.begin();
dht.begin();
// Configuration de l'ADC pour les capteurs analogiques
analogReadResolution(12);
analogSetAttenuation(ADC_11db);
// Initialisation de l'écran LCD
lcd.init();
lcd.backlight();
lcd.print("Systeme Bioreacteur");
lcd.setCursor(0, 1);
lcd.print("Initialisation...");
delay(2000);
}
void loop() {
// Lire tous les capteurs
readDS18B20();
readDHT22();
pHValue = readAnalogSensor(PH_PIN, VREF_PH, PH_SLOPE, PH_INTERCEPT);
ecValue = readAnalogSensor(EC_PIN, VREF_EC, EC_K_VALUE, EC_OFFSET);
doValue = readAnalogSensor(DO_PIN, VREF_DO, DO_K_VALUE, DO_OFFSET);
// Afficher les données sur le moniteur série
Serial.print("DS18B20 Temp: "); Serial.print(tempDS18B20); Serial.print("C | ");
Serial.print("DHT Temp: "); Serial.print(tempDHT); Serial.print("C | ");
Serial.print("DHT Hum: "); Serial.print(humidityDHT); Serial.print("% | ");
Serial.print("pH: "); Serial.print(pHValue); Serial.print(" | ");
Serial.print("EC: "); Serial.print(ecValue); Serial.print(" mS/cm | ");
Serial.print("DO: "); Serial.print(doValue); Serial.println(" mg/L");
// Mettre à jour l'écran LCD
updateLCD();
delay(5000); // Lire les capteurs toutes les 5 secondes
}