1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| #include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // 2 lignes de 16 caractères à l'addresse 0x27
#define pinPot A0 // broche du potentiomètre
#define pinRelay 8 // broche du relay is connected
#define pinReset 3 // broche du reset (interruption)
#define pinStart 2 // broche du start
int btnStartLast = 1; // Dernier état du bouton Start
volatile uint32_t dT = 0; // Durée programmée d'activation du relais
const uint32_t dTmin = 2000; // Temp d'activalion minimal (ms)
uint32_t T_start; // Temps du début d'activalion (ms)
uint32_t T_display; // Temps (ms) du dernier affichage
const uint32_t dT_display = 500; // Attente (ms) entre 2 affichages
bool RelayOn = true; // Relais inactivé par loop au début
const bool RelayOn_Level = true; // false pour inverser la commande relais
char Txt[17] = ""; // Tampon de 16 caractères + /0 terminal
// Interruption de Reset___________________________________________________________________________
void IntReset() {
dT = 0; // Ailleurs, dT devrait être copié en section
} // critique mais cela n'a pas d'importance ici
// Setup___________________________________________________________________________________________
void setup() {
pinMode(pinRelay, OUTPUT); // pinRelay est une sortie
pinMode(pinReset, INPUT_PULLUP); // pinReset est une entrée avec pullup
pinMode(pinStart, INPUT_PULLUP); // pinStart est une entrée avec pullup
digitalWrite(pinRelay, !RelayOn_Level);
Serial.begin(9600); // initialiser la liaison série à 9600 Bauds
lcd.begin(); // initialiser l'afficheur LCD
lcd.backlight(); // Eclairage du fond d'affichage
lcd.clear();
attachInterrupt(digitalPinToInterrupt(pinReset), IntReset, FALLING);
T_start = millis();
T_display = T_start;
dT_display = 500;
}
// Loop____________________________________________________________________________________________
void loop() {
uint32_t T = millis();
if(RelayOn) {
if(T - T_start >= dT) { // Fin ? .........................................
digitalWrite(pinRelay, !RelayOn_Level);
RelayOn = false; // Relais OFF
lcd.setCursor(0, 1);
lcd.print(F("Relais OFF "));
Serial.println("Relais OFF");
}
else {
if(T - T_display >= dT_display) { // Affichage ? ...................................
uint32_t T2Off = dT - (T - T_start); // Temps restant en ms
sprintf(Txt,"Reste %6d ms ", T2Off); // "Reste xxxxxx ms " soit 16 caractères
lcd.setCursor(0, 1);
lcd.print(Txt);
Serial.print(Txt);
T_display = T;
}
}
}
else {
int btnStart = digitalRead(pinStart); // Nouvel état du bouton Start
if(btnStart < btnStartLast) { // Début ? .......................................
btnStartLast = btnStart;
delay(10); // Antirebond nécessaire
dT = analogRead(pinPot)*100; // Durée d'activation en ms (0 à 102 300 ms)
if(dT < dTmin) dT = dTmin;
uint32_t dT_sec = dT / 1000; // En s (0 à 102)
sprintf(Txt,"Duree %3d.%3d s ", dT_sec, dT - 1000*dT_sec);
lcd.setCursor(0, 0);
lcd.print(Txt);
Serial.print(Txt);
T_display = T - dT_display; // Pour forcer l'affichage au loop suivant
RelayOn = true;
T_start = millis();
digitalWrite(pinRelay, RelayOn_Level);
}
}
} |
Partager