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 :

Détecter un courant


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2023
    Messages : 4
    Par défaut Détecter un courant
    Bonjour à tous !

    J'aimerais savoir si c'est possible ou si on doit avoir un appareil externe pour détecter un courant.

    Mon but est d'allumer des lumières 220v.
    Pour cela j'ai eu l'idée d'utiliser un relais ... Pour allumer le relais j'aimerais détecter un courant électrique. (le flash du portail).

    Tout bêtement j'ai eu l'idée que dès qu'il y à une impulsion je stock dans une variable millis() + le temps que je veux que ça reste allumer.

    Je possède une variable qui détecter si c'est allumer ou éteins, si c'est éteins et que le temps est supérieur au temps actuel ça activer le relais, si le temps est inférieur et que c'est allumer ça éteins le relais.

    Code : 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
    const int pinRelais = 2; // Le pin sur lequel j'actice mon relais
    const int pinFlash  = 3; // Le pin sur lequel je reçois le flash
    unsigned long calculTemps = 0;
    unsigned long tempsAllumage = 300000; // Temps d'allumage 300 000s = 5mins
    byte onOff = 0;
     
    void setup() { // On écoute les pins ...
      pinMode(pinRelais, OUTPUT);
      pinMode(pinFlash, INPUT_PULLUP);
    }
     
    void loop() { // Notre boucle ...
      byte getFlash = digitalRead(pinFlash); // 1 = éteins (low) 0 = allumé (high)
      if (getFlash == 0) calculTemps = millis() + tempsAllumage;
     
      if ((calculTemps > millis()) && (onOff == 0)) {
        digitalWrite(pinRelais, HIGH);
        onOff = 1;
      } else if ((calculTemps < millis()) && (onOff == 1)) {
        digitalWrite(pinRelais, LOW);
        onOff = 0;
      }
    }



    Je possède une carte Arduino Mega et une Freenove (équivalent à la Uno).

    Edit:

    Je faisais des tests et j'avais un truc qui fonctionne sur l'Arduino et pas la Freenove (d'où le faite que je pensais que c'était pas la bonne méthode).

    Et en effet la bonne méthode c'était d'envoyer le GND sur l'input directement.
    Je vais prendre plus d'informations sur le fonctionnement électronique et sur le fonctionnement de la carte je penses !
    Cela fait des jours que j'étais dessus et je viens de le remarquer juste après avoir posté ....

  2. #2
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 624
    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 624
    Par défaut
    Bonjour,

    Je ne pourrai répondre aux différences de comportement car je ne connais pas l'autre carte.

    En revanche, contrairement aux apparences, cela ne marche pas correctement.

    En effet, M = A + B n'est pas nécessairement supérieur à A avec des entiers non signés. Prenons un byte (uint8_t) pour éviter les grandes valeurs. Si A vaut 248 et B 30 alors A + B = M = 22. Heureusement la différence ne pose pas ce problème.
    Le dysfonctionnement n'apparaîtra que vers 49,71 jours (nombre de ms de l'ordre de 2^32). Cette limitation n'est donc pas dommageable si le montage ne doit pas fonctionner en permanence.

    Je ne suis pas sûr d'avoir bien compris l'objectif : un coup de flash change l'état au bout de 5 mn. Attention si un deuxième coup de flash arrive avant la fin de 5 mn, le temps est simplement prolongé de 5 mn (il n' y a pas annulation de l'ordre précédent).

    Si le programme ne fait que cela, il pourrait singulièrement être simplifié en recourant à delay() (mais sans cumul des temps).

    Mais en l'état, on peut écrire (code non testé):
    Code : 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
    const int      pinRelais    = 2;                 // La broche d'activation du relais
    const int      pinFlash     = 3;                 // La broche recevant l'état du flash (durée ?)
    uint32_t       T            = 0;
    const uint32_t dT           = 300000;            // Temps d'allumage 300 000 s = 5 mn
    bool           isOn         = false;
     
    void setup() { // On écoute les pins ...
       pinMode(pinRelais, OUTPUT);
       pinMode(pinFlash, INPUT_PULLUP);
    }
     
    void loop() { 
       uint32_t Tnew = millis();
       if(digitalRead(pinFlash)) == 0) T = Tnew;     // 1 => éteins (low) 0 => allumé (high)
       bool isOn_new = isOn = Tnew - T >= dT;        // Pas de pb avec la différence !
       if(isOn != isOn_new) {
          isOn =  isOn_new;
          digitalWrite(pinRelais, isOn);             // ou digitalWrite(pinRelais, isOn ? HIGH : LOW);
       }
    }
    Salutations

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2023
    Messages : 4
    Par défaut
    Salut ! Merci pour la réponse je n'ai pas tout compris ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    byte getFlash = digitalRead(pinFlash); // 1 = éteins (low) 0 = allumé (high)
    if (getFlash == 0) calculTemps = millis() + tempsAllumage;
    Mon code ne rajoute pas 5 minutes à chaque flash, il rajoute 5 minutes au temps actuel, donc si le flash clignote 10 fois, ça active le relais du premier flash jusqu'à 5 minutes après le dernier flash.
    Je n'ai que le flash qui me permet de récupérer les informations d'entrées sorties, car les autres sont des entrées pour y connecter autre chose comme un bouton pour ouvrir / fermer le portail etc.
    Donc aucune info de sortie, que d'entrées.

    Par contre le millis() dès qu'il atteint son maximum + 5 minutes ça va en effet créer un petit soucis
    Je vois que tu l'as réutiliser dans un unsigned donc je supposes par logique que ça doit repartir à 0 à son maximum.

    J'ai eu du mal à comprendre au premier regarde n'ayant pas l'habitude de compresser autant et c'est vrais que le code compressé à son maximum ça à de la gueule

    Merci pour la rectification sur du long terme ça aurait bien moins fonctionné !

    Toutes façons je crois avoir grillé la carte, j'ai cru avoir lu que Arduino géré jusqu'à 12 volt mais malheureusement les pins gèrent maximum 5v, j'ai envoyé du 9v dans un pin.
    Je vais tester la carte ce soir voir si elle continue à fonctionner, si c'est qu'une partie ou la carte qui est HS ...

    Le flash est en 12v, si j'ai bien compris je dois laisser le + brancher sur le portail et le - sur l'input de l'arduino avec un petit réduction de tension 12v to 5v.

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 624
    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 624
    Par défaut
    Bonjour,
    Il y a une erreur dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // bool isOn_new = isOn = Tnew - T >= dT;  // Remplacer par la ligne suivante
    bool isOn_new = Tnew - T >= dT;            // Pas de pb avec la différence !
    Un copier-coller malencontreux et une relecture insuffisante

    Une entrée soumise à 9 Volts sans limitation (résistance notamment) :

    Salutatiosn.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2023
    Messages : 4
    Par défaut
    Ça m'a un peu étonné mais je n'avais pas plus fait attention que ça, car je fais jamais de façon compressé donc je me suis dis que je ne connaissais pas cette façon.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2023
    Messages : 4
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Bonjour,
    Il y a une erreur dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // bool isOn_new = isOn = Tnew - T >= dT;  // Remplacer par la ligne suivante
    bool isOn_new = Tnew - T >= dT;            // Pas de pb avec la différence !
    Un copier-coller malencontreux et une relecture insuffisante

    Une entrée soumise à 9 Volts sans limitation (résistance notamment) :

    Salutatiosn.
    Salut,

    J'ai aujourd'hui tester j'ai bien ma carte Freenove HS (impossible d'actualiser le code, les broches éteintes restent éteintes celles allumées restent allumées).
    J'ai sortie ma carte Arduino Mega, j'ai utilisé un régulateur 7805 en reliant le + du 12v à gauche, les 2 - au centre et la sortie + 5v à droite.
    Après test j'ai bien 5v en sortie, j'ai pu tester en réel le script et ... Rien ne fonctionne ...
    Déjà je me suis gouré sur l'allumé/éteins ! Mais en relisant de plus près ça fonctionnait pas comme je le voulais, avec le calcul du délais ça faisait pas du tout ce que je voulais.

    Je voulais qu'au premier flash ça m'active le relais, à chaque flash le compteur repart à 0 sur le temps que j'ai mis (j'avais mis 300000ms) donc si le flash clignote 10 fois en 20, je veux que la lumière s'allume au premier flash et s'arrête 5 minutes après le dernier donc ça reste 5min et 20s allumé.

    Par contre en prenant en compte le soucis de millis() qui peut en effet dépassé via mon ancienne méthode (je ne sais toujours pas si je peux le laisser 49j allumer ..)

    Code : 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
    const int pinRelais = 2; // La broche d'activation du relais
    const int pinFlash = 3; // La broche recevant l'état du flash
    unsigned long ancienTemps = 0; // Pour noter le temps
    const unsigned long dT = 300000; // Temps d'allumage 300 000 s = 5 mn
    bool isOn = false;
     
    void setup() { // On écoute les broche ...
      pinMode(pinRelais, OUTPUT);
      pinMode(pinFlash, INPUT_PULLUP);
    }
     
    void loop() { 
      if(digitalRead(pinFlash) == 1) { // Si il y à un flash
        ancienTemps = millis(); // On note les millis
        isOn = true; // On se met en on
        digitalWrite(pinRelais, isOn); // On active le relais
      }
     
      if (isOn && millis() - ancienTemps > dT) { // Si on est en route et qu'on à dépassé le temps
        isOn = false; // On se met en off
        digitalWrite(pinRelais, isOn); // On désactive le relais
      }
    }

  7. #7
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 624
    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 624
    Par défaut
    Bonjour,

    Le câblage serait utile pour vérifier que le code est bien en cohérence.

    Si des sorties sont dans des états différents, cela incite à penser que le circuit n'est pas mort. Il faut faire attention aux broches en entrées qui présentent une impédance très élevée. A défaut de charge un multimètre donnera une valeur assez aléatoire.

    Salutations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détecter Windows 2000 Professionnel
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/11/2006, 23h02
  2. Exécuter la classe courante ??
    Par sami_c dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 17/03/2003, 17h47
  3. Réponses: 2
    Dernier message: 12/02/2003, 15h26
  4. repertoire courant
    Par mobee dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 11/12/2002, 13h03
  5. [VB6] [Système] Tuer un processus courant
    Par mdoyer dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 22/10/2002, 14h47

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