#define SEGMENT_ON HIGH
#define SEGMENT_OFF LOW
#define DIGIT_ON 0
#define DIGIT_OFF 255
//výstupy připojených číslic
byte digit[4] = {10,11,9,3};
byte bright_on = DIGIT_ON;
byte bright_off = DIGIT_OFF;
//výstupy segmentů čísle A-G a DP
byte seg[8] = {12,7,5,13,2,8,6,4};
//mapa číslic segment A B C D E F G
byte number[11][7] = {{1,1,1,1,1,1,0}, //0
{0,1,1,0,0,0,0}, //1
{1,1,0,1,1,0,1}, //2
{1,1,1,1,0,0,1}, //3
{0,1,1,0,0,1,1}, //4
{1,0,1,1,0,1,1}, //5
{1,0,1,1,1,1,1}, //6
{1,1,1,0,0,0,0}, //7
{1,1,1,1,1,1,1}, //8
{1,1,1,1,0,1,1}, //9
{0,0,0,0,0,0,0}}; //nic
//jednotlivé číslice
byte value[4] = {7,1,5,3}; // číslice k zobrazení
byte dot = 1; // pozice desetiné tečky, >4 vypnuto
//funkce pro výpis číslic z pole value[]
void show() {
byte l;
for (int v=0;v < 4;v++) { // číslice 1 až 4
analogWrite(digit[v],bright_on); //zapne číslici
for ( int s=0;s < 7; s++) { //jeden segment za druhým
if (number[value[v]][s] == 1) l = SEGMENT_ON; //řádek number dle hodnoty v value[v]
else l = SEGMENT_OFF;
digitalWrite(seg[s], l); //zapne segment
}
if (dot == v) digitalWrite(seg[7], SEGMENT_ON); //zapne desetinou tečku
delay(1); // svíti milisekundu v cyklu
analogWrite(digit[v],bright_off); //vypne číslici
for ( int s=0;s < 7; s++) { //vynulovat segment
digitalWrite(seg[s], SEGMENT_OFF);
}
digitalWrite(seg[7], SEGMENT_OFF); //vypne tečku
}
}
void set_value(float v) {
String s = String(v); //převede číslo na text
for (int d=0; d<4; d++){ //vnořený cyklus, jedna číslice za druhou
value[d] = s.substring(d,d+1).toInt(); // uloží číslice do pole value
}
}
//funkce nastavení výstupu a vypnutí všech LED
void reset7() {
for (int d=0; d < 4; d++) {
pinMode(digit[d], OUTPUT);
analogWrite(digit[d], DIGIT_OFF);
}
for (int s=0; s < 8; s++) {
pinMode(seg[s], OUTPUT);
digitalWrite(seg[s], SEGMENT_OFF);
}
}
void setup() {
reset7(); //nastavení vývodu
set_value(2345); //převod čísla na číslice.
}
void loop() {
show();
//delay(10);
}