probleme code arduino

essai d'un bouton pour ma uselessbox

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour!

Voilà j’ai essayé de faire une uselessbox en suivant un tuto et en récupérant un bout de code que vous trouverez ICI et le montage ici (sauf que j’ai branché sur le pin 3, et changé la partie du code correspondante) Seulement le montage ne cesse jamais, que je clique ou pas sur le bouton…

Donc j’ai voulu essayer de faire un programme pour voir comment mon bouton fonctionnait (je me demande si il n’y a pas un condensateur qui fait que bien que le bouton soit sur off, il puisse y avoir encore du courant un peu après son extinction). Donc mon idée est de mesurer le temps entre un ON/OFF, pour voir si par exemple il met systématiquement au moins 1sec que le condo se décharge. J’ai fait le code suivant :

int pin=3; //pin 3 comme entrée
int niveau=1; // initialise la séquence sur 1
int val=0;
int tempsAncien = 1;
int tempsNouveau =1;
int tempsTotal = 0;
void setup() {

  
pinMode(pin, INPUT);
Serial.begin(9600);
Serial.println("go  ");

}

void loop() {

val=digitalRead(pin);
if (niveau == 1 && val == HIGH) // si je suis a l'etape 1 et que le pin 3 est HIGH
{
  tempsAncien = millis();
  niveau = 2 ; // passe a l'étape 2
}
else if( niveau == 2 && val == LOW) // si je suis a l'étape 2 et que le pin 3 est LOW
{
  tempsNouveau = millis();
  tempsTotal = tempsNouveau-tempsAncien;
  Serial.println(tempsTotal); // affiche le temps entre le passage haut et bas du pin 3
  niveau = 1; // retourne a l'etape 1
}
else {
  //sinon ne rien faire
}
}

Seulement quand je lance le programme, il m’affiche un temps à chaque clic sur le bouton, que je switch du + au - ou inversement. Et de plus si je manipule l’arduino, les chiffres se mettent à défiler comme si il avait plein de +/- -/+ en permanence. Pourtant j’ai vérifier, je n’ai pas l’impression d’avoir de faux contact. Peut-être mon code est-il mauvais?

+0 -0

Ce temps correspond certainement à la charge du condensateur et les +/- -/+ viennent du fait que quand tu bouges l’Arduino, les fils bougent et se déconnectent temporairement pour se reconnecter immédiatement après.

Par contre, il y a quelques choses à revoir.

  • La majorité de tes variables pourraient être locales (sauf pin, niveau et tempsAncien).
  • Il n’y a pas besoin de else s’il ne contient rien.
  • Tu passes par énormément de variables pour des calculs simples. Aussi, tu n’as pas besoin de tempsNouveau ou de tempsTotal.
  • A priori, ton bouton ne change pas de pin pendant l’exécution du programme. pin peut être déclaré const.

Bonne chance pour la suite ;)

+1 -0

Je pense qu’il peut y avoir un problème de rebond dans le switch.

Ajoute un Serial.println("switch +"); dans la première condition et un Serial.println("switch -"); dans la deuxième, et regarde si tu obtiens exactement un message à chaque switch.

Si tu en as plus d’un, c’est un problème de rebond. Dans ce cas, ajoute delay(50); à la fin de la fonction loop pour voir si ça change quelque chose.

Pour la manipulation de l’arduino, c’est pour moi un mauvais contact.

Est-ce que tu obtiens la même chose en bougeant l’arduino avec le switch sur + qu’en le bougeant avec le switch sur - ? Ça pourrait aider à trouver le mauvais contact.

+0 -0
Auteur du sujet

ok j’ai fait les modifications et voici le résultat :

go  
switch +
switch -
1147
switch +
switch -
2165
switch +
switch -
1435
switch +
switch -
4437

Voici le code modifié :

const int pin=3; //pin 3 comme entrée
int niveau=1; // initialise la séquence sur 1
int tempsAncien = 1;
void setup() {

  
pinMode(pin, INPUT);
Serial.begin(9600);
Serial.println("go  ");

}

void loop() {

int val=digitalRead(pin);
if (niveau == 1 && val == HIGH) // si je suis a l'etape 1 et que le pin 3 est HIGH
{
  Serial.println("switch +");
  tempsAncien = millis();
  niveau = 2 ; // passe a l'étape 2
}
else if( niveau == 2 && val == LOW) // si je suis a l'étape 2 et que le pin 3 est LOW
{
  Serial.println("switch -");
  Serial.println(millis()-tempsAncien); // affiche le temps entre le passage haut et bas du pin 3
  niveau = 1; // retourne a l'etape 1
  delay (500);
}
}

ça ne se voit pas sur le résultat mais en gros, quand je switch le bouton, que ce soit du + vers le - ou l’inverse il fait toujour :

switch+
switch- //lors du changement
4225 //(exemple de temps)
switch+ //juste après bien que je n'ai pas ré-appuyé sur le bouton

D’ailleur au bout d’un moment il fait n’importe quoi avec le temps, je lui ai fait afficher le nouveau et l’ancien temps, je me suis retrouvé avec des tempsAncien négatifs…

J’ai également essayé de changer la valeur du delay() et ça n’a rien changé. Je vais essayer de changer de bouton, voir si ça peut venir de ça (bon pour les temps négatifs, c’est surement le code). Je vous tiens au courant!

Édité par Rémi

+0 -0

Je pense que c’est assez important d’avoir un code bien présenté.

const int pin=3;    // pin 3 comme entrée
int niveau=1;       // initialise la séquence sur 1
int tempsAncien;

void setup() {
  pinMode(pin, INPUT);
  Serial.begin(9600);
  Serial.println("go  ");
}

void loop() {
  int val=digitalRead(pin);

  if (niveau == 1 && val == HIGH)          // si je suis a l'etape 1 et que le pin est HIGH
  {
    Serial.println("switch +");
    tempsAncien = millis();

    niveau = 2 ; // passe a l'étape 2
  }
  else if( niveau == 2 && val == LOW)      // si je suis a l'étape 2 et que le pin est LOW
  {
    Serial.println("switch -");
    Serial.println(millis()-tempsAncien);  // affiche le temps entre le passage haut et bas du pin 3

    niveau = 1;                            // retourne a l'etape 1
    delay (500);
  }
}

Concernant le code, pas de problème. Par-contre, le pin 3 est un pin analogique. En tout cas, c’est ce qui est écrit sur mon Arduino. Or là tu t’en sers comme un pin numérique. Utilise un autre pin ^^

ache.one                 🦹         👾                                🦊

+1 -0

@ache Le pin 3 est bien digital, c’est le A3 qui analogique, et il correspond au numéro 17 (il y a un #define A3 17 dans un fichier source, mais je ne sais plus lequel… :) ).

@Rémi Pour le delay(50);, quand je disais à la fin de la fonction loop, je voulais dire en dehors du else, car là il ne gère les rebonds que quand on switch vers le -, alors que les rebonds sont plus problématique quand on switch vers le +;

J’ai fais le montage de mon coté pour étudier un peu ce problème de rebonds et j’ai modifié le programme pour mieux les voir.

const int pin=3;
int niveau=1;
int numero = 0;
unsigned long tempsAncien;

void setup() {
  pinMode(pin, INPUT);
  Serial.begin(9600);
  while (!Serial) {}// attend que le port serie soit pret
  Serial.println("go  ");
  tempsAncien = millis();
}

void loop() {
  int val=digitalRead(pin);

  if (niveau == 1 && val == HIGH)          // si je suis a l'etape 1 et que le pin est HIGH
  {
    numero++;
    Serial.println("+ switch numero: " + String(numero));
    Serial.println(millis() - tempsAncien);
    Serial.println(); // une ligne blanche
    tempsAncien = millis();

    niveau = 2 ; // passe a l'étape 2
  }
  else if( niveau == 2 && val == LOW)      // si je suis a l'étape 2 et que le pin est LOW
  {
    numero++;
    Serial.println("- switch numero: " + String(numero));
    Serial.println(millis() - tempsAncien);
    Serial.println(); // une ligne blanche
    tempsAncien = millis();

    niveau = 1;                            // retourne a l'etape 1
  }
  //delay(50);
}

Le code indique si on switch vers le + ou le -, et le temps écoulé depuis le dernier switch. J’obtiens ceci:

go  
+ switch numero: 1
0

- switch numero: 2
3603

+ switch numero: 3
1549

- switch numero: 4
0

+ switch numero: 5
8

Le n°0 correspond au démarrage, les n°2 et 3 sont des switch valides (j’ai actionné le bouton). Par contre les n° 4 et 5 correspondent à des rebonds. Le contact se crée puis disparaît presque aussitôt (0 ms) avant de revenir 8 ms plus tard.

Le delay(50); permet de régler le problème en évitant de faire des mesures pendant les rebonds. N’hésite pas à essayer ce code avec ton bouton, d’abord sans puis avec le delay(50);.

Pour terminer j’ai modifié le type de tempsAncien, car la valeur max d’un int c’est 32767, donc après 32.7 secondes tu as un dépassement de capacité, ce qui fausse les calculs. millis() retourne un unsigned long qui va jusqu’à 4294967295, qui en millisecondes équivaut à environ 50 jours, donc là on est bon.

Édité par Anton62

+1 -0
Auteur du sujet

Nickel, Merci pour tout vos conseils, c’est super d’avoir pris le temps! :) Cette fois je n’ai plus les rebonds :

go  
+ switch numero: 1
0

- switch numero: 2
2056

+ switch numero: 3
1337

- switch numero: 4
1216

+ switch numero: 5
1754

J’ai aussi eu l’occasion de discuter avec un gars hyper calé au fablab de Besançon qui m’a conseillé d’utiliser la fonction PULLUP lors de l’initialisation du pin. De ce que j’ai compris ça permet d’activer une résistance sur le pin d’entrée et ça évite d’avoir à en mettre une sur le circuit. J’ai refait un schéma du montage de la uselessbox du coup : (j’espère que c’est compréhensible c’est mon premier). montage UselessBOX arduino nano

+0 -0

Ce temps correspond certainement à la charge du condensateur et les +/- -/+ viennent du fait que quand tu bouges l’Arduino, les fils bougent et se déconnectent temporairement pour se reconnecter immédiatement après. Pnr StatusVPN Par contre, il y a quelques choses à revoir.

  • A priori, ton bouton ne change pas de pin pendant l’exécution du programme. pin peut être déclaré const.

Bonne chance pour la suite ;)

Merci Pour de l’aide

Édité par ibrahimoviczlatan205

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte