Interruptions qui se déclenchent toutes seules

Bonjour à tous,

Je découvre Arduino et les premiers problèmes de conception.

J'ai deux séries de 3 LEDs pour représenter deux feux de circulation. J'arrive sans problème à les alterner, avec des DigitalWrite et des délais.
Le soucis, c'est que je souhaite avoir un bouton qui permet de stopper momentanément les feux et de déclencher le son d'un buzzer.

J'ai donc, pour cela, créé une interruption reliée à un bouton pressoir. Mais cette interruption se déclenche toute seule ! >:(

Je simplifie donc le code. J'enlève toutes les leds. Je me concentre que sur l'interruption, le bouton pressoir et le buzzer. Voici une photo de mon montage.

Mon but : activer / désactiver le bip du buzzer quand j'appuie sur mon bouton pressoir.

Et voici mon code :

int buzzer = 6;
int stateBuzzer = LOW;
int nbInterruptions = 0;

volatile unsigned long button_time = 0;
volatile unsigned long last_button_time = 0;
int debounce = 300;

void setup() {
  
  Serial.begin(9600);
  Serial.println("Demarrage du programme"); // debug
  
  pinMode(buzzer, OUTPUT);
  attachInterrupt(0, alarme, RISING);
  
}

void loop() {
  digitalWrite(buzzer, stateBuzzer);
}

void alarme() {
  Serial.print("\nCeci est l'interruption numero "); // debug
  Serial.print(nbInterruptions);
  nbInterruptions++;
  
  button_time = millis();
  if (button_time - last_button_time > debounce)
  {
    stateBuzzer = !stateBuzzer;
    last_button_time = button_time;
  }
}

Et là.. l'interruption se déclenche encore toute seule ! Il y a des bips réguliers d'environ 1 seconde.

Voici mon moniteur, en l'espace de deux secondes : :o

Demarrage du programme

Ceci est l'interruption numero 0
Ceci est l'interruption numero 1
Ceci est l'interruption numero 2
Ceci est l'interruption numero 3
...
Ceci est l'interruption numero 129
Ceci est l'interruption numero 130

Je n'y comprends plus rien, et je viens à me demander si mon arduino n'est pas abimé. :disappointed_relieved:

Avez-vous une idée de l'origine du problème ? Mon arduino est-il abimé ?
Merci beaucoup !

Bonjour,

Si ton bouton est entre l'entrée et le +5V, il te faut absolument une résistance de pull down.

Salut,

Je viens de rajouter une résistance. :wink:
Rien ne change au niveau du bip et du moniteur.

non une résistance de pull down
Tu laisses ton montage précédent et tu mets une résistance de 4.7k ou 10k entre l'entrée et le GND.

Je ne suis pas sûr d'avoir bien mis la résistance. Voilà ce que j'ai fais :

Au passage : quand je déconnecte carrément le fil du pin 2 (plus rien du tout au pin 2) et la résistance, je continue encore d'avoir des interruptions ! Résistances ou non, ce n'est pas normal, non ? :o

Si tu laisses une entrée en l'air ( c'est à dire non connectée...) son état va être aléatoire (en fonction des parasites qui passent...)

Avec ton montage, quand le bouton n'est pas pressé, le fil qui va à la pin 2 n'est relié à rien ... Comme on te l'a dit avant ... Il faut mettre une résistance entre là pin 2 et la masse ...

Ainsi quand le bouton n'est pas appuyé, ton pin 2 est relié à la masse à travers la résistance (du coup il va voir 0 Volt)
Quand ton bouton sera enfoncé il connectera la pin 2 au 5v ...

Ton dernier montage à l'air correct

antoine-l:
Je ne suis pas sûr d'avoir bien mis la résistance. Voilà ce que j'ai fais :

ça semble bon mais j'ai de gros doutes sur la valeur de la résistance (330ohm au lieu de 10k !!!)
il serait souhaitable de respecter les couleurs de fils et la distribution de l'alimentation sur la plaque d'essai

Au passage : quand je déconnecte carrément le fil du pin 2 (plus rien du tout au pin 2) et la résistance, je continue encore d'avoir des interruptions ! Résistances ou non, ce n'est pas normal, non ? :o

c'est normal une entrée "en l'air" récolte plein de parasites

L'entrée 2 et le bouton n'ont pas l'air connecté (en bas les 2 fils et la résistance ne semblent pas sur la même ligne)
Oups, j'ai mal vu

Merci pour vos réponses, c'est plus clair !
Le dernier montage que j'ai posté ne fonctionne pas. Malheureusement, je n'ai pas d'autre résistance plus importante. Il s'agit d'un projet pour mon école, et on ne nous a donné que ces résistances-ci.

EDIT : J'ai superposé les deux résistances, ça marche impec'. Mais du coup, je vais manquer de résistance pour mes LEDs :-\

antoine-l:
EDIT : J'ai superposé les deux résistances, ça marche impec'. Mais du coup, je vais manquer de résistance pour mes LEDs :-\

superposé = en parallèle ??? c'est pire
tu as une solution pour t'en sortir il faut inverser ton bouton :

  • il doit faire contact entre la masse GND et la pin 2
  • tu met en service la résistance de pull-up de l'arduino sur la pin 2
  • tu tiens compte de cette inversion dans ton code
    et tu gardes ta 330ohm pour ta led

Si tu continues comme ça, à faire des branchement "pour voir" sans un minimum de réflexion et d'acquisition de connaissances préalables, tu risques de ne pas voir assez ... de cartes arduino :smiling_imp:

rjnc38:
superposé = en parallèle ??? c'est pire
tu as une solution pour t'en sortir il faut inverser ton bouton :

  • il doit faire contact entre la masse GND et la pin 2
  • tu met en service la résistance de pull-up de l'arduino sur la pin 2
  • tu tiens compte de cette inversion dans ton code
    et tu gardes ta 330ohm pour ta led

Génial, ça marche parfaitement ! Merci !

@bricoleau : Merci du conseil ^^

Et dans la suite de Bricoleau ne te contente pas de photo de montage : dessine le schéma électrique sur une feuille de papier, il n'y a que comme cela que tu fera du réfléchi et non pas du " au pif ".

Regles communément admises :

  • rail de masse ( 0V, gnd) en bas
  • rail d'alim (Vcc, Vdd, 5V) en haut

et chaque fois que c'est possible (avec un boîtier de micro c'est parfois pas facile) :

  • entrées à gauche ( un poussoir est une entrée)
  • sorties à droite ( une del ou led est une sortie )

En faisant ainsi tu facilitera la compréhension de ton schéma par toi même et par les autres et par voie de conséquences tu aura de meilleures réponses.

bonjour ,
je suis débutant et bien sûr je suis souvent bloqué mais j'avance petit à petit ,mon problème aujourd hui est le suivant ,j'ai recopier ( copier coller) un code pour emetteur recepteur HCSR04 et quand je le donne à verifier , un message d'erreur apparaît : exit status 1 erreur dans la compilation.
J'ai verifié toutes les lignes que je n'ai pas modifiées pour l'instant mais je n'ai rien trouvé pensez vous que ceci pourrait éventuellement venir de la librairie qui poserait un problème.
merci je joins la copie du code ci dessous.
/*
émission d’une valeur integer via module nRF24L01
*/
#include <SPI.h> // gestion du bus SPI
#include <Mirf.h> // gestion de la communication
#include <nRF24L01.h> // définition des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // communication SPI nRF24L01
int valeur = 770; // contient la valeur à envoyer
byte valeur_octet[2]; // contient la valeur découpée en octet pour l’envoi
void setup()
{
Mirf.cePin = 8; // CE sur broche 8
Mirf.csnPin = 7; // CSN sur broche 7
Mirf.spi = &MirfHardwareSpi; // utilisation du port SPI hardware
Mirf.init(); // initialise le module SPI
Mirf.channel = 0; // utilisation canal 0 pour communiquer (128 canaux disponible, de 0 à 127)
Mirf.payload = sizeof(unsigned int); // = 2, déclaration taille du message à transmettre, max 32 octets
// RF_SETUP=0000abcd : a=1–>2Mb/s, a=0–>1Mb/s; puissance émission bc=00–>-18 dBm, bc=01–>-12dBm, bc=10–>-6dBm, bc=11–>0dBm;
// d=0 pas de gain sur le bruit en réception
Mirf.configRegister(RF_SETUP, 0x06); // 1 Mb/s et 0 dBm (puissance maximum)
Mirf.config(); // configure le canal et la taille du message
Mirf.setTADDR((byte *)"ardu2"); // définition adresse sur 5 octets de la 2ème carte Arduino
Mirf.setRADDR((byte )"ardu1"); // définition adresse sur 5 octets de la 1ere carte Arduino
}
void loop()
{
while(Mirf.isSending())
{
// en cours d’émission
delay(5);
}
valeur_octet[0] = valeur & 0xFF; // 1er octet
valeur_octet[1] = (valeur & 0xFF00) >> 8; // 2ème octet
Mirf.send(valeur_octet);
delay(1000);
}
/

réception d’une valeur integer via module nRF24L01
*/
#include <SPI.h> // gestion du bus SPI
#include <Mirf.h> // gestion de la communication
#include <nRF24L01.h> // définition des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // communication SPI nRF24L01
int valeur = 0; // contient la valeur à recevoir
byte valeur_octet[2]; // contient la valeur découpée en octet pour la réception
void setup()
{
Mirf.cePin = 8; // CE sur broche 8
Mirf.csnPin = 7; // CSN sur broche 7
Mirf.spi = &MirfHardwareSpi; // utilisation du port SPI hardware
Mirf.init(); // initialise le module SPI
Mirf.channel = 0; // utilisation canal 0 pour communiquer (128 canaux disponible, de 0 à 127)
Mirf.payload = sizeof(unsigned int); // = 2, déclaration taille du message à transmettre, max 32 octets
// RF_SETUP=0000abcd : a=1–>2Mb/s, a=0–>1Mb/s; puissance émission bc=00–>-18 dBm, bc=01–>-12dBm, bc=10–>-6dBm, bc=11–>0dBm;
// d=0 pas de gain sur le bruit en réception
Mirf.configRegister(RF_SETUP, 0x06); // 1 Mb/s et 0 dBm (puissance maximum)
Mirf.config(); // configure le canal et la taille du message
Mirf.setTADDR((byte *)"ardu1"); // définition adresse sur 5 octets de la 2ème carte Arduino
Mirf.setRADDR((byte *)"ardu2"); // définition adresse sur 5 octets de la 1ere carte Arduino
Serial.begin(9600);
}
void loop()
{
while(!Mirf.dataReady())
{
// pas prêt à recevoir
delay(5);
}
Mirf.getData(valeur_octet); // récupére 2 octets
valeur = valeur_octet[0] + (valeur_octet[1] << 8); // transforme en int
Serial.print(valeur, DEC);
Serial.print(" ");
Serial.print(valeur_octet[0]);
Serial.print(" ");
Serial.println(valeur_octet[1]);
delay(1000);
}

@PAPY54

  1. Tu n'as visiblement pas lu le message "Bienvenue sur le forum de la communauté francophone."

  2. Idem pour le message qui suit "Faire un nouveau message avec les balises.

  3. Sur aucun forum il n'est accepté de se glisser dans le sujet d'un autre.

S'il te plaît , tu lit tout , le tuto d'Eskimon sera ton livre de chevet et tu nous fais un nouveau message qui ne traitera que de tes soucis.

A bientôt.