Auteur Sujet: faire du comptage  (Lu 31393 fois)

dudule

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
faire du comptage
« le: février 06, 2016, 04:18:56 pm »
bonjour à tous
voilà je cherche comment faire pour que le comptage d'un certains nombre d'impulsions sur une entrée me mette une sortie à 1 puis passé le nombre d'impulsion défini , la sortie repasse à 0
se faire aider pour avancer et avancer pour pouvoir aider

DDEFF

  • Hero Member
  • *****
  • Messages: 760
    • Voir le profil
Re : faire du comptage
« Réponse #1 le: février 07, 2016, 09:10:11 am »
Bonjour dudule,
Je te propose de voir ce lien :
https://www.arduino.cc/en/Tutorial/StateChangeDetection.
Après, tu fais un test pour voir si le compteur a atteint le seuil que tu as choisi. ;)

Ceci dit, je suis curieux : tu comptes quoi ? Des wagons ? ???
"Ce n'est pas le puits qui est trop profond, c'est ta corde qui est trop courte" (proverbe chinois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1713
    • Voir le profil
Re : faire du comptage
« Réponse #2 le: février 07, 2016, 09:25:16 am »
Bonjour,

Je crois me rappeler que dudule n'est pas très langue de Shakespeare

On peut faire ça très simplement avec des interruptions externes. Voir http://www.locoduino.org/spip.php?article64 et notamment l'exemple à la fin qui compte des ILS
Cordialement

dudule

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : faire du comptage
« Réponse #3 le: février 07, 2016, 09:44:25 am »
bonjour
 merci DDEFF et Jean-Luc .
juste pour compter le nombre de fois que  ma loco se trouve à un endroit précis sur le réseau .
effectivement je ne suis pas vraiment en amour avec la langue de( chat qui expire  :D) mais bon comme dit Christian  (le prof) on peu s'y mettre .
dans tous les cas c'est super je vais pouvoir tester mon idée (enfin quand j'aurais reçu ma nouvelle carte Arduino ( manipulations funestes obligent)
se faire aider pour avancer et avancer pour pouvoir aider

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1713
    • Voir le profil
Re : faire du comptage
« Réponse #4 le: février 07, 2016, 09:55:47 am »
Comment l'as tu cassée ?
Cordialement

dudule

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : faire du comptage
« Réponse #5 le: février 07, 2016, 12:31:10 pm »
comme un Âne que je suis ! 12v sur une entrée
mais bon en recommandent un module uno j'ai aussi commander  un 328 PU P des fois que la platine arduino n'ai rien ( on peu rêver  :-[ ) j'en profite pour faire voir ce que j'essais de faire pour que quand je compte deux passages de la loco sur un capteur appelé loco la led s'allume . mais bon ce n'est pas gagné .

const int loco=2;
# define led 4

int locoPushCounter = 0;
int locoState = 0;
int lastlocoState= 0;

void setup() {
 // affectation des pins , entrée/sortie
 pinMode ( loco, INPUT);
 pinMode (led , OUTPUT);
 
}

void loop() {
  locoState= digitalRead (loco);
  if ( locoState ! = last locoState) {
  if (locoState == HIGH)
    locoPushCounter ++;}
    delay (30);
    lastlocoState= locoState ;
  if (locoPushCounter % 2==0){
     digitalWrite (led , HIGH);
}
  else {
    digitalWrite ( led LOW);
}
}
se faire aider pour avancer et avancer pour pouvoir aider

DDEFF

  • Hero Member
  • *****
  • Messages: 760
    • Voir le profil
Re : faire du comptage
« Réponse #6 le: février 07, 2016, 03:21:51 pm »
Disons que, même si Arduino ignore les blancs, il faut quand même un minimum de règles :
Exemple :
1°) quand tu écris last locostate, et bien, là, il cherche last et ne le trouve pas.
Il faut impérativement mettre lastlocoState, tout collé, puisque c'est cette variable que tu as définie.
2°)   ! =    n'a aucun sens. Par contre !=, lui, a un sens. Il ne faut pas de blanc.

Voilà ce que j'ai modifié. Je suis adepte d'une notation claire, aérée, à base d'accolades bien visibles. ça prend plus de place, c'est sûr.
Dis-moi si ça marche. Au moins, ça compile.
const int loco = 2;
# define led 4
int locoState = 0;
int lastlocoState = 0;
int locoPushCounter = 0;

void setup()
{
    // affectation des pins , entrée/sortie
    pinMode (loco, INPUT);
    pinMode (led, OUTPUT);
}

void loop()
{
    locoState = digitalRead(loco);
    if ( locoState != lastlocoState)
    {
        if (locoState == HIGH)
        {
            locoPushCounter ++;
        }
        delay(30);
        lastlocoState = locoState;
        if (locoPushCounter % 2 == 0)
        {
            digitalWrite (led, HIGH);
        }
        else
        {
            digitalWrite (led, LOW);
        }
    }
}
"Ce n'est pas le puits qui est trop profond, c'est ta corde qui est trop courte" (proverbe chinois)

dudule

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : faire du comptage
« Réponse #7 le: février 07, 2016, 04:47:10 pm »
merci DDEFF
effectivement écrit comme çà il compile j'avais également un problème d'accolades
à l'avenir je vais suivre ton conseil et écrire plus séparé ( reporter les accolades au début de la ligne suivante ) c'est vraiment plus clair  ;)
A+
je devrais pouvoir vérifier en début de semaine la poste m'indique que le colis sera livré lundi je donne des nouvelles dès que les tests sont fait
« Modifié: février 07, 2016, 07:22:01 pm par dudule »
se faire aider pour avancer et avancer pour pouvoir aider

dudule

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : faire du comptage
« Réponse #8 le: février 09, 2016, 10:53:41 am »
bonjour DDEFF
bon le comptage c'est OK .
autre problème je veux que la mise à zéro de deux entrées déclenche la mise à un de plusieurs sorties simultanément ,pour ce faire j'ai écrit cela(voir ci dessous) mais çà ne fonctionne pas ,pourrais tu  me donner ton avis

void loop() {            //au début les 2 aiguilles sur voie 1, les signaux marquent le rouge et les zones d'arrêt sont alimentées
 
 
if
 (( dza1,LOW)&&(dza2,LOW))           //pas de train en gare//
 {
 digitalWrite  ( aigeD,HIGH),(aigsD,HIGH),( SV1r,HIGH ), ( SV2r,HIGH ),(AZAv1,HIGH), ( AZAv2,HIGH);
 delay (100);
 digitalWrite  ( aigeD,LOW),(aigsD,LOW);

                                         
 }
 }
« Modifié: février 09, 2016, 11:18:08 am par dudule »
se faire aider pour avancer et avancer pour pouvoir aider

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 801
    • Voir le profil
Re : faire du comptage
« Réponse #9 le: février 09, 2016, 12:11:16 pm »
Voilà ce même code reformaté et corrigé. Le format est important. Je ne veux pas faire le lourd et ajouter à ce que DDEFF a déjà dit mais.... Si, je vais le faire quand même ! :)
C'est un peu comme une lettre manuscrite: si tu mets toutes les lettres accolées, pas d'espaces ou au milieu des mots, des majuscules n'importe où, des sauts de lignes intempestifs, et une ponctuation hétéroclite,il est fort probable que le destinataire pourra déchiffrer le texte mais il lui faudrait beaucoup de temps et d'efforts, et une partie du fond du message serait sans doute perdue.
Le compilateur C qui est derrière l'IDE ne se préoccupe certes pas des espaces et des sauts de lignes, s'ils ne sont pas au milieu des symboles (voir le 'last' plus haut...), mais celui qui relit, si, parce que le format aide à comprendre la structure du programme et ce qu'à voulu faire l'auteur. Ne pas oublier aussi qu'aujourd'hui tu es cet auteur et que tu comprends aisément ton code, même mal écrit, mais demain tu redeviendras un lecteur qui ne se rappelle plus ce qu'il a fait à l'époque et tentera de redécouvrir le pourquoi du comment de chaque terme du programme...
D'autre part, si tu ne dis pas dans le teste quelle fonction est appelée, ça ne risque pas de marcher.
enfin, une fonction ne peux pas recevoir une liste de liste d'arguments. Il faut l'appeler plusieurs fois.

Mais ne t'inquiètes pas, ça va rentrer ! ;);)


void loop()             //au début les 2 aiguilles sur voie 1, les signaux marquent le rouge et les zones d'arrêt sont alimentées
{
   if (digitalRead(dza1) == LOW && digitalRead(dza2) == LOW)           //pas de train en gare//
   {
      digitalWrite(aigeD, HIGH);
      digitalWrite(aigsD, HIGH);
      digitalWrite(SV1r, HIGH);
      digitalWrite(SV2r, HIGH)
      digitalWrite(AZAv1, HIGH)
      digitalWrite(AZAv2, HIGH);

      delay (100);
      digitalWrite(aigeD, LOW)
      digitalWrite(aigsD, LOW);                                         
    }
 }

dudule

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : faire du comptage
« Réponse #10 le: février 09, 2016, 02:17:07 pm »
bonjour Thierry et merci.
en aucun cas je trouve les intervenants LOURD, bien au contraire. pour ce qui est de rentrer je pense que cela finira bien par rentrer mais bon pour le moment çà s'annonce pas très bien mais je vais persister ,vue que j'ai la chance de pouvoir me faire aider par des gens patients et serviables.
j'ai le livre de C tavernier {ARDUINO maîtrisez sa programmation et ses cartes d'interface} il est bien, mais ce que je recherche c'est plus un livre où l'on trouverait des exemples sur le comment écrire ( comme ce que tu viens de faire  ,qui est un très bon exemple) les différentes équations genre : si cette entrée à 1 et cette autre entrée à 0 ou cette autre entrée à 1 alors on met cette sortie à 1
si toi ou bien un autre forumiste avez des titres  à m'indiquer ce serait bien
A+
se faire aider pour avancer et avancer pour pouvoir aider

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1713
    • Voir le profil
Re : faire du comptage
« Réponse #11 le: février 10, 2016, 08:44:09 am »
Bonjour,

Tu trouveras des exemples de syntaxe dans : http://www.locoduino.org/spip.php?article22
Cordialement

dudule

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : faire du comptage
« Réponse #12 le: février 10, 2016, 10:11:07 am »
merci Jean-Luc  :D
j'y vais tout de suite
se faire aider pour avancer et avancer pour pouvoir aider

dudule

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : faire du comptage
« Réponse #13 le: février 11, 2016, 07:43:31 pm »
bonjour
dans le programme ci dessous je met la sortie 14 ( nommée arbitrairement led)à 1 après détection de trois présences sur l'entrée 2 puis après une temporisation je remet la sortie 14 à 0 même si l"entrée 2 est toujours active . le problème que je rencontre viens du fait que dès que je relâche le capteur de l'entrée 2 j'ai une impulsion qui met la sortie 14 à 1 une fraction de seconde .
auriez vous la solution pour éviter cette impulsion


#define loc 3
#define loco 2
# define led 14
int locoState = 0;
int lastlocoState = 0;
int locoPushCounter = 0;

void setup()
{
    // affectation des pins , entrée/sortie
    pinMode (loco, INPUT);
    pinMode (led, OUTPUT);
    pinMode(loc , INPUT);
}

void loop()
{
    locoState = digitalRead(loco);
    if ( locoState != lastlocoState)
    {
        if (locoState == HIGH)
        {
            locoPushCounter ++;
        }
        delay(50);
       lastlocoState = locoState;
        if (locoPushCounter % 3 == 0)
       {
          digitalWrite (led, HIGH);
        delay( 500);
        digitalWrite (led,LOW);       
         
      }
}
}

se faire aider pour avancer et avancer pour pouvoir aider

DDEFF

  • Hero Member
  • *****
  • Messages: 760
    • Voir le profil
Re : faire du comptage
« Réponse #14 le: février 11, 2016, 07:57:30 pm »
Fâché avec les indentations ... ;)

Le problème de fond, c'est que tu penses compter les états en testant via un digitalRead().
La boucle loop() est très nettement plus rapide que toi (ou que le train) !

Pour tester trois impulsions, il faut tester si elle est à HIGH, puis qu'elle passe à LOW, puis qu'elle repasse à HIGH, puis qu'elle repasse à LOW, puis qu'elle repasse à HIGH, avec la bonne cadence. Et là, il y a bien eu 3 impulsions.

Sinon, tu mesures n'importe quoi.

Regarde comment je gère ça dans mon article (à la fin) : http://www.locoduino.org/spip.php?article151. C'est assez complexe, mais nécessaire.
"Ce n'est pas le puits qui est trop profond, c'est ta corde qui est trop courte" (proverbe chinois)