hello
j'ai un peu joué avec ton code, mais n'ayant pas de codeur, pas possible de tester
#include <LiquidCrystal.h>
int val = LOW;
int PinCLK = 8;//2;
int PinDT = 9;//3; //voie B
int PinSW = A0;//14;
static long encoderPos = -1; // Au 1er démarrage, il passera à 0
int PinCLKLast = LOW;
int nbPas = 200; // Résolution de l'encodeur
int lecture_PinCLK = LOW;
int BPARRETPROG = 10; int etatBPARRETPROG;
int LEDS = 11;
int BPMARCHE = 12; int etatBPMARCHE;
int BPARRET = 13; int etatBPARRET;
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int time;int heure;int minute;int seconde;
long milliref;
void setup()
{
Serial.begin (115200);
pinMode (BPMARCHE, INPUT_PULLUP);
pinMode (BPARRET, INPUT_PULLUP);
pinMode (BPARRETPROG, INPUT_PULLUP);
pinMode (LEDS, OUTPUT);
pinMode (PinCLK, INPUT_PULLUP);
pinMode (PinDT, INPUT_PULLUP);
pinMode (PinSW, INPUT_PULLUP);
// essai - - - initialisation de val à 0 pour le switch de l'encodeur rotatif- - -
//val = 0;
lcd.begin(16, 2);lcd.print("***Innovation***");lcd.setCursor(0, 1);lcd.print(" Olivier CAPOEN ");delay(2000);lcd.clear();delay(10);
lcd.setCursor(2, 0);lcd.print("Carre eteint");digitalWrite(LEDS, LOW);
}
void loop()
{
etatBPMARCHE = digitalRead(BPMARCHE);
etatBPARRET = digitalRead(BPARRET);
etatBPARRETPROG = digitalRead(BPARRETPROG);
if (digitalRead(BPMARCHE) == LOW)
{
lcd.clear(); lcd.print(" Carre ALLUME ");
digitalWrite(LEDS, HIGH);
if (digitalRead(BPARRETPROG) == LOW){ArretProgFix();}
}
if (etatBPARRET == LOW)
{
digitalWrite(LEDS, LOW);
lcd.clear(); lcd.print("Carre en attente");
lcd.setCursor(2, 1); lcd.print("d'activation");
}
if (digitalRead(BPARRETPROG) == LOW){ ArretProgFix();}
if (!(digitalRead(PinSW)))
{
val = HIGH;
encoderPos = 0;
GelProg ();
}
}
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
}
void ArretProg()
{
digitalWrite(LEDS, HIGH);
lcd.clear();delay(10);
milliref = millis(); // mémorisation de la valeur de millis() courante
while (time > 0) // tant que la tempo n'est pas finie si une seconde s'est écoulée
{
if (millis() > (milliref + 1000)) {seconde = seconde - 1;time = time - 1;milliref = milliref + 1000;}
if (minute > 0) {if (seconde < 0) {minute--;seconde = 59;}}
if (heure > 0) {if (minute <= 0) {if (time == 3600 * heure - 1) { heure--; minute = 59;seconde = 59;}}}
//lcd.clear();
lcd.setCursor(0, 0);lcd.print("Extinction dans:");lcd.setCursor(4, 1);lcd.print("00:00:00");// Affiche le format du Compte à rebours
affich_tempo(heure,minute,seconde);
delay(100); // Délai de rafraichisement LCD
//lcd.clear();
// en cas d'appui sur le bouton rotatif
// rien
// si appui sur BP arret pendant le décompte on lance le sous programe d'arret
if (digitalRead (BPARRET) == LOW) {ARRET();}
if (time <= 0) // lorsque le compte à rebours est fini
{
val = LOW; //on initialise val à 0
lcd.clear();lcd.setCursor(2, 0);lcd.print("Carre eteint"); // Affiche carré éteint
digitalWrite(LEDS, LOW); // on éteint le carré
delay(3000);
lcd.clear();lcd.print("Carre en attente");lcd.setCursor(2, 1);lcd.print("d'activation");//et on affiche d'activation
}
}
}
void ARRET()
{
heure = 0;minute = 0;seconde = 0;
time = (seconde + (60 * minute) + (3600 * heure));
//val = LOW; //on initialise val à 0
ArretProg();
}
void GelProg () // - - - initialisation de l'écran en mode programme - - -
{
lcd.clear();lcd.setCursor(1, 0);lcd.print("Programmez");lcd.setCursor(4, 1);lcd.print("00:00:00"); // Affiche le format du Compte à rebours
Serial.print("valeur de val dans GelProg avant While : ");Serial.println(val);
if (!(digitalRead(PinSW)))
{
encoderPos = 0;
val = LOW;
ArretProg();
}
// - - - lecture de l'encodeur rotatif - - -
while ((digitalRead(PinSW)) && (val == HIGH))
{
Serial.print(" valeur de val après while dans GelProg : "); Serial.println(val);
lecture_PinCLK = digitalRead(PinCLK);//voie A
if (lecture_PinCLK!=PinCLKLast)//si chgt état sur voie A
{
if (digitalRead(PinDT) != lecture_PinCLK)//et voie B actionnée
{//Sens horaire
encoderPos++;
minute = minute + 15;
if ( encoderPos > ( nbPas - 1 ) ){encoderPos = 0;}
}
else
{//Sens antihoraire
encoderPos--;
minute = minute - 15;
if ( encoderPos < 0 ){encoderPos = nbPas;minute = 0;heure --;}
}
Imprime (); // on lance le sous programme d'impression sur le LCD
}
PinCLKLast = lecture_PinCLK;
}
}
void Imprime ()
{
lcd.clear();lcd.print("Appuyez pour Go");lcd.setCursor(4, 1);lcd.print("00:00:00"); // Affiche le format du Compte à rebours
if (minute > 59) {minute = 0;heure ++;}if (minute < 0) {minute = 0;heure --;}if (heure < 0) { heure = 0;}// Limite des minutes et des heures
affich_tempo(heure,minute,seconde);
time = (seconde + (60 * minute) + (3600 * heure)); // on met à jour le temps programé
// if (!(digitalRead(PinSW))) {
//encoderPos = 0; // Reset la position si on appui sur l'encodeur
//val = LOW; //on initialise val à 0
// ArretProg(); // On lance le sous programme ArretProg
// }
//delay(10); // Délais de rafraichisement LCD
}
void affich_tempo(int heure,int minute,int seconde)// affiche sur LCD les heures, minutes, secondes
{
if (heure >= 10) {lcd.setCursor(4, 1);} else {lcd.setCursor(5, 1);} lcd.print(heure);
if (minute >= 10) {lcd.setCursor(7, 1);} else {lcd.setCursor(8, 1);} lcd.print(minute);
if (seconde >= 10) {lcd.setCursor(10, 1);} else { lcd.setCursor(11, 1);} lcd.print(seconde);
}