/* 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;
}
}