Vous êtes sur la page 1sur 3

Université des Sciences et d la Technologie Année universitaire : 2023/2024

Houari Boumediene Module : Systèmes à microcontrôleurs


Faculté de Génie Electrique Spécialité : M1 Electronique des
Département d’électronique Systèmes Embarqués

Interrogation écrite n°1


Exercice :

Écrire un programme Arduino et un programme en utilisant les registres internes du μc ATmega328p qui
permet de contrôler un petit barographe avec 4 LED en fonction de 2 boutons poussoirs. L'un des boutons
(SW1) incrémentera le nombre de LED allumées, tandis que l'autre (SW1) le décrémentera (en utilisant des
interruptions sur le front montant).

Voici le schéma du circuit à monter :

Page 1|3
const int btn_minus=2;
const int btn_plus=3;
const int led_1=9;
const int led_2=10;
const int led_3=11;
const int led_4=12;
volatile int nombre_led=0;

void setup() {
Serial.begin(9600);
pinMode (btn_plus, INPUT);
pinMode (btn_minus, INPUT);
pinMode (led_1, OUTPUT);
pinMode (led_2, OUTPUT);
pinMode (led_3, OUTPUT);
pinMode (led_4, OUTPUT);
attachInterrupt(digitalPinToInterrupt(btn_minus), interruptPlu, RISING);
attachInterrupt(digitalPinToInterrupt(btn_plus), interruptPlus, RISING);

void loop() {

Serial.println(nombre_led);
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, HIGH);
digitalWrite(led_4, HIGH);
if(nombre_led>4)
{
nombre_led=4;
}
if(nombre_led<1)
{
nombre_led=0;
}
if (nombre_led>=1)
{
digitalWrite(led_1,LOW);

}
if (nombre_led>=2)
{
digitalWrite(led_2,LOW);
}
if (nombre_led>=3)
{
digitalWrite(led_3,LOW);
}
if (nombre_led>=4)
{
digitalWrite(led_4,LOW);
}

}
void interruptPlu (){
nombre_led--;
}
void interruptPlus (){
nombre_led++;
}

Page 2|3
volatile int nombre_led = 0;

void setup() {
Serial.begin(9600);

// Configurer les broches des boutons en entrée


DDRD &= ~((1 << 2) | (1 << 3));

// Configurer les broches des LEDs en sortie


DDRB |= (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4);

// Attacher les interruptions


EICRA |= (1 << ISC00)| (1 << ISC01) | (1 << ISC10)| (1 << ISC11); // Déclencher sur changement de niveau
EIMSK |= (1 << INT0) | (1 << INT1); // Activer INT0 et INT1
sei();
}

void loop() {
Serial.println(nombre_led);

// Allumer toutes les LEDs


PORTB |= (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4);

// Limiter la valeur de nombre_led


if (nombre_led > 4) nombre_led = 4;
if (nombre_led < 1) nombre_led = 0;

// Gérer l'état des LEDs


if (nombre_led >= 1) {PORTB &= ~(1 << 1);}
if (nombre_led >= 2) {PORTB &= ~(1 << 2);}
if (nombre_led >= 3) {PORTB &= ~(1 << 3);}
if (nombre_led >= 4) {PORTB &= ~(1 << 4);}
}

ISR(INT0_vect) { // ISR pour BTN_MINUS


nombre_led--;
}

ISR(INT1_vect) { // ISR pour BTN_PLUS


nombre_led++;
}

Page 3|3

Vous aimerez peut-être aussi