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
Biduleohm
Membre
Messages : 906
dimanche 31 décembre 2017 à 15:00:32
Overflow des timers... tu mets un unsigned long dans un int...
Un tableau que je m'étais fait qui est très utile:
CODE :
+===============+===============+==============+==================+=================+=================================+===============+
| type | size in bytes | size in bits | min value | max value | classic C equivalent type (x86) | notes |
+===============+===============+==============+==================+=================+=================================+===============+
| boolean | 1 | 8 | 0 | 1 | char | |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
| char | 1 | 8 | -128 | 127 | char | |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
| byte | 1 | 8 | 0 | 255 | unsigned char | |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
| word | 2 | 16 | 0 | 65,535 | unsigned short | useless |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
| int | 2 | 16 | -32,768 | 32,767 | short | |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
| unsigned int | 2 | 16 | 0 | 65,535 | unsigned short | |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
| long | 4 | 32 | -2,147,483,648 | 2,147,483,647 | int or long | |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
| unsigned long | 4 | 32 | 0 | 4,294,967,295 | unsigned int or unsigned long | |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
| float | 4 | 32 | -3.402,823,5E+38 | 3.402,823,5E+38 | float | not native |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
| double | 4 | 32 | -3.402,823,5E+38 | 3.402,823,5E+38 | float | not native |
+---------------+---------------+--------------+------------------+-----------------+---------------------------------+---------------+
Google
OrOoX
AFK ? Késako ? :D
Messages : 9889
dimanche 31 décembre 2017 à 20:41:35
Merci pour ta réponse
Je comprend beaucoup mieux le problème avec ton tableau, ça saute au yeux du coup la différence entre chaque types
et du coup ça revient aussi à ce que j'ai lu sur un site comme quoi l'arduino ne pouvait pas tourner plus de 50 jours.
Par contre tu as marqué " tu mets un unsigned long dans un int...", tu voulais dire à la place du int nan ?
Biduleohm
Membre
Messages : 906
lundi 01 janvier 2018 à 03:29:41
Il peut sans souci tourner indéfiniment, il faut juste concevoir ses timers pour gérer les overflows
Non non, je voulais bien dire ce que j'ai marqué. millis() retourne un unsigned long et tu le mets dans une variable qui est un int. M'enfin si l'IDE de l'arduino n'était pas le pire IDE (en fait c'est même pas un IDE, c'est à peine un demi éditeur de texte...) que j'ai jamais vu il t'indiquerait à la ligne concernée que t'es en train de faire int = unsigned long et que ça peut être un problème. Regarde du côté de Code Blocks arduino, c'est une version spéciale de Code Blocks modifié pour gérer les particularités des arduinos (par contre pour une raison obscure il est très sensible aux espaces dans les paths donc il faut mettre ses projets dans un chemin sans espaces genre c:\arduino\ par exemple) et qui est un semblant de vrai IDE (auto-complétion, gère des sous-dossiers dans les projets, etc...)
OrOoX
AFK ? Késako ? :D
Messages : 9889
lundi 01 janvier 2018 à 10:53:47
Ah oki, j'avais pas compris le sens de ta phrase du coup
Par contre avec mon script j'ai remarqué que la carte avait du mal à gérer les conditions " >= ", le code ne voulait plus s’exécuter
et après l'avoir passé en " > ", ça fonctionnait à nouveau ...
Je vais regarder pour Codeblock mais il me semblait que l'appli officiel gérait aussi l'auto-complétion à un moment nan ?
( Super, windows defender s'excite : Trojan:Win32/Azden.A!cl ...
)
Message édité par
OrOoX
le lundi 01 janvier 2018 à 10:54:26
Biduleohm
Membre
Messages : 906
lundi 01 janvier 2018 à 17:34:00
Le problème ne vient pas du >= mais d'autre chose, à mon avis tu partais en boucle infinie par ex.
Le lien officiel:
http://arduinodev.com/codeblocks/
OrOoX
AFK ? Késako ? :D
Messages : 9889
lundi 01 janvier 2018 à 19:33:56
Bah ce qui m'étonne c'est que par exemple si je laisse le fil du pressostat ( entree_1 ) branché au démarrage de la carte,
dès que le script se lance ça fonctionne bien, je débranche le fil, ça coupe, je rebranche, plus rien ...
J'ai tous les status sur le LCD et tout était dans au bon état mais pas de réaction ...
J'ai aussi un autre problème dont j'ignore la cause bien que j'ai l'impression que ça soit due au temps de bascule de la carte
mais si je fais plein de contact court sur l'entrée du pressostat, la carte fini par se mettre en défaut débit direct sans prendre
en compte la tempo qui est réinitialisée à chaque contact ( normalement ).
Enfin bon, faudrait que je fasse un essai réel pour voir si tout réagit correctement mais pour ça il faut que je fasse quelques courses ^^
Le code à jour ( et modifié ) :
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 = 20.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 Offset_pression_abs = 150; // Offset hauteur réelle
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);
}
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
{
millibars = readPressure(A1)/100;
// Calcul niveau remplissage
Pourcentage = (100*millibars)/(1150-Offset_pression_abs);
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(14,1);
lcd.print(digitalRead(entree_2));
lcd.setCursor(14,2);
lcd.print(Pourcentage,1);
lcd.setCursor(14,3);
lcd.print(millibars,1);
tempo_lcd = millis()+1000;
}
}
float readPressure(int pin){
int pressureValue = analogRead(pin);
float pressure=((pressureValue/1023.0)+0.095)/0.000009;
return pressure;
}
Biduleohm
Membre
Messages : 906
lundi 01 janvier 2018 à 20:14:13
Peut-être un pb de parasites. Faut éviter les fils longs et non blindés, mélanger les signaux de commande et de puissance dans des câbles proches, peut-être ajouter des ferrites et/ou des filtres passe-bas sur les entrées de l'arduino, ...
Autre chose: il faut debouncer les entrées (notamment celles sur un contact sec genre interrupteur) sinon tu vas avoir un tas de pb. Je me suis fait quelques classes dont une de timer (mais je ne suis pas sûr qu'elle soit overflow safe, faudrait que je regarde) et une d'input (qui gère le debouncing).
J'ai tout regroupé ici avec un petit exemple d'utilisation à la fin :
SPOILER :
CODE :
/*
** Made by Biduleohm
** 2016/05
*/
#ifndef TIMER_H
#define TIMER_H
#include <Arduino.h>
typedef uint32_t ulong;
class Timer
{
public:
bool isPaused;
ulong time;
Timer();
void reset();
void reset(ulong _duration);
void update();
bool hasEnded();
bool hasEnded(ulong _duration);
private:
ulong start;
ulong duration;
};
#endif /*TIMER_H*/
/*
** Made by Biduleohm
** 2016/05
*/
Timer::Timer()
{
this->reset();
}
void Timer::reset()
{
this->isPaused = false;
this->start = millis();
this->time = 0;
this->duration = 0;
}
void Timer::reset(ulong _duration)
{
this->isPaused = false;
this->start = millis();
this->time = 0;
this->duration = _duration;
}
void Timer::update()
{
if (this->isPaused) {
this->start = millis() - this->time;
} else {
this->time = millis() - this->start;
}
}
bool Timer::hasEnded()
{
return (this->time >= this->duration);
}
bool Timer::hasEnded(ulong _duration)
{
return (this->time >= _duration);
}
/*
** Made by Biduleohm
** 2016/05
*/
#ifndef INPUT_H
#define INPUT_H
#include <Arduino.h>
#define DEBOUNCE_DELAY 50UL
class Input
{
public:
bool isHigh;
bool isLow;
bool wentHigh;
bool wentLow;
Input(byte _pin);
void reset();
void update();
private:
byte pin;
byte lastState;
byte debouncedLastState;
Timer *timer;
};
#endif /*INPUT_H*/
/*
** Made by Biduleohm
** 2016/05
*/
Input::Input(byte _pin)
{
this->pin = _pin;
this->timer = new Timer();
this->reset();
}
void Input::reset()
{
this->lastState = -1;
this->debouncedLastState = -1;
this->isHigh = false;
this->isLow = false;
this->wentHigh = false;
this->wentLow = false;
}
void Input::update()
{
byte currentState;
pinMode(this->pin, INPUT);
currentState = digitalRead(this->pin);
this->timer->update();
if (currentState != this->lastState) {
this->timer->reset();
} else if (this->timer->hasEnded(DEBOUNCE_DELAY)) {
if (currentState == HIGH) {
if (this->debouncedLastState == LOW) {
this->wentHigh = true;
}
this->isHigh = true;
this->isLow = false;
} else {
if (this->debouncedLastState == HIGH) {
this->wentLow = true;
}
this->isHigh = false;
this->isLow = true;
}
this->debouncedLastState = currentState;
}
this->lastState = currentState;
}
Timer *myTimer = new Timer();
Timer *myOtherTimer = new Timer();
Input *myBbutton = new Input(2);
Input *myOtherBbutton = new Input(3);
void setup()
{
myOtherTimer->reset(15000UL);
}
void loop()
{
myBbutton->update();
myTimer->update();
if (myTimer->hasEnded(1000UL)) {
myTimer->reset();
if (myBbutton->wentHigh) {
myBbutton->wentHigh = false;
/* do some stuff here */
}
}
myOtherTimer->update();
if (myOtherTimer->hasEnded()) {
/* do some stuff here */
}
myOtherBbutton->update();
if (myOtherBbutton->isLow) {
/* do some stuff here */
}
}
Message édité par
Biduleohm
le lundi 01 janvier 2018 à 20:14:51
OrOoX
AFK ? Késako ? :D
Messages : 9889
lundi 01 janvier 2018 à 21:03:03
On peut pas dire que la config soit parasité pour l'instant, tout est posé sur un journal avec des fils de 10cm,
faudra voir en fonctionnement mais à part la pompe et l'électrovanne y'aura pas grand chose en puissance.
Par contre tes codes, j'ai rien compris, on doit pas être sur la même planète
Message édité par
OrOoX
le lundi 01 janvier 2018 à 21:03:19
Sk_rmouche
Apprenti Aigri
Messages : 17926
lundi 01 janvier 2018 à 21:29:50
Ca c'est sûr ...
kissagogo27
Méchant Vieux Râleur
Messages : 28148
lundi 01 janvier 2018 à 22:08:02
sinon ya des bases
et chez les arduinistes 100% de bites là dedans
http://forums.futura-sciences.com/electron...er-demande.html
et je retrouve pas sur le déparasitage, c'est ballot
OrOoX
AFK ? Késako ? :D
Messages : 9889
lundi 01 janvier 2018 à 22:21:47
Sk' qui vient juste pour troller ... Tu joue au clone de Kissa où quoi ?
Trop de lecture Kissa haha
Edit : Je viens de regarder l'exemple officiel pour le Debounce, en fait j'en ai fait un involontairement, l'exemple inclus une fonction
de temporisation de 50ms, étant donné que dans mon cas je bloque le script pendant 500ms, ça empêche tout changement de ce type.
Message édité par
OrOoX
le lundi 01 janvier 2018 à 22:32:07
OrOoX
AFK ? Késako ? :D
Messages : 9889
samedi 06 janvier 2018 à 21:58:39
Bon bah je me suis occupé de la tcherno-pompe, mais j'ai des fuites, j'avais oublié que les raccords brico étaient mal
foutus au niveau du filetage, beaucoup trop de jeu ... ( du moins les raccords femelle )
Bon, ça fait un peu peur et usine à gaz, mais ça fonctionne
SPOILER :
Du coup j'ai passé le tube de niveau et branché la carte dessus, j'ai commencé à vider le puits pour avoir le delta mais
pas eu le temps de finir, par contre j'ai un gros problème de stabilité, ça lis jamais la même chose
J'avais fait une vidéo mais le tel l'a encore corrompue, va falloir que je change d'appli ...
Message édité par
OrOoX
le samedi 06 janvier 2018 à 22:04:31
kissagogo27
Méchant Vieux Râleur
Messages : 28148
samedi 06 janvier 2018 à 22:05:22
surement un pb de base de temps / parasite / OrOox
OrOoX
AFK ? Késako ? :D
Messages : 9889
samedi 06 janvier 2018 à 22:07:16
Je dirais plutôt un problème d'alimentation, le LCD + le capteur sont alimentés par la carte elle même et donc par le régulateur
de tension intégré, faudrait que je sépare tout pour voir et idéalement trouver une bonne alim.
OrOoX
AFK ? Késako ? :D
Messages : 9889
dimanche 07 janvier 2018 à 18:16:35
Du coup la suite, j'ai vidé le puits et à mon grand étonnement la valeur n'a pas changé plus que ça donc est-ce que
ça fonctionne vraiment avec le capteur absolue, c'est à confirmer avec l'alim ATX.
Avec la sonde de débranchée je suis dans les 1215mBars et c'est très stable, alors qu'avec la sonde branchée ce n'est
pas stable, pompe en marche ou non, vraiment bizarre ...
Du coup j'ai refais une vidéo, attention aux oreilles ^^'
https://www.youtube.com/watch?v=5GAQN9DLpbY
Biduleohm
Membre
Messages : 906
dimanche 07 janvier 2018 à 18:46:38
Oui ça marche, c'est ton câblage et/ou ton code le pb, pas la gravité...
OrOoX
AFK ? Késako ? :D
Messages : 9889
dimanche 07 janvier 2018 à 19:02:56
Bah le câblage c'est le même avec tuyau branché ou non donc pourquoi des variations aussi importante c'est ça que je ne
comprend pas ... Dès que je débranche le tuyau ça s'actualise direct et devient stable.
La variable que j'ignore c'est si le puits était plein ou non, mais vu la quantité de pluie ces derniers jour ça serait étonnant que non.
kissagogo27
Méchant Vieux Râleur
Messages : 28148
dimanche 07 janvier 2018 à 20:11:12
tu peux simuler la pression ou dépression avec une poire /ballon/seringue et mano ..
ensuite la pompe ben ça pompe donc ...
OrOoX
AFK ? Késako ? :D
Messages : 9889
dimanche 07 janvier 2018 à 20:43:05
Simuler n'est pas le problème, j'ai déjà fait plein d'essais au moment de la prog et j'avais pas ces soucis, et là ce
n'est pas un problème de pompe, rien n'est relié aux pressostats et autres, et l'aspiration ne cause pas le problème
d'instabilité vu que même à l'arrêt j'ai le problème.
J'ai pensé à un truc mais ça serait vraiment improbable, j'ai une goutière de relié au puits, c'est pas possible que ça fasse
jouer autant avec la force du vent nan ?
kissagogo27
Méchant Vieux Râleur
Messages : 28148
dimanche 07 janvier 2018 à 21:02:47
ben ça devrait bouger juste avec le vent alors ...
Biduleohm
Membre
Messages : 906
dimanche 07 janvier 2018 à 21:20:33
Combien sur combien la variation ?
OrOoX
AFK ? Késako ? :D
Messages : 9889
dimanche 07 janvier 2018 à 21:53:59
de 10 à 150 en moyenne, à certain moment je passais direct de 1215 à 1100 et vis versa
Biduleohm
Membre
Messages : 906
dimanche 07 janvier 2018 à 22:37:41
Heureusement que j'ai demandé sur combien...
Bon, ça représente quel pourcentage ?
OrOoX
AFK ? Késako ? :D
Messages : 9889
dimanche 07 janvier 2018 à 22:47:37
C'est quelle plage que tu veux savoir, celle du capteur où la différence réel que j'ai eu du début à la fin ?
kissagogo27
Méchant Vieux Râleur
Messages : 28148
dimanche 07 janvier 2018 à 22:53:14
on te demande la valeur stab et les variations en % autour
tu devrais faire un graphique ..
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.022 secondes