#include "displ.h"
#include "kasa.h"
byte step = 0;
byte isbtnpsd = 0;
byte isbtnack = 0;
byte zadaniekusov = 0; // zadáva sa počet kusov, PLU, alebo cena?
byte pocetstlacenitlacidlaplu = 0; // počet stláčení tlačidla PLU
String psdbtn = "";
unsigned long pastms = 0;
unsigned long pastms2 = 0;
unsigned long pastms3 = 0;
unsigned long pastus = 0;
unsigned long noDetectTime = 0;
byte ison = 1;
void setup() {
zadanecislo = 0;
pinMode(2, OUTPUT); // row1
pinMode(3, OUTPUT); // row2
pinMode(4, OUTPUT); // row3
pinMode(5, OUTPUT); // row4
pinMode(6, INPUT_PULLUP); // col1
pinMode(7, INPUT_PULLUP); // col2
pinMode(8, INPUT_PULLUP); // col3
pinMode(9, INPUT_PULLUP); // col4
pinMode(10, INPUT_PULLUP); // col5
pinMode(11, INPUT_PULLUP); // col6
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(one, OUTPUT);
pinMode(ten, OUTPUT);
pinMode(hund, OUTPUT);
pinMode(thou, OUTPUT);
pinMode(tetho, OUTPUT);
pinMode(hutho, OUTPUT);
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(one, HIGH);
digitalWrite(ten, HIGH);
digitalWrite(hund, HIGH);
digitalWrite(thou, HIGH);
digitalWrite(tetho, HIGH);
digitalWrite(hutho, HIGH);
digitalWrite(38, HIGH);
pinMode(38, OUTPUT);
for(int i = 25; i < 28; i = i + 1) {
pinMode(i, OUTPUT);
digitalWrite(i, HIGH);
}
for(int i = 31; i < 38; i = i + 1) {
pinMode(i, OUTPUT);
digitalWrite(i, HIGH);
}
pinMode(29, OUTPUT); // battery indicator (one color, lights up when bat voltage < 3.2V)
pinMode(30, OUTPUT);
delay(100);
Serial.begin(9600);
num = (analogRead(A0) / 0.2047f) * 100; // measures and shows batt voltage
if(num < 3200) {digitalWrite(29, HIGH);} else {digitalWrite(29, LOW);}
pastms = millis();
pastus = micros();
wait(1000);
}
void loop() {
if(!digitalRead(6) && !digitalRead(2)) {psdbtn = "c/ON"; isbtnpsd = 1;} // obvious: clear/on (short press/long press)
else if(!digitalRead(6) && !digitalRead(3)) {psdbtn = "#/OFF"; isbtnpsd = 1;} // no sale / off (short press/long press)
else if(!digitalRead(7) && !digitalRead(2)) {psdbtn = "7"; isbtnpsd = 1;}
else if(!digitalRead(7) && !digitalRead(3)) {psdbtn = "4"; isbtnpsd = 1;}
else if(!digitalRead(7) && !digitalRead(4)) {psdbtn = "1"; isbtnpsd = 1;}
else if(!digitalRead(8) && !digitalRead(2)) {psdbtn = "8"; isbtnpsd = 1;}
else if(!digitalRead(8) && !digitalRead(3)) {psdbtn = "5"; isbtnpsd = 1;}
else if(!digitalRead(8) && !digitalRead(4)) {psdbtn = "2"; isbtnpsd = 1;}
else if(!digitalRead(8) && !digitalRead(5)) {psdbtn = "0"; isbtnpsd = 1;}
else if(!digitalRead(9) && !digitalRead(2)) {psdbtn = "9"; isbtnpsd = 1;}
else if(!digitalRead(9) && !digitalRead(3)) {psdbtn = "6"; isbtnpsd = 1;}
else if(!digitalRead(9) && !digitalRead(4)) {psdbtn = "3"; isbtnpsd = 1;}
else if(!digitalRead(9) && !digitalRead(5)) {psdbtn = "00"; isbtnpsd = 1;} // two zeros (just like adding machines have it)
else if(!digitalRead(10) && !digitalRead(2)) {psdbtn = "x/↑"; isbtnpsd = 1;} // x report (+ something else?)
else if(!digitalRead(10) && !digitalRead(3)) {psdbtn = "plu"; isbtnpsd = 1;} // product look-up
else if(!digitalRead(10) && !digitalRead(4)) {psdbtn = "a2"; isbtnpsd = 1;} // idk, someone educate
else if(!digitalRead(10) && !digitalRead(5)) {psdbtn = "a1"; isbtnpsd = 1;} // idk
else if(!digitalRead(11) && !digitalRead(2)) {psdbtn = "s/-"; isbtnpsd = 1;} // sale void/return
else if(!digitalRead(11) && !digitalRead(3)) {psdbtn = "perc"; isbtnpsd = 1;} // percentage (press after inputted value, so 123, %, and it'll show 1.23)
else if(!digitalRead(11) && !digitalRead(4)) {psdbtn = "st"; isbtnpsd = 1;} // subtotal (before tax, discounts, or rounding to nearest 0,05€?)
else if(!digitalRead(11) && !digitalRead(5)) {psdbtn = "tl"; isbtnpsd = 1;} // total (after tax? We have tax baked into the price in Europe, no?)
else {isbtnpsd = 0;}
switch(step) {
case 0:
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
break;
case 1:
digitalWrite(3, LOW);
digitalWrite(2, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
break;
case 2:
digitalWrite(4, LOW);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(2, HIGH);
break;
case 3:
digitalWrite(5, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(2, HIGH);
break;
case 4:
step = 254;
break;
}
if(isbtnpsd && (! isbtnack)) {
if((!(ison)) && psdbtn != "c/ON") {return;}
isbtnack = 1;
} else if((! isbtnpsd) && isbtnack) {
// Only reset after 20ms of no detection (full scan cycles)
if(noDetectTime == 0) noDetectTime = millis();
if(millis() - noDetectTime > 20) {
isbtnack = 0;
noDetectTime = 0;
}
} else if(isbtnpsd && isbtnack) {
noDetectTime = 0; // Reset timer if button detected again
}
step = step + 1;
dodisp();
dodisp2();
if((! ison)) {
nezobraz();
zobraz = -2;
zobraz2 = -2;
digitalWrite(a2, HIGH);
digitalWrite(b2, HIGH);
digitalWrite(c2, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(e2, HIGH);
digitalWrite(f2, HIGH);
digitalWrite(g2, HIGH);
digitalWrite(29, LOW);
delay(1);
keepoff();
}
}
void wait(unsigned long time) {
while(millis() - pastms < time) {dodisp();} // shows batt voltage for 5 seconds
num = 0;
dodisp();
pastms = millis();
pastus = micros();
}
void dodisp2() {
cislo2sto = ((num2 / 100) % 10);
cislo2desat = ((num2 / 10) % 10);
cislo2 = num2 % 10;
if(micros() - pastus > 5000) {
zobraz2 = zobraz2 + 1;
pastus = micros();
digitalWrite(a2, HIGH);
digitalWrite(b2, HIGH);
digitalWrite(c2, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(e2, HIGH);
digitalWrite(f2, HIGH);
digitalWrite(g2, HIGH);
}
if(zobraz2 >= 3) {zobraz2 = -1;}
switch(zobraz2) {
case 0:
zobraz2cislo = cislo2sto;
digitalWrite(one2, HIGH);
digitalWrite(ten2, HIGH);
digitalWrite(hun2, LOW);
break;
case 1:
zobraz2cislo = cislo2desat;
digitalWrite(one2, HIGH);
digitalWrite(hun2, HIGH);
digitalWrite(ten2, LOW);
break;
case 2:
zobraz2cislo = cislo2;
digitalWrite(hun2, HIGH);
digitalWrite(ten2, HIGH);
digitalWrite(one2, LOW);
break;
case -1:
digitalWrite(hun2, HIGH);
digitalWrite(ten2, HIGH);
digitalWrite(one2, HIGH);
break;
}
switch(zobraz2cislo) {
case 0:
digitalWrite(a2, LOW);
digitalWrite(b2, LOW);
digitalWrite(c2, LOW);
digitalWrite(d2, LOW);
digitalWrite(e2, LOW);
digitalWrite(f2, LOW);
digitalWrite(g2, HIGH);
break;
case 1:
digitalWrite(a2, HIGH);
digitalWrite(b2, LOW);
digitalWrite(c2, LOW);
digitalWrite(d2, HIGH);
digitalWrite(e2, HIGH);
digitalWrite(f2, HIGH);
digitalWrite(g2, HIGH);
break;
case 2:
digitalWrite(a2, LOW);
digitalWrite(b2, LOW);
digitalWrite(c2, HIGH);
digitalWrite(d2, LOW);
digitalWrite(e2, LOW);
digitalWrite(f2, HIGH);
digitalWrite(g2, LOW);
break;
case 3:
digitalWrite(a2, LOW);
digitalWrite(b2, LOW);
digitalWrite(c2, LOW);
digitalWrite(d2, LOW);
digitalWrite(e2, HIGH);
digitalWrite(f2, HIGH);
digitalWrite(g2, LOW);
break;
case 4:
digitalWrite(a2, HIGH);
digitalWrite(b2, LOW);
digitalWrite(c2, LOW);
digitalWrite(d2, HIGH);
digitalWrite(e2, HIGH);
digitalWrite(f2, LOW);
digitalWrite(g2, LOW);
break;
case 5:
digitalWrite(a2, LOW);
digitalWrite(b2, HIGH);
digitalWrite(c2, LOW);
digitalWrite(d2, LOW);
digitalWrite(e2, HIGH);
digitalWrite(f2, LOW);
digitalWrite(g2, LOW);
break;
case 6:
digitalWrite(a2, LOW);
digitalWrite(b2, HIGH);
digitalWrite(c2, LOW);
digitalWrite(d2, LOW);
digitalWrite(e2, LOW);
digitalWrite(f2, LOW);
digitalWrite(g2, LOW);
break;
case 7:
digitalWrite(a2, LOW);
digitalWrite(b2, LOW);
digitalWrite(c2, LOW);
digitalWrite(d2, HIGH);
digitalWrite(e2, HIGH);
digitalWrite(f2, HIGH);
digitalWrite(g2, HIGH);
break;
case 8:
digitalWrite(a2, LOW);
digitalWrite(b2, LOW);
digitalWrite(c2, LOW);
digitalWrite(d2, LOW);
digitalWrite(e2, LOW);
digitalWrite(f2, LOW);
digitalWrite(g2, LOW);
break;
case 9:
digitalWrite(a2, LOW);
digitalWrite(b2, LOW);
digitalWrite(c2, LOW);
digitalWrite(d2, LOW);
digitalWrite(e2, HIGH);
digitalWrite(f2, LOW);
digitalWrite(g2, LOW);
break;
}
}
void dodisp() {
present2 = micros();
if (num <= 9) {
cislodesat = 0;
cislodesat2 = 0;
cislosto = 0;
cislosto2 = 0;
cislotisic = 0;
cislotisic2 = 0;
cislodesattisic = 0;
cislodesattisic2 = 0;
cislostotisic = 0;
cislo = num;
}
if (num > 9) {
cislodesat = num / 10;
cislosto = num / 100;
cislotisic = num / 1000;
cislodesattisic = num / 10000;
cislostotisic = num / 100000;
intermid = cislodesat * 10;
intermid2 = cislosto * 10;
intermid3 = cislotisic * 10;
intermid4 = cislodesattisic * 10;
intermid5 = cislostotisic * 10;
cislodesat2 = cislodesat - intermid2;
cislosto2 = cislosto - intermid3;
cislotisic2 = cislotisic - intermid4;
cislodesattisic2 = cislodesattisic - intermid5;
cislo = num - intermid;
}
if (present2 - past2 >= 2500) {
nezobraz();
zobraz = zobraz + 1;
switch (zobraz) {
case 0:
c = 14;
d = 15;
zobrazCislo = cislostotisic;
zsts();
break;
case 1:
zobrazCislo = cislodesattisic2;
zdts();
break;
case 2:
zobrazCislo = cislotisic2;
ztis();
break;
case 3:
zobrazCislo = cislosto2;
if((!zadanieplu)) {
digitalWrite(30, LOW);
} else {digitalWrite(30, HIGH);}
zsto();
break;
case 4:
zobrazCislo = cislodesat2;
digitalWrite(30, HIGH);
// c = 15;
// d = 14; // do not forget to uncomment dynamic rewiring if you need it irl
zdst();
break;
case 5:
zobrazCislo = cislo;
// c = 15;
// d = 14;
zjdn();
break;
}
if (zobraz >= 6) {
zobraz = -1;
}
past2 = present2;
}
switch (zobrazCislo) {
case 0:
z0();
break;
case 1:
z1();
break;
case 2:
z2();
break;
case 3:
z3();
break;
case 4:
z4();
break;
case 5:
z5();
break;
case 6:
z6();
break;
case 7:
z7();
break;
case 8:
z8();
break;
case 9:
z9();
break;
}
}
void z1() {
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void z2() {
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}
void z3() {
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}
void z4() {
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void z5() {
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void z6() {
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void z7() {
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void z8() {
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void z9() {
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void z0() {
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
void zjdn() {
digitalWrite(one, LOW);
digitalWrite(ten, HIGH);
digitalWrite(hund, HIGH);
digitalWrite(thou, HIGH);
digitalWrite(tetho, HIGH);
digitalWrite(hutho, HIGH);
}
void zdst() {
digitalWrite(one, HIGH);
digitalWrite(ten, LOW);
digitalWrite(hund, HIGH);
digitalWrite(thou, HIGH);
digitalWrite(tetho, HIGH);
digitalWrite(hutho, HIGH);
}
void zsto() {
digitalWrite(one, HIGH);
digitalWrite(ten, HIGH);
digitalWrite(hund, LOW);
digitalWrite(thou, HIGH);
digitalWrite(tetho, HIGH);
digitalWrite(hutho, HIGH);
}
void ztis() {
digitalWrite(one, HIGH);
digitalWrite(ten, HIGH);
digitalWrite(hund, HIGH);
digitalWrite(thou, LOW);
digitalWrite(tetho, HIGH);
digitalWrite(hutho, HIGH);
}
void zdts() {
digitalWrite(one, HIGH);
digitalWrite(ten, HIGH);
digitalWrite(hund, HIGH);
digitalWrite(thou, HIGH);
digitalWrite(tetho, LOW);
digitalWrite(hutho, HIGH);
}
void zsts() {
digitalWrite(one, HIGH);
digitalWrite(ten, HIGH);
digitalWrite(hund, HIGH);
digitalWrite(thou, HIGH);
digitalWrite(tetho, HIGH);
digitalWrite(hutho, LOW);
}
void nezobraz() {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(one, HIGH);
digitalWrite(ten, HIGH);
digitalWrite(hund, HIGH);
digitalWrite(thou, HIGH);
digitalWrite(tetho, HIGH);
digitalWrite(hutho, HIGH);
}
void keepoff() {
digitalWrite(one2, HIGH);
digitalWrite(ten2, HIGH);
digitalWrite(hun2, HIGH);
delay(1);
Serial.end();
}
void turnon() {pastms2 = millis();
Serial.end();
while(millis() - pastms2 < 100) {}
digitalWrite(38, LOW); // reset the 'duino
}
void numplace(byte cisloztlacitka) {
zadanecislo = zadanecislo * 10;
zadanecislo = zadanecislo + cisloztlacitka;
}
void zadajplu() {
cenapolozka = pgm_read_float(&plucena[cisloplu]);
zadanecislo = 0;
}