interruption externe

bonsoir

quand j appuis sur le button1PinM pour declancher l interruption et que j appuis les bouton + ou - pour la variable value rien ne ce passe j ai du faire une bêtise quelque par, si quelq un pourrait m aider je joint le code ci dessous.

merci d avance

[code]
int button1PinM = 2; // entrée bouton poussoir Menu interruption
int button2Pin = 7;  // entrée bouton poussoir+
int button1Pin = 4;  // entrée bouton poussoir-
int ledPin = 9;      // sortie Led
int value = 0;       //variable intensité lumineuse


void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT); //configuration led en sortie
  pinMode(button2Pin, INPUT); //configuration bouton 1 en entrée
  pinMode(button2Pin, INPUT); //configuration bouton 2 en entrée
  attachInterrupt(0, consigne, FALLING);
}

void loop() {
  value = constrain(value, 0, 255); // on force l’intensité entre 0 et 255
  analogWrite(ledPin, value); //on éclaire la Led avec +/- d’intensité lumineuse
  Serial.println(value);
  delay(10);
  }
  
  
void consigne() {
  if (digitalRead(button2Pin) == LOW) { value++; } 
  else if (digitalRead(button1Pin) == LOW) { value--; }
  }

[/code]

l'interruption n'as lieu qu'au FALLING. il faut appuyer et maintenir les bouton + ou moins avant de declencher ton IT.
verifie ton cablage.

bonsoir Jean

merci pour ta réponse qui est tout a fais juste, je viens de vérifier sous isis :slight_smile:
par contre ce que je veux faire, en appuyant sur le bouton qui est relier a l interruption 0 de l arduino uno donc du niveau haut au niveau bas s est daller dans la subrutine (consigne ) bouton+ ou bouton- pour faire varier la variable value si sest possible.
je sais pas si je me suis bien fais comprendre

merci d avance et bonne soirée

non, je ne comprend pas bien ce que tu veut faire.
l'interruption tel que programé devrai fonctionner.
si tu vas pas dans la routine IT, c'est qu'elle n'est pas vu.
tu n'a qu'a rajouter un test supplémentaire a ta routine IT, genre compteur que tu renvoie sur sérial,
et rajouter un test supplémentaire pour voir si le bouton est vu hors interruption
(augmente le delay pour le serial)

verifie ton cablage, que ca fonctionne sans interruption:

int countIT = 0;
int countNoIT = 0;
...
dans loop():
if (digitalRead(button1PinM) == LOW) { countNoIT++; }
Serial.println(value);
Serial.println(countIT);
Serial.println(countNoIT);
Serial.println("-"); //pour séparer visuelement les data
delay(500);
...
dans consigne():
countIT++;

si par contre tu veut que le bouton + et/ou le bouton - declanche l'interruption, tu n'as qu'une solution:
tu te sert des pin 2 et 3 pour les bouton en interruption 0 et 1.
desavantage: t'as bloqué les 2 seules sources d'interruption hard du UNO (si c'est celui que t'utilise)

dans tous les cas, t'auras des rebons qui déclencherons plusieurs fois de suite l'IT.
un condo en // du bouton avec une resistance en serie seraient les bienvenus.
(
c'est peut etre ce qui te manque, une resitance de rappel ?
see http://arduino.cc/en/Tutorial/DigitalReadSerial
et http://arduino.cc/en/Tutorial/InputPullupSerial
)

re

sa fonctionne sans les interruptions, je voulais utiliser pour régler la valeur de consigne d un thermostat.
ce que je veux faire, quand j appuis sur le bouton poussoir menu qui est relier a l interruption de l arduino ce qui envoie a une routine qui scrute les boutons de réglage + et - pour faire varier la variable value sans que le bouton menu soit toujour enfoncer.
en faite comme sur les télécommande de tv voilas

a moins que tu n'ai une raison particulière a vouloir utiliser les interruption hard pour ça (genre mode sleep du µC), une meilleur approche serai d'utiliser une interruption timer cyclique qui viendrai lire tes deux boutons.
see Arduino Playground - HomePage
personnelement, vu la fonction, je laisserai ca dans loop() en m'arrangeant que loop() ne soit pas bloquant.

si maintenant ton probleme est celui du front descendant que tu veuille resoudre par le FALLING, une meilleur solution serai de memoriser l'ancien état du bouton, comme ca tu pourra gerer autant de bouton que tu veux:

boolean TouchVal = false;
boolean TouchValOld = false;
//...
TouchVal = digitalread(button1Pin);
if (TouchVal) {
  if (!TouchValOld) {  //action si front montant uniquement
    //...
}
//...
// en fin de code loop uniquement
TouchValOld = TouchVal;
Delay (500)  // tempo anti rebonds

note qu'il est judicieux de faire

TouchVal = digitalread(button1Pin);

et de tester TouchVal ensuite plutot que de lire le bouton a chaque fois, pour la raison que tu aura une valeur stable sur toute la durée de la boucle loop().

Bonjour

jp73:

[code]

...
 pinMode(button2Pin, INPUT); //configuration bouton 1 en entrée
 pinMode(button2Pin, INPUT); //configuration bouton 2 en entrée
...


[/code]

Attention, tu ne fais pas le pinMode sur la bonne broche. 2 fois sur "button2Pin"

a+

bonsoir

Caape merci j avais pas vu mon erreur .

Jean je suis d accord avec toi que sa serait plus simple de le laisser dans le loop :smiley: mais pour apprendre j aimerais le faire avec l interruption externe.
par contre je pense que je n ai pas bien saisi le fonctionnement des interruptions externes, car je pensais que si j appuyai et relâchais le bouton poussoir "boutonmenu" cela me permettrait d avoir accès aux bouton+ et bouton- .

voici le schéma, je voulais mettre le schéma je n y arrive pas :blush:

bonne soirée

tu as dis que ca marchais sans interruption.
c'est a dire?

voici le code sans interruption

int button1PinM = 2; // entrée bouton poussoir Menu interruption
int button2Pin = 7;  // entrée bouton poussoir+
int button1Pin = 4;  // entrée bouton poussoir-
int ledPin = 9;      // sortie Led
int value = 0;       //variable intensité lumineuse


void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT); //configuration led en sortie
  pinMode(button1Pin, INPUT); //configuration bouton 1 en entrée
  pinMode(button2Pin, INPUT); //configuration bouton 2 en entrée
  }

void loop() {
  if (digitalRead(button2Pin) == LOW) { value++; } 
  else if (digitalRead(button1Pin) == LOW) { value--; }
  value = constrain(value, 0, 255); // on force l’intensité entre 0 et 255
  analogWrite(ledPin, value); //on éclaire la Led avec +/- d’intensité lumineuse
  Serial.println(value);
  delay(1000);
  }

ca marche pour bouton1 et bouton2, mais y'a rien qui teste le bouton d'interruption button1PinM ..?

oui j ai dis sans les interruptions, en faite je suis partie de ce code et j ai ajouté l interruption
Dans mon code finale je veux le faire avec une interruption pour éviter de scruter en continu dans la boucle
les deux boutons + et -.

voici le schéma:

pwmLed.jpg

tu ne peut pas faire ce que tu dis avec ce qui est cablé.
l'interruption n'est possible que sur un bouton. c'est ce bouton qui va déclancher l'IT.
en aucun cas bouton1 ou bouton2 ne déclencheron d'IT.

sur un UNO:
si tu n'as que 2 boutons a traiter en interruptif, branche les sur pin2 et pin3 et declare attachinterrupt 0 et 1.
si tu veut "pooler" un clavier (plus de 2 touches) hors de la boucle loop, laisse les interruptions pin de coté et fais le avec les interruptions timer.

j'ai reflechi, en fait tu peut. c'est un peu plus compliqué:

tu balance 3 pin en sortie sur 3 boutons, pinBP1, pinBP2 et pinBP3..
tu recupere le commun de ces 3 boutons sur la pin d'interruption pin2, Interruption 0.
dés que t'as une interruption, c'est qu'au moins un des 3 bouton l'a décenchée.
tu questionne dans l'interreuption l'etat de tes boutons en isolant pinBP1, pinBP2 et pinBP3.
tu remet pinBP1, pinBP2 et pinBP3 en etat d'attente et tu sort de l'IT.

ben ça marche, si par exemple je reste appuyé sur le" bouton +" et que j appuis plusieurs fois sur le bouton Menu, "value " va augmenter de N fois. Idem avec le "bouton -" avec la valeur qui décroit de n fois.

ah désolé Jean j avais pas vu ton dernier message je regarde sa

jp73:
ben ça marche, si par exemple je reste appuyé sur le" bouton +" et que j appuis plusieurs fois sur le bouton Menu, "value " va augmenter de N fois. Idem avec le "bouton -" avec la valeur qui décroit de n fois.

ca fait bien ce que ca doit faire, selon ton shema et ton sketch

oui mais pas comme je pensais en faite a l inverse de moi :blush:

bonjour Jean

bon les interruptions marches bien, j ai pris du coups les deux interruption de l arduino vu que j les utilise que pour les boutons + et -.

Par contre j ai un petit problème avec la fonction map je pense, j ai ma sorti PWM patte N°9 reste toujour à 255.

-j ai creée une variable TemperatureInt pour quelle soit en entier car Temperature est en float :
init TemperatureInt = Temperature;

-value est la consigne de la température MAX que je peux régler avec les boutons + et -, si j ai 0° j ai PWM à 255, si j ai temperature max = value j ai PWM à 0.

ConsignePWM = map(TeperatureInt,0,value,255,0);

-une autre question la variable value quand je la change de valeur j aimerai quelle soit toujours enregistrer même si j éteins
l arduino ?? je sais pas comment faire

merci d avance

/*
thermostat plasitfieuse temperature max de 200°
pour realiser les circuits imprimé avec l impression d'imprimante 
laser. Capteur de temperature avec une diodes et entré analogique
A0 patte N°23 commande de chauffe de la rèsistance par un relai 
ou un triac digital2 pattes N°4, pour les essais une led.
Lorsqu on appuit sur PinM (interruption0)on entre dans le menu ConsigneTemp,
on ce sert des bouttons pin1 pour augmenter value ou pin2 pour diminuer 
*/


int CapteurValeur = 0;                            // Capteur valeur de la tension de la diode mis à zero:
int CapteurPin = 14;                              // Selection de la patte N°14 A0 pour mesure de tension au borne de la diode:
int CommandePin = 13;                             // Sortie de commande relais ou triac, Digital2 patte N°4:
int inputPinM = 2;                                // bouton poussoir menu interuption 0 pin 2
int button1Pin = 2;                               // entrée bouton poussoir- interruption 0
int button2Pin = 3;                               // entrée bouton poussoir+ interruptipon 1
int ledPin = 9;                                   // commande de chauffe
int value = 175;                                  // Valeur de consigne de 175 degré
float Temperature = 0;                            // Temperature mesuré
float TensionTemperature = 0;                     // tension au borne de la diode
int TeperatureInt = Temperature;                  // temperature pour map en entier
int ConsignePWM = 0;                              // PWM pour commande de chauffe



void setup() {                                    // initialisation des routine lorsque lon presse le reset:
  analogReference(INTERNAL);                      // Permet de fixer la temperature de refernce à 1,1 volt:
  Serial.begin(9600);                             // intialisation communication serie à 9600 bits par seconde: 
  pinMode(CommandePin, OUTPUT);                   // declar la CommandePin de chauffe en sortie:
  attachInterrupt(0, consigneMoins, FALLING);
  attachInterrupt(1, consignePlus, FALLING);
}


void loop(){
  CapteurValeur = analogRead(CapteurPin );                      // lis la tension à la patte 23 A0 en 10bits:
  TensionTemperature = CapteurValeur * (1.1 / 1023.0);
  Temperature = 24 +((0.595699 - TensionTemperature) * 500);
  ConsignePWM = map(TeperatureInt,0,value,255,0);
  analogWrite(ledPin, ConsignePWM);
  
  Serial.println(CapteurValeur);
  Serial.println(TensionTemperature);
  Serial.println(Temperature);
  Serial.println(value);
  Serial.println(ConsignePWM); 
  delay(500);                                    
}



void consignePlus() {
  if (digitalRead(button2Pin) == LOW) { value++; } 
  }
  
  
void consigneMoins() {
  if (digitalRead(button1Pin) == LOW) { value--; }
  }