Cooling-Masters
Connexion · INSCRIPTION · Site Recevoir à nouveau l'e-mail de validation


[Arduino] Gestion auto niveau puits

Ajouter ou retirer ce sujet de vos favoris  ·  Suivre ce sujet  ·  Imprimer ce sujet
Pages :  1  2  3  4 
Page précédente    Page suivante 
OrOoX


AFK ? Késako ? :D
Messages : 9889

samedi 13 janvier 2018 à 20:05:37     
Hum genre ceux là ou moins cher ? https://www.ebay.fr/itm/1525-MR25-Metal-Fil...WQdc-BNGqhUU5mA


Bon bah sinon hormis une alim ATX qui a cramé ( j'aurais du la dépoussiérer ), j'ai pu bosser sur la régul et du coup
reprendre mes conneries car oui au final j'ai fais le test avec les résistances et je suis bien à 512, ça venait de mon code vu
que au lieu d'afficher la valeur, j'ai fais mon boulet et affiché les millibars ... Forcément ça donne pas le même résultat !

J'ai du coup mesurer la longueur enterrée et donc la hauteur réel jusqu'à bas de la crépine est de 2.69m, autant dire 2.60m exploitable.

Donc ça donne ça avant vidange :
Image

Et après vidange, une calibration sera à faire une fois installé en définitif car en effet la hauteur du capteur impacte le résultat, j'ai
d'ailleurs transformé le "int tension" en "float" car la précision n'était pas au rdv, maintenant j'ai 0.40% de précision contre mini 4% et 10Kpa

Image

Et du coup le code actuel :

CODE :


#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7);

////////////////////////////////
// Initialisation des valeurs //
////////////////////////////////

int Niveau_mini = 10.0; // Seuil de coupure niveau bas ( % )
int Niveau_mini_tp = 90.0; // Seuil de coupure vidange auto ( % )
int Niveau_maxi_tp = 100.0; // Seuil de déclenchement vidange auto ( % )
int relai_1 = 2;
int relai_2 = 3;
int relai_3 = 4;
int relai_4 = 5;
int entree_1 = 7;
int entree_2 = 8;
int defaut = 0;
int Timer_1;
int stat_230 = 0;
unsigned long tempo_lcd;
unsigned long tempo_script;
unsigned long tempo_mesure;
float Pourcentage = 0;
float millibars = 0;

void setup() {
   lcd.begin(20,4);
   lcd.noAutoscroll();
   lcd.setBacklightPin(3,POSITIVE);
   lcd.setBacklight(HIGH);
   lcd.home();

   lcd.setCursor(0,0);
   lcd.print("Pompe:OFF");
   lcd.setCursor(0,1);
   lcd.print("EV Purge:OFF");
   lcd.setCursor(0,2);
   lcd.print("230V:OFF");
   lcd.setCursor(0,3);
   lcd.print("Defaut:OFF");
   
   pinMode(relai_1, OUTPUT); // Relai 1 = pompe
   pinMode(relai_2, OUTPUT); // Relai 2 = electrovanne
   pinMode(relai_3, OUTPUT); // Relai 3 = coupure 230V
   pinMode(relai_4, OUTPUT); // Relai 4 = Défaut
   pinMode(entree_1, INPUT_PULLUP); // Pressostat
   pinMode(entree_2, INPUT_PULLUP); // Pressostat différentiel

   digitalWrite(relai_1, HIGH);
   digitalWrite(relai_2, HIGH);
   digitalWrite(relai_3, HIGH);
   digitalWrite(relai_4, HIGH);

   Serial.begin(9600);
}

void loop()
{    
   //////////////////////////////////////////////////////
   // Contrôle automatique pression & niveau haut puit //
   //////////////////////////////////////////////////////
   
   if (millis() > 4000 && stat_230 == 0) // Attente 4 secondes avant allumage 230V
   {
     digitalWrite(relai_3, LOW);
     lcd.setCursor(5,2);
     lcd.print("ON ");
     stat_230 = 1;
   }

   if (millis() >= tempo_mesure) // Mesure toutes les secondes
   {
     float tension = analogRead(A0)*4.88;
     millibars = (tension/45)*10;
       
     // Calcul niveau remplissage
     Pourcentage  = (100*(millibars-406))/(675-406); // Hauteur théorique puits = 2.69m

     tempo_mesure = millis()+1000;
   }
   
   if (millis() > 8000) // Attente de 8 secondes avant début du script
   {
     if (millis() >= tempo_script && defaut == 0) // Tempo de 500ms entre chaque execution
     {  
       if (digitalRead(entree_1) == LOW && Pourcentage > Niveau_mini && digitalRead(relai_1) == HIGH)
       {
         digitalWrite(relai_1, LOW); // On allume la pompe
             
         lcd.setCursor(6,0);
         lcd.print("ON ");

         Timer_1 = millis() + 5000; // Définition d'un temps d'attente pour la détection manque débit
       }
   
       if (Pourcentage >= Niveau_maxi_tp && digitalRead(relai_2) == HIGH)
       {
         digitalWrite(relai_2, LOW); // On allume l'électrovanne de vidange
 
         lcd.setCursor(9,1);
         lcd.print("ON ");

         Timer_1 = millis() + 10000; // Définition d'un temps d'attente pour la détection manque débit
       }
     
       if (millis() > Timer_1 && (digitalRead(relai_1) == LOW || digitalRead(relai_2)) == LOW && digitalRead(entree_2) == HIGH) // Contrôle débit
       {
         digitalWrite(relai_1, HIGH); // Coupure pompe pour absence débit
         digitalWrite(relai_2, HIGH); // Coupure électrovanne de vidange
         digitalWrite(relai_3, HIGH); // COupure alimentation 230V ( sécurité )
         digitalWrite(relai_4, LOW); // Coupure alimentation 230V ( sécurité )
 
         lcd.setCursor(6,0);
         lcd.print("OFF");
         lcd.setCursor(9,1);
         lcd.print("OFF");
         lcd.setCursor(5,2);
         lcd.print("OFF");
         lcd.setCursor(7,3);
         lcd.print("ON ");
           
         defaut = 1; // Activation du défaut
       }
       
       if (digitalRead(relai_1) == LOW)
       {
         if (digitalRead(entree_1) == HIGH)
         {
           digitalWrite(relai_1, HIGH); // Coupure pompe
           lcd.setCursor(6,0);
           lcd.print("OFF");
         }
         if (Pourcentage <= Niveau_mini_tp)
         {
           digitalWrite(relai_2, HIGH); // Coupure électrovanne de vidange
           lcd.setCursor(9,1);
           lcd.print("OFF");
         }
       }
       tempo_script = millis()+500;
     }
   }

   if (millis() >= tempo_lcd)
   {
     lcd.setCursor(12,0);
     lcd.print(digitalRead(relai_1));
     lcd.setCursor(12,1);
     lcd.print(digitalRead(relai_2));
     lcd.setCursor(12,2);
     lcd.print(digitalRead(relai_3));
     lcd.setCursor(12,3);
     lcd.print(digitalRead(relai_4));
     lcd.setCursor(14,0);
     lcd.print(digitalRead(entree_1));
     lcd.setCursor(16,0);
     lcd.print(digitalRead(entree_2));
     lcd.setCursor(14,1);
     lcd.print(Pourcentage);
     lcd.setCursor(14,2);
     lcd.print(analogRead(A0));
     lcd.setCursor(14,3);
     lcd.print(millibars,1);

     tempo_lcd = millis()+1000;
   }
}
Google




     
Biduleohm


Membre
Messages : 906

samedi 13 janvier 2018 à 21:20:24     
Transforme ça :

CODE :

float tension = analogRead(A0)*4.88;
millibars = (tension/45)*10;


En ça :

CODE :

millibars  = (analogRead(A0) * 48.8) / 45;


Parce que à chaque calcul tu risques de perdre en précision et tu rends le code plus lent, le moins de calculs inutiles le mieux c'est.

Ensuite 1 mb = 1 cm donc pas vraiment besoin d'un float car je doute que t'aies besoin de mieux qu'un cm de précision, au pire tu le stockes en mm (donc 0.1 mb) dans un long ce qui donne :

CODE :

millimeters  = (analogRead(A0) * 488) / 45;


Edit: pour les résistances je pense qu'on peut trouver moins cher, notamment parce que celles-là sont en fait sorties d'une série E24 et en plus en précision 1 % (le E24 est à 5 % en principe). En E12 on est à 10 % en principe donc beaucoup moins cher à produire. Après si tu veux absolument du 1 % ça m'a l'air correct comme prix.

Note que c'est une bonne idée d'acheter en plus des lots de 100 ou plus des valeurs ultra utilisées (genre 1 k et 10 k par ex) car si tu fais de l'élec régulièrement tu vas vite épuiser le stock de 25 pour ces valeurs.

Message édité par Biduleohm le samedi 13 janvier 2018 à 21:28:04
kissagogo27


Méchant Vieux Râleur
Messages : 28148

samedi 13 janvier 2018 à 21:44:14     
autant aussi entrer une fois pour toute la valeur 488/45
OrOoX


AFK ? Késako ? :D
Messages : 9889

dimanche 14 janvier 2018 à 00:20:02     
Du coup j'ai modifié le code et ajouté une ligne pour le calcul du volume d'eau bien qu’approximatif vu que c'est un
puits fait en pierre et non des buses en béton donc non égal partout, ça donne une idée.

SPOILER :

CODE :

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7);

////////////////////////////////
// Initialisation des valeurs //
////////////////////////////////

int Niveau_mini = 10.0; // Seuil de coupure niveau bas ( % )
int Niveau_mini_tp = 90.0; // Seuil de coupure vidange auto ( % )
int Niveau_maxi_tp = 100.0; // Seuil de déclenchement vidange auto ( % )
int relai_1 = 2;
int relai_2 = 3;
int relai_3 = 4;
int relai_4 = 5;
int entree_1 = 7;
int entree_2 = 8;
int defaut = 0;
int Timer_1;
int stat_230 = 0;
unsigned long tempo_lcd;
unsigned long tempo_script;
unsigned long tempo_mesure;
float pourcentage = 0;
float millibars = 0;
int vol_eau;

void setup() {
   lcd.begin(20,4);
   lcd.noAutoscroll();
   lcd.setBacklightPin(3,POSITIVE);
   lcd.setBacklight(HIGH);
   lcd.home();

   lcd.setCursor(0,0);
   lcd.print("Pompe:OFF");
   lcd.setCursor(0,1);
   lcd.print("EV Purge:OFF");
   lcd.setCursor(0,2);
   lcd.print("230V:OFF");
   lcd.setCursor(0,3);
   lcd.print("Defaut:OFF");
   
   pinMode(relai_1, OUTPUT); // Relai 1 = pompe
   pinMode(relai_2, OUTPUT); // Relai 2 = electrovanne
   pinMode(relai_3, OUTPUT); // Relai 3 = coupure 230V
   pinMode(relai_4, OUTPUT); // Relai 4 = Défaut
   pinMode(entree_1, INPUT_PULLUP); // Pressostat
   pinMode(entree_2, INPUT_PULLUP); // Pressostat différentiel

   digitalWrite(relai_1, HIGH);
   digitalWrite(relai_2, HIGH);
   digitalWrite(relai_3, HIGH);
   digitalWrite(relai_4, HIGH);

   Serial.begin(9600);
}

void loop()
{    
   //////////////////////////////////////////////////////
   // Contrôle automatique pression & niveau haut puit //
   //////////////////////////////////////////////////////
   
   if (millis() > 4000 && stat_230 == 0) // Attente 4 secondes avant allumage 230V
   {
     digitalWrite(relai_3, LOW);
     lcd.setCursor(5,2);
     lcd.print("ON ");
     stat_230 = 1;
   }

   if (millis() >= tempo_mesure) // Mesure toutes les secondes
   {
     // Calcul pression absolue
     millibars  = (analogRead(A0) * 48.8) / 45;
       
     // Calcul niveau remplissage
     pourcentage = (100*(millibars-406))/(675-406); // Hauteur théorique puits = 2.69m
     
     // Calcul volume eau
     vol_eau = 3.14 * 0.2025 * ((millibars-406) * 10);
     
     tempo_mesure = millis()+1000;
   }
   
   if (millis() > 8000) // Attente de 8 secondes avant début du script
   {
     if (millis() >= tempo_script && defaut == 0) // Tempo de 500ms entre chaque execution
     {  
       if (digitalRead(entree_1) == LOW && pourcentage > Niveau_mini && digitalRead(relai_1) == HIGH)
       {
         digitalWrite(relai_1, LOW); // On allume la pompe
             
         lcd.setCursor(6,0);
         lcd.print("ON ");

         Timer_1 = millis() + 5000; // Définition d'un temps d'attente pour la détection manque débit
       }
   
       if (pourcentage >= Niveau_maxi_tp && digitalRead(relai_2) == HIGH)
       {
         digitalWrite(relai_2, LOW); // On allume l'électrovanne de vidange
 
         lcd.setCursor(9,1);
         lcd.print("ON ");

         Timer_1 = millis() + 10000; // Définition d'un temps d'attente pour la détection manque débit
       }
     
       if (millis() > Timer_1 && (digitalRead(relai_1) == LOW || digitalRead(relai_2)) == LOW && digitalRead(entree_2) == HIGH) // Contrôle débit
       {
         digitalWrite(relai_1, HIGH); // Coupure pompe pour absence débit
         digitalWrite(relai_2, HIGH); // Coupure électrovanne de vidange
         digitalWrite(relai_3, HIGH); // COupure alimentation 230V ( sécurité )
         digitalWrite(relai_4, LOW); // Coupure alimentation 230V ( sécurité )
 
         lcd.setCursor(6,0);
         lcd.print("OFF");
         lcd.setCursor(9,1);
         lcd.print("OFF");
         lcd.setCursor(5,2);
         lcd.print("OFF");
         lcd.setCursor(7,3);
         lcd.print("ON ");
           
         defaut = 1; // Activation du défaut
       }
       
       if (digitalRead(relai_1) == LOW)
       {
         if (digitalRead(entree_1) == HIGH)
         {
           digitalWrite(relai_1, HIGH); // Coupure pompe
           lcd.setCursor(6,0);
           lcd.print("OFF");
         }
         if (pourcentage <= Niveau_mini_tp)
         {
           digitalWrite(relai_2, HIGH); // Coupure électrovanne de vidange
           lcd.setCursor(9,1);
           lcd.print("OFF");
         }
       }
       tempo_script = millis()+500;
     }
   }

   if (millis() >= tempo_lcd)
   {
     lcd.setCursor(14,0);
     lcd.print("Niveau");
     lcd.setCursor(14,1);
     lcd.print(pourcentage);
     lcd.setCursor(14,2);
     lcd.print("Volume");
     lcd.setCursor(14,3);
     lcd.print(vol_eau);

     tempo_lcd = millis()+1000;
   }
}



Ca fait un volume de ~1710L en théorie, c'est déjà pas mal en cas de grosse pluie

Message édité par OrOoX le dimanche 14 janvier 2018 à 00:21:45
Biduleohm


Membre
Messages : 906

dimanche 14 janvier 2018 à 02:31:04     
@Kissa oui et non car on évite les décimales et donc tout un tas de pb.

@Oroox au lieu de trimbaler l'offset de 406 dans tous les calculs tu devrais plutôt le mettre une seule fois :

CODE :

millibars  = ((analogRead(A0) * 48.8) / 45) - 406;
OrOoX


AFK ? Késako ? :D
Messages : 9889

dimanche 14 janvier 2018 à 04:14:58     
Pas faux, c'était histoire de rester clair au moment où j'ai mis en place le calcul, sinon je me pomme moi même
Biduleohm


Membre
Messages : 906

dimanche 14 janvier 2018 à 04:52:48     
Le mieux reste d'utiliser un define au lieu de mettre des chiffres peu explicites au milieu du code.

En haut avant tout le reste mais après les includes :

CODE :

#define HEIGHT_OFFSET 406


Et donc dans le calcul :

CODE :

millibars  = ((analogRead(A0) * 48.8) / 45) - HEIGHT_OFFSET;
Sk_rmouche


Apprenti Aigri
Messages : 17926

dimanche 14 janvier 2018 à 10:58:10     
J'y pense mais quand bidule parlait d'utiliser un télémètre comme référence, y'avait pas moyen d'utiliser la mesure laser directement ? Genre un cylindre plexi, une cible blanche et une diode laser avec une mesure chaque minute ?
OrOoX


AFK ? Késako ? :D
Messages : 9889

dimanche 14 janvier 2018 à 11:39:25     
Pourquoi un #define au lieu d'utiliser un int, float ou autre d'ailleurs ? Intérêt particulier ?


Pour le laser il faut déjà avoir au puits, ce qui n'est plus mon cas
kissagogo27


Méchant Vieux Râleur
Messages : 28148

dimanche 14 janvier 2018 à 13:12:57     
bah une constante , sinon en Basic, tout déclarer en integer ou long integer pour accélérer les calculs toussa, habitude a prendre, et coller la virgule au bon endroit dans la routine d'affichage et fini les décimales
Biduleohm


Membre
Messages : 906

dimanche 14 janvier 2018 à 15:47:58     
Oui, un define est en lecture seule (tu ne peux pas le modifier accidentellement dans un calcul par ex), tu peux le réutiliser plusieurs fois (donc pas besoin de modifier 36 valeurs, juste une suffit et tous les calculs sont automatiquement mis à jour) et il est en haut d'un fichier (souvent on les met même dans un fichier à part qui sert de fichier de configuration en gros) donc facilement accessible si tu dois le modifier (plutôt que de te balader dans le code à la recherche du chiffre à modifier)

@Kissa C'est pas vraiment une constante car une constante c'est plutôt const int = 42;

Oui, en général on reste en entier partout et on met la virgule juste pour l'affichage. D'autant plus que sur arduino les float ne sont pas natifs et donc sont beaucoup plus lents que les entiers en plus de poser un souci de précision dans certains cas car pas de virgule fixe.
OrOoX


AFK ? Késako ? :D
Messages : 9889

lundi 05 février 2018 à 20:38:15     
Bon bah après un petit moment de stase, j'ai enfin fait l'intégration dans le boitier ce week end, je vous laisse voir en image :

Image

Image

Image

Image

Et en vidéo !

Partie 1 - régul trop plein : https://www.youtube.com/watch?v=SLpgeDCOU8Q
Partie 2 - Régul pression : https://www.youtube.com/watch?v=_Q5hOBet2AA


Et oui je sais ça court-cycle à la fin de la vidéo, c'est à cause du flexible du vase dont le diamètre intérieur est trop petit, ça bride
msneob


Membre
Messages : 1833

lundi 05 février 2018 à 21:33:46     
Ca aboutit enfin ce truc, quel bordel aha La fonctionnalité a l'air présente en tout cas, les valeurs ont l'air cohérentes au fur et à mesure que ça pompe.
OrOoX


AFK ? Késako ? :D
Messages : 9889

lundi 05 février 2018 à 23:29:25     
Yeap la valeur est pas totalement stable comme on peut le voir sur la vidéo mais ça fait le taff, faut juste que je finisse de calibrer
tout ça et de fixer le boitier sous l'évier et ça devrait pouvoir rester allumer H24
Sk_rmouche


Apprenti Aigri
Messages : 17926

lundi 05 février 2018 à 23:49:11     
Pas mal cette intégration ? Le petit boitier à droite de l'afficheur ça sort d'où ?
OrOoX


AFK ? Késako ? :D
Messages : 9889

mardi 06 février 2018 à 00:37:31     
Indice

SPOILER :

Image
Biduleohm


Membre
Messages : 906

mardi 06 février 2018 à 14:30:14     
C'est propre

Par contre la découpe pour l'écran est vachement grande.
OrOoX


AFK ? Késako ? :D
Messages : 9889

mardi 06 février 2018 à 19:48:22     
La découpe c'est un peu de l'impro, à la base il y avait déjà deux ouverture qui faisait plus que la largeur de l'écran
et du coup j'ai du recoupé une ouverture, mais j'ai un peu abusé sur la hauteur ouais
OrOoX


AFK ? Késako ? :D
Messages : 9889

dimanche 04 mars 2018 à 18:12:17     



Dit voir j'ai un petit soucis, j'ai rajouté le module : https://www.amazon.fr/gp/product/B00JGFEGG4...0?ie=UTF8&psc=1

Le problème c'est qu'avec, à chaque fois que la carte essaie d'allumer un relai, elle reboot toute seule comme
si l'appel de courant était trop important, on voit l'écran lcd scintiller une fois et pouf.

Par contre ça le fait pas quand j'alimente tout depuis la carte arduino avec le régulateur ...


Z'auriez pas une idée pour régler le prob ? Un condo ?

Message édité par OrOoX le dimanche 04 mars 2018 à 18:12:40
Google




     
Pages :  1  2  3  4 
Page précédente    Page suivante