bonjour Mike118 , sandro,
Bonne nouvelle toutes vos modifications ont portées leurs fruits .
J'ai fait plusieurs arrosage avec soil_moisture hors de l'eau et cela à bien fonctionner .
Je vous joint le serial .[attachment=11464:Serial_06_04_20.txt]
Juste la quantité d'eau à chaque déversement environ le double de la commande ,je pense que cela ai du à plusieurs facteur (pompe ,longueur du tuyau ou ai positionner le flow water par rapport à la sortie de la pompe etc...) .
je vous joint le code pour vérifier le code .
merci
/*Soil Moisture*/
const uint8_t sensor_MoisturePin = A0;
const uint32_t tempsEntreDeuxAffichages = 1000;// Temps en ms
/*Relay Pompe Arrosage*/
const uint8_t RelayPin = A2;
/* Capteur de débit d'eau*/
const uint8_t sensorInterrupt = 0;
const uint8_t sensorPin = 2;
const float calibrationFactor = 4.5;
/* Variables volatiles utilisées dans l'interruption pour le débit d'eau = une des rares variables qu'on a le droit d'avoir en globale*/
volatile uint8_t pulseCount = 0;
void setup() {
Serial.begin(9600);
/* Init SoilMoisture*/
pinMode(sensor_MoisturePin,INPUT);
/* Init Relay Pumpe */
pinMode(RelayPin, OUTPUT);
/* initialisation du capteur de pompe*/
water_setup ();
}
uint16_t getRawHumidity(){
/* Variables Arrosage*/
uint16_t rawHumidity = analogRead(sensor_MoisturePin);
return rawHumidity;
}
uint8_t getPercentHumidity(uint16_t rawHumidity){
if(rawHumidity > 1023)
rawHumidity = 1023;
uint8_t percentHumidity = map(rawHumidity, 0, 1023, 0, 100);
return percentHumidity;
}
void water_setup () {
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
pulseCount = 0;
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
/* fonction qui lit stock en interne et retourne le résultat */
uint32_t water_read () {
/* Les variables statiques sont des variables qui ne sont pas écrasée, ça permet d'éviter d'utiliser des variables globales*/
static uint32_t totalMilliLitres = 0;
static uint32_t oldTime = millis();
/* Variables temporaires juste pour les calculs => Pas besoin d'avoir des variables globales pour ça*/
float flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
float flowMilliLitres = (flowRate / 60) *1000;
/* Mise à jour de notre variable de stockage ( variable statique ) */
totalMilliLitres += flowMilliLitres;
/* Remise à zero des outils de calculs ( variable statique + globale volatile)*/
oldTime = millis();
pulseCount = 0;
/* Retour du résultat*/
return totalMilliLitres;
}
void pulseCounter() {
/* Incremente pulseCount*/
pulseCount++;
}
void setWaterPump(bool etat) {
if ( etat == false ) {
digitalWrite(RelayPin,false);
Serial.println("pompe Off");
}
else {
digitalWrite(RelayPin,true);
Serial.println("pompe On");
}
}
void loop() {
affichage(); //affichage des constantes sur le serial
Arrosage(30); // arroser si humidité <30%
attendre(1); // attendre 1000ms
}
void affichage() {
uint16_t rawHumidity = getRawHumidity();
uint8_t percentHumidity = getPercentHumidity(rawHumidity);
Serial.print("Raw Humidity value: ");
Serial.print(rawHumidity);
Serial.print("\t");
Serial.print("Percentage: ");
Serial.print(percentHumidity);
Serial.println("%");
Serial.print("Output Liquid Quantity: ");
Serial.print(water_read ());
Serial.println("mL");
}
void setWater( uint8_t mlValue) {
uint16_t mlReference = water_read();// on note la quantité en ml qui était déjà arrosée avant de commencer
uint16_t ml = mlReference;
bool etatPompe = false; // Pompe Off par défaut
setWaterPump(true); // on allume la pompe
Serial.println("Arrosage en cours");
while(ml < mlReference + mlValue ) {
ml= water_read(); // mise à jour de ml
// Affichage en attendant que le dosage d'eau soit ok
Serial.print("Lecture : ");
Serial.println(water_read());
Serial.print("Limite à atteindre : ");
Serial.println(mlReference + mlValue);
Serial.println("");
attendre(1); // attendre 1 seconde
}
Serial.println("dosage eau ok");
setWaterPump(false);// on éteind la pompe quand le dosage est ok
}
void attendre(uint32_t attente) { // temps d'attente en secondes
uint32_t timeReference = millis();// temps avant de commencer
Serial.print("On attend ");
Serial.print(attente);
Serial.print("secondes");
while (millis() - timeReference <= attente * 1000) {
// On ne fait rien en attendant
}
Serial.println("Fin de l'attente");
}
void Arrosage(uint8_t seuil){
uint8_t percentHumidity = getPercentHumidity(getRawHumidity());
if ( percentHumidity < seuil ) {
setWater(10);//(x ml)
attendre(30);//attendre
percentHumidity = getPercentHumidity(getRawHumidity());
if ( percentHumidity >= seuil ) {
Serial.println("Arrosage terminé avec succès");
} else {
Serial.println("Echec d'arrosage");
}
} else {
Serial.println("Pas besoin d'arroser");
}
}