// Lycée PE MARTIN
// Le 6/12/2023
// Titre : Portes coulissantes
// Matériels : Arduino Uno, lcd 2x16 I2C, codeur
// Description : voir le sujet
// Ressources
// bibliothèque : https://www.arduino.cc/reference/en/libraries/liquidcrystal/
// Bibliothèque
#include <LiquidCrystal_I2C.h>
// Paramètres de l'objet lcd
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
// Codeur
#define CODEUR_CLK 2
#define CODEUR_DT 3
#define CODEUR_SW 4
// Création de l'objet lcd
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// Variables globales
int compteur = 0;
bool sens = LOW; // LOW ou HIGH
float position_1 = 0.0, position = 1.0;
void setup() {
// Configuration des broches du codeur
pinMode(CODEUR_CLK, INPUT);
pinMode(CODEUR_DT, INPUT);
pinMode(CODEUR_SW, INPUT_PULLUP);
// Déclaration du gestionnaire d'interruption
attachInterrupt(digitalPinToInterrupt(CODEUR_CLK), lectureCodeur, FALLING);
// Initialisation du LCD
lcd.init(); // A placer en premier
lcd.backlight(); // Commande du rétroéclairage
lcd.print("Portes");
lcd.setCursor(4, 1);
lcd.print("Coulissantes");
delay(3000);
lcd.clear();
lcd.print("Compteur:0");
}
// Sous-programme (service)d'interruption
// Déclenché par un front descendant du signal A
void lectureCodeur() {
bool etatLogiqueCODEUR_DT = digitalRead(CODEUR_DT); // Lecture du signal DT
if (etatLogiqueCODEUR_DT == HIGH) { // si Rotation Horaire alors
compteur = compteur + 1000; // Incrémentation compteur
sens = HIGH;
}
else { // si Rotation Anti-Horaire alors
compteur = compteur - 1000; // Décrémentation compteur
sens = LOW;
}
}
// Sous-programmes et fonctions
//-----------------------------------------------------------
// Lecture du compteur, désactivation des interruptions.
// Ainsi, on est sûr que la valeur du compteur ne
// changera pas pendant la lecture du compteur.
int lireCompteur() {
int valeurCompteur;
noInterrupts(); // début protection du compteur
valeurCompteur = compteur;
interrupts(); // fin protection du compteur
return valeurCompteur;
}
int lireSens() {
int valeurSens;
noInterrupts(); // début protection du compteur
valeurSens = sens;
interrupts(); // fin protection du compteur
return valeurSens;
}
void razCompteur() {
noInterrupts();
compteur = 0;
interrupts();
}
void loop() {
// Calcul de la position en cm
position = 0.00248 * lireCompteur(); // en cm
// Affichage
if (position != position_1) {
lcd.clear();
lcd.print("Compteur:");
lcd.setCursor(9, 0);
lcd.print(lireCompteur());
lcd.setCursor(0, 1);
lcd.print("Pos:"); lcd.print(position); lcd.print("cm");
lcd.setCursor(13, 1);
if (position == 0) {
lcd.print(" ");
}
else {
if (sens) {
lcd.print("Ouv");
}
else {
lcd.print("Frm");
}
}
position_1 = position;
}
if (digitalRead(CODEUR_SW) == LOW) {
razCompteur();
}
}
Codeur incrémental
R1
R2
PORTES COULISSANTES