J'ai un problème de fonctionnement de mon programme quand j'essaie d'utiliser les interruptions avec le
Deuligne.
Ci joint mon code :
#include "Wire.h"
#include <Deuligne.h>
#include <Button.h>
#define SWI 2 // Intr 0 = Pin 2
#define CHA 6
#define CHB 7
#define REDLED 13
// initialize the library with the numbers of the interface pins
Deuligne lcd;
// valeur determinee par la rotation de l'encodeur
int encoderPos = 0;
// precedente position de A
int previousStatus = LOW;
// etat actuel de A
int currentStatus = LOW;
// etat actuel de S
int S = HIGH;
// position du servomoteur (angle)
int servoPos = 90;
//create a button object at pin 2
/*
|| Wiring:
|| GND -----/ ------ pin 2
*/
Button button = Button(SWI,PULLUP);
void setup()
{
pinMode(CHA, INPUT);
pinMode(CHB, INPUT);
pinMode(SWI, INPUT);
pinMode(REDLED,OUTPUT); //debug to led 13
Wire.begin(); // join i2c bus (address optional for master)
lcd.init(); // initialisation du panneau LCD (obligatoire)
// print a welcome message
lcd.clear();
lcd.print("*** WELCOME! ***");
lcd.setCursor(0,1);
lcd.print("Initializing");
attachInterrupt(0, menu, FALLING);
}
void loop()
{
lcd.setCursor(0, 0);
checkValue();
lcd.print(encoderPos);
/*if(button.isPressed()){
digitalWrite(13,HIGH);
}else{
digitalWrite(13,LOW);
}*/
}
void checkValue()
{
// on regarde ce qu'on recoit sur la pin A de l'encodeur
currentStatus = digitalRead(CHA);
// si on a un front montant (passage de LOW a HIGH)
if ((previousStatus == LOW) && (currentStatus == HIGH))
{
// on regarde l'etat de B pour connaitre le sens :
if (digitalRead(CHB) == HIGH)
{
encoderPos++;
}
else
{
encoderPos--;
}
}
// on reinitialise prevA pour le prochain tour
previousStatus = currentStatus;
}
void menu() {
/*int selected = 3;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Turn the knob to");
lcd.setCursor(0,1);
lcd.print("select an option");*/
digitalWrite(13,HIGH);
lcd.clear();
delay(2000);
// display options
/*while (!button.isPressed()) {
selected += encoderPos;
if (selected<0) selected=3;
if (selected>3) selected=0;
if (moved) {
lcd.clear();
lcd.setCursor(0,0);
switch(selected) {
case 0:
lcd.print("Change Units ");
break;
case 1:
lcd.print("Backlight On/Off");
break;
case 2:
lcd.print("Logging On/Off ");
break;
case 3:
lcd.print("Exit Settings ");
break;
}
}
}
// when button is pressed...
lcd.clear();
switch(selected) {
case 0:
settingsChangeUnits();
break;
case 1:
settingsChangeBacklight();
break;
case 2:
settingsChangeLogging();
}*/
}
Quand le programme commence en bougeant le rotatif j'ai bien la valeur de encoderPos qui change sur le LCD.
Mais quand j'appuie sur le bouton de l'encodeur (SWI), j'ai l'impression que le programme se fige, soit il ne fait rien, soit il est dans une boucle infinie mais quoi que je fasse il ne se passe rien.
Je suis obligé de faire un reset pour récupérer la main.
Quelqu'un aurait une idée?