/* Odskakovanje kontaktov
1. -števec odskakuje,
2. -preprečitev oskakovanja kontaktov (funkcija millis)
3. -zunanja prekinitev (attachinterrupt : "https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/"),
4. -zunanja prekinitev + preprečevanje odskakovanja kontaktov,
5. -uporaba knjižnice bounce2.h */

/* // 1.

#define tipka 7
// define prihrane na prostoru?
int stevec = 0;
bool zadnjeStanje = HIGH;

void setup() {
  Serial.begin(115200);
  pinMode(tipka, INPUT_PULLUP);


}

void loop() {
  bool stanje = digitalRead(tipka);
  if (zadnjeStanje != stanje) {
    stevec += 1;
    zadnjeStanje = stanje;
    Serial.println(stevec);
  }
}
*/


/* // 2. 

#define tipka 7
bool zadnjeStanje = HIGH;
int stevec = 0;
unsigned long zadnjiOdboj = 0;
// unsigned nima predznaka, long zasede 4 byte, int 2
int zakasnitevOdboja = 200;

void setup() {
  Serial.begin(115200);
  pinMode(tipka, INPUT_PULLUP);
}

void loop() {
  bool stanje = digitalRead(tipka);
  if (stanje != zadnjeStanje && (millis() - zadnjiOdboj) > zakasnitevOdboja) {
    zadnjiOdboj = millis();
    zadnjeStanje = stanje;
    if (zadnjeStanje = HIGH) {
      stevec++;
      Serial.println(stevec);
    }
  }
}
*/
/*
// 3. 
// zunanji interrupt dela le na pinu 2 in 3.
#define tipka 2
#define ledPin 8
volatile bool stanje = LOW;
// volatile pomeni, da je spremnljivka v glavni in prekinitveni funkciji

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(tipka, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(tipka), ISR_tipka, FALLING);
  //              Pin interrupta, ime funkcije, kdaj se kliče funkcija
}

void loop() {
  digitalWrite(ledPin, stanje);
}

void ISR_tipka() {
  stanje = !stanje;
}
*/
/*
// 4.

#define tipka 2
#define ledPin 8
volatile bool stanje = LOW;
unsigned long zadnjiOdboj = 0;
int zakasnitevOdboja = 200;
int stevec = 0;
int counter = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(tipka, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(tipka), ISR_tipka, FALLING);
  //              Pin interrupta, ime funkcije, kdaj se kliče funkcija
  Serial.begin(115200);
}

void loop() {
  digitalWrite(ledPin, stanje);
}

void ISR_tipka() {
  if ((millis() - zadnjiOdboj) > zakasnitevOdboja) {
    stanje = !stanje;
    zadnjiOdboj = millis();
    stevec ++;
    Serial.print("Števec: "); 
    Serial.println(stevec);
  }
  counter ++;
  Serial.print("Counter: "); 
  Serial.println(counter);
}
*/

/* // 5.

// "https://www.arduino.cc/reference/en/libraries/bounce2/"

#include <Bounce2.h>
#define tipka_Gre 3
#define tipka_Red 2
#define ledRed 8
int stevec = 0;

Bounce2::Button tipka1, tipka2 = Bounce2::Button();

void setup() {
  tipka1.attach(tipka_Gre, INPUT_PULLUP);
  tipka2.attach(tipka_Red, INPUT_PULLUP);
  tipka1.interval(10);
  tipka2.interval(10);
  tipka1.setPressedState(LOW);
  tipka2.setPressedState(LOW);
  Serial.begin(115200);
}

void loop() {
  tipka1.update();
  tipka2.update();
  if (tipka1.pressed()) {
    stevec ++;
    Serial.println(stevec);
  }
  if (tipka2.pressed()) {
    stevec --;
    Serial.println(stevec);
  }
}
*/
/* Vaja:
tipka 1 = stevec++,
tipka 2 = stevec--,
tipka 3 = stevec 0,
tipka 4 = zunanja prekinitev + millis(), prižge led diodo
LCD display = stevec
              Led off/on
*/

#include <LiquidCrystal.h>
#include <Bounce2.h>
#define buttRed 3
#define buttGre 4
#define buttYel 5
#define buttBlu 2
#define LED 6
int stevec = 0;
unsigned long zadnjiOdboj = 0;
int Zakasnitev = 200;
volatile bool stanje = LOW;
volatile bool InterruptCheck = LOW;
LiquidCrystal lcd (12, 11, 10, 9, 8, 7);
Bounce2::Button tipka1, tipka2 = Bounce2::Button(), tipka3 = Bounce2::Button();

void setup() {
  lcd.begin(16, 2);
  pinMode(buttBlu, INPUT_PULLUP);
  Serial.begin(115200);
  lcd.setCursor(0, 0);
  lcd.print(stevec);
  lcd.setCursor(0, 1);
  lcd.print("LED: ");
  if (stanje == HIGH) {
    lcd.setCursor(5, 1);
    lcd.print("ON ");
  }
  else {
    lcd.setCursor(5, 1);
    lcd.print("OFF");
  }
  tipka1.attach(buttRed, INPUT_PULLUP);
  tipka2.attach(buttGre, INPUT_PULLUP);
  tipka3.attach(buttYel, INPUT_PULLUP);
  tipka1.interval(10);
  tipka2.interval(10);
  tipka3.interval(10);
  tipka1.setPressedState(LOW);
  tipka2.setPressedState(LOW);
  tipka3.setPressedState(LOW);
  attachInterrupt(digitalPinToInterrupt(buttBlu), ISR_tipka, FALLING);
}

void loop() {
  tipka1.update();
  tipka2.update();
  tipka3.update();

  if (tipka1.pressed()) {
    stevec ++;
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 0);
    lcd.print(stevec);
  }
  if (tipka2.pressed()) {
    stevec --;
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 0);
    lcd.print(stevec);
  }
  if (tipka3.pressed()) {
    stevec = 0;
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 0);
    lcd.print(stevec);
  }
  if (InterruptCheck == HIGH) {
    delay(100);
    digitalWrite(LED, stanje);
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 0);
    lcd.print(stevec);
    lcd.setCursor(0, 1);
    lcd.print("LED: ");
    if (stanje == HIGH) {
      lcd.setCursor(5, 1);
      lcd.print("ON ");
    }
    else {
      lcd.setCursor(5, 1);
      lcd.print("OFF");
    }
    InterruptCheck = LOW;
  }
}

void ISR_tipka () {
  lcd.clear();
  if ((millis() - zadnjiOdboj) > Zakasnitev) {
    zadnjiOdboj = millis();
    stanje = !stanje;
    InterruptCheck = HIGH;
  }
}