#include <avr/io.h>
#include <util/delay.h>
// Définition des constantes
#define bouton0 PD2 // Broche 2 pour le bouton 0
#define bouton2 PD3 // Broche 3 pour le bouton 2
#define bouton3 PD4 // Broche 4 pour le bouton 3
#define bouton5 PD5 // Broche 5 pour le bouton 5
#define led PD6 // Broche 6 pour la LED d'erreur
#define ledOK PD7 // Broche 7 pour la LED de porte ouverte
const int codeCorrect[] = {0, 2, 3, 5};
// État actuel du système
int etat = 0; // Démarrage dans l'état 0
// Fonction pour lire l'état des boutons
int lireBoutons() {
if (PIND & (1 << bouton0)) {
return 0; // Bouton 0 pressé
}
if (PIND & (1 << bouton2)) {
return 2; // Bouton 2 pressé
}
if (PIND & (1 << bouton3)) {
return 3; // Bouton 3 pressé
}
if (PIND & (1 << bouton5)) {
return 5; // Bouton 5 pressé
}
return -1; // Aucun bouton pressé
}
// Fonction principale
int main() {
// Initialiser les broches d'entrée et de sortie
DDRD &= ~(1 << bouton0);
DDRD &= ~(1 << bouton2);
DDRD &= ~(1 << bouton3);
DDRD &= ~(1 << bouton5);
DDRD |= (1 << led); // Broches LED en sortie
DDRD |= (1 << ledOK); // Broches LED en sortie
// Éteindre les LEDs au départ
PORTD &= ~(1 << led);
PORTD &= ~(1 << ledOK);
// Boucle principale
while (1) {
int bouton = lireBoutons(); // Lire l'état des boutons
if (etat == 0) { // État initial
if (bouton == codeCorrect[0]) {
etat = 1; // Démarrer la saisie du code
}
}
else if (etat == 1) { // Saisie du premier chiffre
if (bouton == codeCorrect[1]) {
etat = 2;
} else if (bouton != -1) {
// etat = 0; // Code incorrect, reprise du processus
PORTD |= (1 << led);
_delay_ms(500);
PORTD &= ~(1 << led);
}
}
else if (etat == 2) { // Saisie du deuxième chiffre
if (bouton == codeCorrect[2]) {
etat = 3;
} else if (bouton != -1) {
// etat = 0; // Code incorrect, reprise du processus
PORTD |= (1 << led);
_delay_ms(500);
PORTD &= ~(1 << led);
}
}
else if (etat == 3) { // Saisie du troisième chiffre
if (bouton == codeCorrect[3]) {
etat = 4;
} else if (bouton != -1) {
// etat = 0; // Code incorrect, reprise du processus
PORTD |= (1 << led);
_delay_ms(500);
PORTD &= ~(1 << led);
}
}
else if (etat == 4) { // Code correct
PORTD |= (1 << ledOK); // Allumer la LED de confirmation
_delay_ms(5000); // Simuler l'ouverture de la porte pendant 5 secondes
PORTD &= ~(1 << ledOK); // Éteindre la LED
//etat = 0; // Revenir à l'état initial
}
_delay_ms(1000); // Délai entre les lectures des boutons
}
}