#include <JC_Button.h>
// Configuration du bouton
const uint8_t BUTTON_PIN = 12; // PIN10(pullup) -- poussoir + 100nF // -- GND
Button myButton(BUTTON_PIN);
// Configuration du relais
const uint8_t RELAIS_PIN = 0; // PIN0 -- R 10kΩ -- base NPN
bool isWorking = false; // true quand le relais est fermé
unsigned long msEndWorking = 0; // instant de la fin de fonctt du relais
// constantes de durées
const unsigned long MIN_COURT = 30;
const unsigned long MAX_COURT = 400;
const unsigned long MIN_LONG = 600;
const unsigned long MAX_LONG = 1200;
const unsigned long MIN_SILENCE = 2000; // si tu reviens j'annule pas tout
const unsigned long DUREE_RELAIS = 5000; // le relais reste collé 5 s
// variables pour les clics
unsigned long msPress = 0; // instant de l'appui
unsigned long msLache = 0; // instant du relâchement
bool isTyping = false; // true quand il y a eu un appui récent (< MIN_SILENCE)
// variables pour le code
static uint8_t codeStep = 0; // rang du clic
static uint8_t saisie[4] = {0, 0, 0, 0}; // 0 pour un clic de durée incorrecte, 1 court et 2 long
static uint8_t secret[4] = {2, 2, 1, 1}; // prévoir la mémorisation et la modification dans la version 2
bool testCode() {
for (int i = 0; i < 4; i++) {
if (saisie[i] != secret[i]) {
return false;
}
}
return true;
}
void setup() {
Serial.begin(115200);
myButton.begin();
pinMode(RELAIS_PIN, OUTPUT);
digitalWrite(RELAIS_PIN, LOW);
delay(1000);
Serial.println("démarrage...");
}
void loop() {
myButton.read(); // Lecture de l'état du bouton
if ( myButton.wasPressed() )
{
isTyping = true;
msPress = myButton.lastChange();
}
if ( myButton.wasReleased() )
{
msLache = myButton.lastChange() - msPress;
if ((msLache < MAX_COURT) && (msLache > MIN_COURT)) {
// clic court
Serial.println("CLIC COURT");
if (codeStep < 4) {saisie[codeStep] = 1;}
} else {
if ((msLache < MAX_LONG) && (msLache > MIN_LONG)) {
// clic long
Serial.println("CLIC LONG");
if (codeStep < 4) {saisie[codeStep] = 2;}
} else {
// mauvais clic, ni court ni long
Serial.print("MAUVAIS CLIC(");Serial.print(msLache);Serial.println(", ");Serial.print(msPress);Serial.println(")");
if (codeStep < 4) {saisie[codeStep] = 0;}
}
}
codeStep++;
// tester le code si codeStep = 4
if (codeStep == 4) {
if (testCode()) {
// code OK
Serial.println("CODE OK");
Serial.println("Fermeture relais");
digitalWrite(RELAIS_PIN, HIGH);
isWorking = true;
msEndWorking = millis() + DUREE_RELAIS;
} else {
// code pas OK, sale pirate
isWorking = false;
msEndWorking = 0;
Serial.println("TIPIAK !!");
}
}
}
if ((isWorking) && (millis() > msEndWorking)) {
// fin du relais
digitalWrite(RELAIS_PIN, LOW);
isWorking = false;
msEndWorking = 0;
Serial.println("Ouverture relais");
}
if (isTyping) {
if (myButton.isReleased() && millis() - myButton.lastChange() > MIN_SILENCE) {
Serial.print("Relacher:");Serial.println(msPress + msLache);
Serial.print("Temps:");Serial.println(millis());
Serial.print("Diff:");Serial.print(millis() - (msPress + msLache));Serial.println("");
Serial.println("dodo............");
// silence trop long, t'es pas revenue, j'annule tout
isTyping = false;
memset(saisie, 0, sizeof(saisie));
msLache = 0;
codeStep = 0;
}
}
}