/* 
   Générateur BF de 10 hertz à 50000 hertz
   Le bouton ouvre le menu: PAS
   
   Copyright (C) 2023, Uri F1FRH
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // adresse et format de lécran LCD
const int ENCODER_CLK =2; // attribut la valeur 2 à la variable "ENCODER_CLK"
const int ENCODER_DT  =3; // attribut la valeur 3 à la variable "ENCODER_DT"
const int ENCODER_SW =4; // attribut la valeur 4 à la variable "ENCODER_SW"
int compteur = 1000;
void setup() {
  // Initialise LCD
   lcd.init();
   lcd.backlight(); // allume le rétro_éclairage
  // Initialise les PIN de l"encodeur
   pinMode(ENCODER_CLK, INPUT);
   pinMode(ENCODER_DT, INPUT);
   pinMode(ENCODER_SW, INPUT_PULLUP);
   attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING); // action sur front descendant
}
void readEncoder() {
  int dtValeur = digitalRead(ENCODER_DT);
  if (dtValeur == HIGH) {
    compteur=compteur+100; // Clockwise
   if (compteur >50000) {compteur=50000;}
  }
  if (dtValeur == LOW) {
    compteur=compteur-100; // Counterclockwise
     if (compteur <=10) {compteur=10;}
  }
}
// désactive les interrutions pendant la lecture pour que la valeur ne change pas
int getCompteur() {
  int result;
  noInterrupts();
  result = compteur;
  interrupts();
  return result;
}
void resetCompteur() {
  noInterrupts();
  compteur =1000;
  interrupts();
}
void loop() {
  lcd.setCursor(3, 0);
  lcd.print("Frequence:");
  lcd.setCursor(4, 1);
  lcd.print(getCompteur());
  lcd.print(" Htz");
  lcd.print("        ");
  if (digitalRead(ENCODER_SW) == LOW) {
    resetCompteur();
  }
}