IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

cherche aide pour projet arduino


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2022
    Messages : 3
    Par défaut cherche aide pour projet arduino
    Bonjour tout le monde

    je viens poster mon message ici afin de trouver de l'aide pour un problème auquel je voudrais remédier peut être avec un module arduino ?
    je suis totalement débutant dans ce domaine et donc.....

    Voilà un petit descriptif :

    je souhaiterais remplacer sur un montage existant commandant une électro vanne la partie commande qui se fait a ce jour par relais temporisé et dont la précision n'est pas satisfaisante (précision de l'ordre de la seconde).
    - Le but est de faire coller un relais pendant un temps ajustable avec plus de précision (env. 1/10s)
    - je voudrais avoir un réglage de consigne du temps de fonctionnement par potentiomètre par exemple
    - avoir un affichage de cette consigne sur un afficheur lcd i2c (car j'ai ceci en stock) mais un std peut aussi convenir sans pb
    - avoir un bouton poussoir pour lancer le cycle de tempo
    - eventuellement un autre bp pour réaliser une RAZ du temps si besoin
    - lordre de grandeur de mon temps de fonctionnement sera grosso modo de 5s mini à 10s maxi
    la valeur affiché de la consigne pourrait être des 1/10 de seconde ou autre valeur numérique (par exemple 1000) mais en modifiant cette valeur en +/- je voudrais avoir une conséquence sur la durée de fonctionnement du relais avec bien plus de précision.
    je me moque de l'unité affiché le tout c'est d'avoir des pas réglables en relation avec un temps de fonctionnement.

    j'avais trouvé ce montage que j'ai testé et un minimum adapté mais la précision n'est pas encore satisfaisante.....(1s)

    https://robojax.com/learn/arduino/?v...elay_timer_1.1

    peut être est il possible de modifier/adapter le topo pour arriver au but ?

    Merci par avance de vos avis !
    Cordialement

  2. #2
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 629
    Par défaut
    Bonjour,

    Quand on regarde l'exemple :
    • il y a beaucoup trop d'affichages pour espérer avoir 1/10 s de précision. Rien qu'avec les Serial il y a plus de 1/30 s de perdu. Les affichages LCD n'améliorent pas le bilan. Ne faire un affichage qu'une ou 2 fois par seconde pour les suivi suffit. Répéter l'affichage des consignes n'a aucun intérêt
    • remenTime est en secondes [C]millis() / 1000;[/] donc le réglage est à la seconde pas au 1/10 s
    • multiplier les divisions est très coûteux (le MCU n'a pas de division) pourquoi ne pas travailler en ms ?
    • pourquoi lire et relire le potentiomètre ? Une seule fois lors du start suffit

    Salutations

  3. #3
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 629
    Par défaut
    Bonjour,

    J'ai repris le code exemple mais vu le degré de refonte, il est réécrit.

    J'attire l'attention sur le fait qu'il n'est pas testé. Il y a donc certainement des scories.

    Il est suffisamment court pour ne pas être trop difficile à lire (et éventuellement corriger).
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2);              // 2 lignes de 16 caractères à l'addresse 0x27
     
    #define pinPot    A0                             // broche du potentiomètre
    #define pinRelay  8                              // broche du relay is connected
    #define pinReset  3                              // broche du reset (interruption)
    #define pinStart  2                              // broche du start
     
    int               btnStartLast  = 1;             // Dernier état du bouton Start
    volatile uint32_t dT            = 0;             // Durée programmée d'activation du relais
    const uint32_t    dTmin         = 2000;          // Temp d'activalion minimal (ms)
    uint32_t          T_start;                       // Temps du début d'activalion (ms)
    uint32_t          T_display;                     // Temps (ms) du dernier affichage
    const uint32_t    dT_display    = 500;           // Attente (ms) entre 2 affichages
    bool              RelayOn       = true;          // Relais inactivé par loop au début
    const bool        RelayOn_Level = true;          // false pour inverser la commande relais
    char              Txt[17]       = "";            // Tampon de 16 caractères + /0 terminal
     
    // Interruption de Reset___________________________________________________________________________
    void IntReset() {
       dT = 0;                                       // Ailleurs, dT devrait être copié en section 
    }                                                // critique mais cela n'a pas d'importance ici
     
    // Setup___________________________________________________________________________________________
    void setup() {
       pinMode(pinRelay, OUTPUT);                    // pinRelay est une sortie
       pinMode(pinReset, INPUT_PULLUP);              // pinReset est une entrée avec pullup
       pinMode(pinStart, INPUT_PULLUP);              // pinStart est une entrée avec pullup
       digitalWrite(pinRelay, !RelayOn_Level);
       Serial.begin(9600);                           // initialiser la liaison série à 9600 Bauds
       lcd.begin();                                  // initialiser l'afficheur LCD
       lcd.backlight();                              // Eclairage du fond d'affichage
       lcd.clear();
       attachInterrupt(digitalPinToInterrupt(pinReset), IntReset, FALLING);
       T_start    = millis(); 
       T_display  = T_start;
       dT_display = 500;
    }
     
    // Loop____________________________________________________________________________________________
    void loop() {
       uint32_t T = millis();
       if(RelayOn) {
          if(T - T_start >= dT) {                    // Fin ? .........................................
             digitalWrite(pinRelay, !RelayOn_Level);
             RelayOn = false;                        // Relais OFF
             lcd.setCursor(0, 1); 
             lcd.print(F("Relais OFF      "));
             Serial.println("Relais OFF");  
          }
          else {
             if(T - T_display >= dT_display) {       // Affichage ? ...................................
                uint32_t T2Off = dT - (T - T_start); // Temps restant en ms
                sprintf(Txt,"Reste %6d ms ", T2Off); // "Reste xxxxxx ms " soit 16 caractères
                lcd.setCursor(0, 1); 
                lcd.print(Txt);
                Serial.print(Txt);
                T_display = T;
             }
          }
       }
       else {
          int btnStart = digitalRead(pinStart);      // Nouvel état du bouton Start
          if(btnStart < btnStartLast) {              // Début ? .......................................
             btnStartLast = btnStart;
             delay(10);                              // Antirebond nécessaire
             dT =  analogRead(pinPot)*100;           // Durée d'activation en ms (0 à 102 300 ms)
             if(dT < dTmin) dT = dTmin;
             uint32_t dT_sec = dT / 1000;            // En s  (0 à 102)
             sprintf(Txt,"Duree %3d.%3d s ", dT_sec, dT - 1000*dT_sec);
             lcd.setCursor(0, 0); 
             lcd.print(Txt);
             Serial.print(Txt);
             T_display = T - dT_display;             // Pour forcer l'affichage au loop suivant
             RelayOn   = true;
             T_start   = millis();
             digitalWrite(pinRelay, RelayOn_Level);
          }
       }
    }
    Quelques remarques :
    • Le relais est off mais est déclaré on (RelayOn = true). Avec un dT (ex duration) = 0, dès la première occurrence de loop() il détectera une fin et affichera donc "Relais OfFF". C'est juste pour limiter le code
    • L'inversion du mode de fonctionnement du relais passe seulement par une constante (RelayOn_Level) sans nécessiter quelque test que ce soit.
    • Les affichages ne sont actualisés que toutes les demi secondes. Cela peut être modifié en changeant la valeur en ms de dT_display.
    • Le démarrage ne se fait pas sur état mais sur front descendant. Si on préfère qu'il est lieu à la remontée du bouton il suffit d'inverser la comparaison.
    • La lecture de dT devrait être en section critique car ce n'est pas une opération atomique. Mais ici cela ne jouera au pire que sur un tour de boucle loop() supplémentaire lors d'un reset.

    Salutations

Discussions similaires

  1. Besoin d'aide pour programme Arduino ( projet étudiant )
    Par ArmandGuitton dans le forum Arduino
    Réponses: 4
    Dernier message: 04/06/2021, 21h54
  2. besoin d'aide pour projet arduino
    Par arduinoguy123 dans le forum C++
    Réponses: 1
    Dernier message: 21/04/2017, 15h40
  3. Aide pour projet : schéma & SGBD
    Par Grubshka dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 11/04/2005, 16h50
  4. Debutant en C cherche aide pour fonctions!!!!
    Par benji17c dans le forum C
    Réponses: 5
    Dernier message: 30/09/2003, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo