// speedometer goes to 99.99km/h
float time = 1000000; // speed
float vel = 0;
float itmd = 0;
float itmd2 = 0; // speed
float itmd3 = 0;
unsigned long count = 0;
float km = 0;
int num = 0;
int cislo = 0; // start of display values
int cislodesat = 0;
int cislodesat2 = 0;
int cislosto = 0;
int cislosto2 = 0;
int cislotisic = 0;
int zobraz = 0;
int zobrazCislo = 0;
int intermid = 0;
int intermid2 = 0;
int intermid3 = 0;
unsigned long present = 0;
unsigned long past = 0;
unsigned long present2 = 0;
unsigned long past2 = 0;
unsigned long past3 = 0;
unsigned long present4 = 0;
unsigned long past4 = 0;
void setup() {
pinMode(10, OUTPUT);
pinMode(11, OUTPUT); // digits (pnp)
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT); // segments (direct)
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(A1, OUTPUT); // decimal point
pinMode(2, INPUT_PULLUP);
pinMode(A0, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), zeroing, FALLING);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
void nezobraz() {
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
void zobrazTis() {
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
digitalWrite(10, LOW);
}
void zobrazSto() {
digitalWrite(10, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
digitalWrite(11, LOW);
}
void zobrazDes() {
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
}
void zobrazJdn() {
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(10, HIGH);
digitalWrite(13, LOW);
}
void z0() {
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
}
void z1() {
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
void z2() {
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
}
void z3() {
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
}
void z4() {
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void z5() {
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void z6() {
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void z7() {
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
void z8() {
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void z9() {
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void zeroing() {
time = present - past;
count = count + 1;
past = present;
past3 = present2;
}
void loop() {
if (num > 9) {
cislodesat = num / 10;
cislosto = num / 100;
cislotisic = num / 1000;
intermid = cislodesat * 10;
intermid2 = cislosto * 10;
intermid3 = cislotisic * 10;
}
if (num <= 9) {
cislodesat = 0;
cislodesat2 = 0;
cislosto = 0;
cislosto2 = 0;
cislotisic = 0;
cislo = num;
}
if (num > 9 && num <= 99) {
cislodesat2 = cislodesat - intermid2;
cislosto2 = cislosto - intermid3;
cislo = num - intermid;
}
if (num > 99 && num <= 999) {
cislodesat2 = cislodesat - intermid2;
cislosto2 = cislosto - intermid3;
cislo = num - intermid;
}
if(num >= 999) {
cislodesat2 = cislodesat - intermid2;
cislosto2 = cislosto - intermid3;
cislo = num - intermid;
}
if(present2 - past2 >= 500) {
itmd = 1000 / time;
itmd2 = itmd * 2194;
itmd3 = itmd2 * 3600;
vel = itmd3 / 1000000;
km = count * 0.002194;
past2 = present2;
}
if(present2 - past3 >= 5000 && time <= 2000000000) {
time = time + 1000;
past = present - 200;
}
if(vel >= 99.99) {
vel = 99.99;
}
if(digitalRead(A0) == HIGH) {
num = vel * 100;
}
if(digitalRead(A0) == LOW) {
num = km * 100;
}
present = millis(); // speed
present2 = millis(); // display refresh, processing delays, non-blocking
present4 = micros(); // display
if(present4 - past4 >= 6600) {
zobraz = zobraz + 1;
nezobraz();
switch (zobraz) {
case 0:
zobrazCislo = cislotisic;
zobrazTis();
break;
case 1:
zobrazCislo = cislosto2;
zobrazSto();
digitalWrite(A1, LOW);
break;
case 2:
zobrazCislo = cislodesat2;
digitalWrite(A1, HIGH);
zobrazDes();
break;
case 3:
zobrazCislo = cislo;
zobrazJdn();
break;
}
past4 = present4;
}
if(zobraz >= 4) {
zobraz = -1;
}
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;
}
}