/*** Afficheur lcd I2C2004 **************************/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define buzzer 13
/*** Variables pour l'encodeur rotatif KY-040 ******/
#define ENCODEUR_CLK 2
#define ENCODEUR_DT 3
#define ENCODEUR_SW 4
int compteur = 0;
//int compteur = 0, dataValue, resultat, E_Clk, i ;
int currentValue, previousValue;
char msg[20];
void setup() {
lcd.init(); lcd.backlight();
pinMode(buzzer, OUTPUT);
// Initialize encoder pins
pinMode(ENCODEUR_CLK, INPUT); // Broche 2
pinMode(ENCODEUR_DT, INPUT); // Broche 3
pinMode(ENCODEUR_SW, INPUT_PULLUP); //Broche 4
attachInterrupt(digitalPinToInterrupt(ENCODEUR_CLK), readEncodeur, FALLING);
}
void loop() {
sprintf(msg, "Compteur: %4d", getCompteur());
lcdPrintCenter(msg, 0);
// remise à 0 en pressant le bouton de l'encodeur
if (digitalRead(ENCODEUR_SW) == LOW) {
resetCompteur();
beep();
}
}
void readEncodeur() {
int dtValue = digitalRead(ENCODEUR_DT); // lit la broche DATA de l'encodeur
if (dtValue == HIGH) {
tick();
compteur++; // Rotation en sens horaire
}
if (dtValue == LOW) {
tick();
compteur--; // Rotation en sens anti-horaire
}
}
// Obtenir la valeur du compteur, en désactivant les interruptions.
// Cela garantit que readEncodeur() ne modifie pas la valeur
// pendant que nous la lisons. (Anti rebonds)
int getCompteur() {
int result;
noInterrupts();
result = compteur;
interrupts();
return result;
}
void resetCompteur() {
noInterrupts();
compteur = 0;
interrupts();
}
// Fonction perso pour centrer le texte à afficher
void lcdPrintCenter(String texte, int ligne) {
// Centre l'affichage du texte sur la ligne indiquée de lcd
int len = texte.length(); // Défini la longeur de la variable "texte"
lcd.setCursor((20 - len) / 2, ligne); // positionne le curseur au centre de la ligne choisie et soustrait la longeur du text à afficher
lcd.print(texte); // Affiche le texte demandé sur lcd2.
}
// Fonctions du buzzer ==========================================
// fonction beep pour Émettre une tonalité de x kHz pendant x ms
void beep() {// Émet une tonalité de 2,5kHz pendant 100 ms
tone(buzzer, 2500, 100);
}
// Émet une très brève tonalité de 5kHz pendant 4 ms
void tick() {
tone(buzzer, 5000, 4); // Émet un son de 5 kHz pendant 1 ms
}
Encodeur
rotatif
KY-040
1- Pour remettre à 0: Pressez le bouton.
2- Pour Compterle nombre de pas
. appliquez une rotation horaire ou antihoraire
* Pour se faire...
-> Cliquez la flèche droite pour défiler vers la droite (+)
<- Cliquez la flèche gauche pour défiles vers la gauche (-)