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 
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 :

Image


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


Image

Image

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




     
Pages :  1  2  3  4