Connexion
·
INSCRIPTION
·
Site
Recevoir à nouveau l'e-mail de validation
Forum Cooling-Masters
>
Electronique
>
Réalisations diverses
[Arduino] Gestion auto niveau puits
Ajouter ou retirer ce sujet de vos favoris
·
Suivre ce sujet
·
Imprimer ce sujet
Bas de page
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 :
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
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 :
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 :
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
Haut de page
Pages :
1
2
3
4
Page précédente
Page suivante
Forum Cooling-Masters
>
Electronique
>
Réalisations diverses
Page générée en 0.015 secondes