bonjour à tous,
j'aimerais avoir votre avis s'il vous plait:
j'ai fais un montage, accompagné d'un code, je veux allumer une DEL, soit directement, soit avec une tempo près définie, soit par une tempo dont je choisis le temps grâce à un encodeur rotatif.
le tout avec son état et le compte à rebours inscrit sur un LCD.
tout fonctionne correctement, sauf l'encodeur qui incrémente, mais ne décrémente qu'aléatoirement.
j'aimerais savoir si c'est à cause du montage, ou du code.
je vous montre le montage, le code, et une petite vidéo pour voir tout ça en direct.
pour info, lorsque je teste l'encodeur rotatif seul avec le même type de code, il fonctionne parfaitement.
voici le montage :
voici le code en deux partis : (regardez la fonction GelProg de plus près, c'est la que se situ le programme de l'encodeur rotatif )
première partis :
// - - - dabord pour l'écran LCD, il nous faut ça - - -
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD
const int RS=2; //constante broche 2 pour l'ecran LCD
const int E=3; //constante broche 3 pour l'ecran LCD
const int D4=4; //constante broche 4 pour l'ecran LCD
const int D5=5; //constante broche 5 pour l'ecran LCD
const int D6=6; //constante broche 6 pour l'ecran LCD
const int D7=7; //constante broche 7 pour l'ecran LCD
// - - - pour le codeur rotatif - - -
// - - - ATTENTION : l'encodeur est un KY 040 - - -
// le + est branché au 5V
// le GND est branché à la masse
int val = LOW;
int PinCLK = 8; //bouton CLK connécté à la broche 8
int PinDT = 9; //bouton DT connécté à la broche 9
int PinSW = A0; //bouton Switch connécté à la broche A0
static long encoderPos = -1; // Au 1er démarrage, il passera à 0
int PinCLKLast = LOW;
int nbPas = 200; // Résolution de l'encodeur
int n = LOW;
// - - - constantes pour les trois boutons poussoirs - - -
int BPMARCHE = 12; //bouton marche connecté à la broche 12
int BPARRET = 13; //bouton arret connecté à la broche 13
int BPARRETPROG = 10; //bouton arret programmé connecté à la broche 10
// - - - constantes d'état - - -
int etatBPMARCHE; //variable qui enregistre l'état du bouton marche
int etatBPARRET; //variable qui enregistre l'état du bouton arret
int etatBPARRETPROG; //variable qui enregistre l'état du bouton arret programmé
// - - - constante pour les LEDS - - -
int LEDS = 11; //et toutes les leds sont connectés à la broche 11 via quelques bon vieux transistor
// - - - constantes pour la tempo - - -
int heure;
int time;
int minute;
int seconde; // variable de comptage des secondes écoulées
long milliref; // variable de mémorisation de la dernière valeur de milli utilisée
// - - - création d'un objet afficheur LCD alphanumérique - - -
// les broches de lignes sont automatiquement configurées en ENTREE avec pullup interne activé
// les broches de colonnes sont automatiquement configurées en SORTIE
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits
void setup(){
//**************** FONCTION SETUP = Code d'initialisation *****
Serial.begin (9600);
// - - - allocation des entrées sorties - - -
pinMode (BPMARCHE, INPUT_PULLUP); //le bouton marche est une entrée
pinMode (BPARRET, INPUT_PULLUP); //le bouton arret est une entrée
pinMode (BPARRETPROG, INPUT_PULLUP); //le bouton arret programmé est une entrée
pinMode (LEDS, OUTPUT); //les leds sont des sorties
// - - - entrée pour l'encodeur rotatif - - -
pinMode (PinCLK, INPUT_PULLUP); //le bouton CLK est une entrée
pinMode (PinDT, INPUT_PULLUP); //le bouton DT est une entrée
pinMode (PinSW,INPUT_PULLUP); //le bouton SW est une entrée
// essai - - - initialisation de val à 0 pour le switch de l'encodeur rotatif- - -
//val = 0;
// - - - Test de l'afficheur LCD - - -
lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes
lcd.print("***Innovation***"); // affiche le message de test
lcd.setCursor(0,1); //positionne le curseur au début de la seconde ligne
lcd.print(" Olivier CAPOEN "); //affiche le texte
delay(2000); // pause de 2 secondes
lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser le temps d'effacer l'écran
// - - - initialisation d'une tempo minimum - - -
// inutil
// initialisation du carré en position éteint
lcd.clear(); // efface l'écran
lcd.setCursor(2, 0);
lcd.print("Carre eteint"); // Affiche carré éteint
digitalWrite(LEDS, LOW);
}
void loop() {
etatBPMARCHE = digitalRead(BPMARCHE); // Lecture du Statut du BP marche
etatBPARRET = digitalRead(BPARRET); // Lecture du Statut du BP arret
etatBPARRETPROG = digitalRead(BPARRETPROG); // Lecture du Statut du BP arret programmé
if (digitalRead(BPMARCHE) == LOW) //si on appui sur BP marche
{ lcd.clear(); //tout d'abord, on efface l'écran
lcd.setCursor(0, 0); //on met le curseur en haut à gauche
lcd.print(" Carre ALLUME "); //on affiche que le carré est allumé
digitalWrite(LEDS, HIGH); //on allume les leds
if(digitalRead(BPARRETPROG) == LOW){ //si on appuis sur BP arret programmé
ArretProgFix(); //on lance le sous programme d'arret temporisé
}
}
if (etatBPARRET == LOW){ //si on appuis sur BP arret
digitalWrite(LEDS, LOW); //on éteint les leds
lcd.clear(); //on efface l'écran
lcd.setCursor(0, 0); //on met le curseur en haut à gauche
lcd.print("Carre en attente"); //on affiche carré en attente d'activation
lcd.setCursor(2, 1);
lcd.print("d'activatioo");
}
if(digitalRead(BPARRETPROG) == LOW){ //si on appuis sur BP arret programmé
ArretProgFix(); //on lance le sous programme d'arret temporisé fixe
}
if (!(digitalRead(PinSW))) {
val = HIGH; //on met val à la valeure 1
encoderPos = 0; // Reset la position si on appui sur l'encodeur
GelProg (); //on lance le sous programe de gel du compte à rebours et de sa programmation
}
}
void ArretProgFix(){
// - - - initialisation d'une tempo minimum - - -
heure = 0;
minute = 0;
seconde = 10;
time = (seconde + (60 * minute) + (3600 * heure));
ArretProg(); // on lance le sous programme ArretProg
}