Vous êtes sur la page 1sur 2

FILIERE : MECATRONIQUE Elément de module

2ème ANNEE Cycle Ingénieur PROGRAMMATION C POUR SYSTEMES EMBARQUES

CORRECTION TRAVAIL DE SYNTHESE

TRAVAIL DEMANDE
Comme le montre la figure ci-dessous, le travail de synthèse est constitué de :
 Un afficheur OLED 128*32 branché avec le bus de communication I2C (SDA : pin D21 et SCL : pin 22) ;
 Une LED D1 branchée (via une résistance R2) au GPIO17 qui sera configuré en sortie ;
 Un Bouton poussoir BP1 branché au GPIO4 qui sera configuré en entrée avec activation d la résistance
Pullup interne ;
 Un capteur de lumière LDR branché avec l'entrée analogique ADC1_0 (GPIO36) configurée comme suit :
Atténuation 11dB et résolution 12bits.

3,3V
DOIT ESP32 LDR
Gnd ADC1_0
3,3V
D17 R1

D4 R2
D21
D22
D1
BP1

Gnd

R2 = 220W et R1 = 10kW

On demande d'implémenter un programme C (API ESP-IDF) permettant de :


 Initialiser la plateforme matérielle du système via un sous-programme init_hw() ;
 Commander le système en respectant le cahier de charge suivant :
 Afficher la luminosité ambiante dans l'afficheur OLED ;
 Allumer la LED D1 si le bouton poussoir BP1 est appuyé.

CORRECTION
//Déclaration des bibliothèques
#include <stdio.h> // Bibliothèque pour utilisation de printf()
#include <driver/gpio.h> // Bibliothèque gestion GPIO
#include <driver/adc.h> // Bibliothèque gestion entrées analogique
#include <ssd1306.h> // Bibliothèque gestion afficheur OLED
#include <string.h> // Bibliothèque gestion des chaines de caractères
// Définition des broches utilisées
#define PIN_SDA 21 // Définition des pins du bus I2C du module ESP32
#define PIN_SCL 22
#define PIN_RESET -1
#define LED_PIN 14 // Définition du pin connecté à la LED D1
#define BP1_PIN 4 // Définition du pin connecté au bouton poussoir BP1

ESI2A - HANAFI AHMED 1


FILIERE : MECATRONIQUE Elément de module
2ème ANNEE Cycle Ingénieur PROGRAMMATION C POUR SYSTEMES EMBARQUES

CORRECTION TRAVAIL DE SYNTHESE

// Définition des variables et objets utilisés


SSD1306_t MYOLED // Déclaration objet "MYOLED" représentant l'afficheur OLED
char TexteOLED[20]; // Déclaration variable "TexteOLED" contenant le texte à afficher
int Lum_value ; // Déclaration variable "Lum_value" contenant Valeur luminosité
int Etat_BP ; // Déclaration variable "Etat_BP" contenant état du BP1
// Sous-programme d'initialisation de la plateforme matérielle
void init_hw()
{
// Initialisation des ports GPIO
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); // LED_PIN en sortie
gpio_set_direction(BP1_PIN, GPIO_MODE_INPUT); // BP1_PIN en entrée
gpio_set_pull_mode(BP1_PIN, GPIO_PULLUP_ONLY); // Activation Pullup de BP1_PIN
// Initialisation de l'entrée analogique
adc1_config_width(ADC_WIDTH_BIT_12Bit); // Résolution ADC1 de 12 bits
adc1_config_channel_atten(ADC1_CHANNEL_0 , ADC_ATTEN_DB_11); // Atténuation ADC1_0 de 11dB
// Initialisation afficheur OLED
i2c_master_init(&MYOLED, SDA_GPIO, SCL_GPIO, RESET_GPIO); //Initialisation bus I2C
ssd1306_init(&MYOLED, 128, 32); // Initialisation type afficheur OLED
ssd1306_clear_screen(MYOLED, false); // Effacer l'écran
ssd1306_contrast(0xff); // Régler le contraste
}

void app_main(void)
{
// Appel du sous-programme d'initialisation de la plateforme matérielle
init_hw() ;
// Boucle temp-réel de commande
while (1)
{
// Lire l'état de BP1
Etat_BP = gpio_get_level(BP1_PIN);
// Tester l'état de BP1
if (Etat_BP == 0)
{
gpio_set_level(LED_PIN, 1); // turn on LED si BP1 appuyé
}
else
{
gpio_set_level(LED_PIN, 0); // turn off LED si BP1 non appuyé
}
// Lire la valeur numérique de la luminosité
Lum_value = adc1_get_raw(ADC1_CHANNEL_0);
printf("Luminosité Value: %d \n", Lum_value);
// Préparation et affichage valeur luminosité sur afficheur OLED
sprintf(&TexteOLED[0], "LUMINO : %02d", Lum_value);
ssd1306_display_text(&MYOLED, 2, TexteOLED, strlen(TexteOLED), false);

vTaskDelay(500/ portTICK_PERIOD_MS);
}
}

ESI2A - HANAFI AHMED 2

Vous aimerez peut-être aussi