Bonjour,
Alors je vous avoue avoir chercher mais je ne trouve franchement pas la réponse ou alors je ne comprends rien aux interruptions.
Je suis sur Mega2560 et avant j'ai testé mes pins d'interruptions grâce à un topic du forum.
Donc ma pin 21 correspond bien.
Mon soucis est le suivant, lorsque mon interrupteur (sur pin 21 nommé securite) passe en LOW
Mon programme blocage ne se lance pas.
Je ne sais pas si c'est le fait d’être dans void programme qui m'empeche cela j'avais compris que l'interruption fonctionne dans tout les cas.
Voici le code (brouillon)
#include "LiquidCrystal.h"
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int entree_menus = 49;
int commande_monter = 50;
int commande_retour = 51;
const int securite = 21;
int contact_moteur = 22;
enum : byte {
BUTTON_NONE,
BUTTON_UP,
BUTTON_DOWN,
BUTTON_LEFT,
BUTTON_RIGHT,
BUTTON_SELECT,
PROGRAMME_EN_ATTENTE,
PROGRAMME_MONTEE,
PROGRAMME_ARRET_MONTEE,
PROGRAMME_SECURITE,
PROGRAMME_RETOUR_AUTO
}
etat = PROGRAMME_EN_ATTENTE;
void setup() {
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.write("Digital Dock");
delay (1000);
lcd.setCursor(0, 1);
lcd.write("v1.11");
delay(5000);
pinMode(commande_monter, INPUT);
pinMode(commande_retour, INPUT);
pinMode(securite, INPUT);
attachInterrupt(digitalPinToInterrupt(securite), blocage, LOW);
pinMode(contact_moteur, OUTPUT);
lcd.clear();
}
void loop()
{
programme();
}
void blocage()
{
lcd.setCursor(0, 0);
lcd.print("SECURITES ");
lcd.setCursor(0, 1);
lcd.print("P1 ");
digitalWrite(contact_moteur,LOW);
}
/*---------LECTURE--DES--BOUTONS--DU--KEYPAD------------*/
/*byte getPressedButton() {
int value = analogRead(A0);
if (value < 50)
return BUTTON_RIGHT;
else if (value < 250)
return BUTTON_UP;
else if (value < 410)
return BUTTON_DOWN;
else if (value < 550)
return BUTTON_LEFT;
else if (value < 850)
return BUTTON_SELECT;
else
return BUTTON_NONE;
}*/
void programme()
{
static unsigned long lancement_retour;
int tempo_retour_automatique;
tempo_retour_automatique = 8000ul;
switch (etat) {
case PROGRAMME_EN_ATTENTE:
if ((digitalRead(securite) == HIGH)&&(digitalRead(commande_monter) == HIGH)) {
lcd.setCursor(0, 0);
lcd.print("MONTER ");
lcd.setCursor(0, 1);
lcd.print(" ");
digitalWrite(contact_moteur,HIGH);
etat = PROGRAMME_MONTEE;
}
if (digitalRead(securite) == LOW){
lcd.setCursor(0, 0);
lcd.print("SECURITES ");
lcd.setCursor(0, 1);
lcd.print("P1 ");
digitalWrite(contact_moteur,LOW);
etat = PROGRAMME_SECURITE;
}
if ((digitalRead(securite) == HIGH)&&(digitalRead(commande_retour) == HIGH)){
lcd.setCursor(0, 0);
lcd.print("RETOUR ");
lcd.setCursor(0, 1);
lcd.print("AUTOMATIQUE ");
digitalWrite(contact_moteur,HIGH);
lancement_retour = millis();
etat = PROGRAMME_RETOUR_AUTO;
}
break;
case PROGRAMME_MONTEE:
if ((digitalRead(securite) == HIGH)&&(digitalRead(commande_monter) == HIGH)){
digitalWrite(contact_moteur,HIGH);
etat = PROGRAMME_ARRET_MONTEE;
}
break;
case PROGRAMME_ARRET_MONTEE:
if ((digitalRead(securite) == HIGH)&&(digitalRead(commande_monter) == LOW)) {
lcd.clear();
digitalWrite(contact_moteur,LOW);
etat = PROGRAMME_EN_ATTENTE;
}
break;
case PROGRAMME_SECURITE:
if (digitalRead(securite) == HIGH) {
lcd.clear();
etat = PROGRAMME_EN_ATTENTE;
}
break;
case PROGRAMME_RETOUR_AUTO:
if (digitalRead(commande_retour) == HIGH) {
digitalWrite(contact_moteur,HIGH);
etat = PROGRAMME_EN_ATTENTE;
}
if (digitalRead(securite) == LOW){
lcd.setCursor(0, 0);
lcd.print("SECURITES ");
lcd.setCursor(0, 1);
lcd.print("P1 ");
digitalWrite(contact_moteur,LOW);
etat = PROGRAMME_SECURITE;
}
else {
if (millis() - lancement_retour >= tempo_retour_automatique) {
digitalWrite(contact_moteur,LOW);
lcd.clear();
etat = PROGRAMME_EN_ATTENTE;
}
}
break;
}
}