View difference between Paste ID: rdZ1y7is and VQn3bpV5
SHOW: | | - or go back to the newest paste.
1
#define SEGMENT_ON HIGH
2
#define SEGMENT_OFF LOW
3
#define DIGIT_ON 0
4
#define DIGIT_OFF 255
5
6
//výstupy připojených číslic
7
byte digit[4] = {10,11,9,3};
8
byte bright_on = DIGIT_ON;
9
byte bright_off = DIGIT_OFF;
10
11
//výstupy segmentů čísle A-G a DP
12
byte seg[8] = {12,7,5,13,2,8,6,4};
13
14
//mapa číslic  segment A B C D E F G
15-
byte number[13][7] = {{1,1,1,1,1,1,0},   //0
15+
byte number[14][7] = {{1,1,1,1,1,1,0},   //0
16
                      {0,1,1,0,0,0,0},   //1
17
                      {1,1,0,1,1,0,1},   //2
18
                      {1,1,1,1,0,0,1},   //3
19
                      {0,1,1,0,0,1,1},   //4
20
                      {1,0,1,1,0,1,1},   //5
21
                      {1,0,1,1,1,1,1},   //6
22
                      {1,1,1,0,0,0,0},   //7
23
                      {1,1,1,1,1,1,1},   //8
24
                      {1,1,1,1,0,1,1},   //9
25
                      {0,0,0,0,0,0,0},   //nic
26
                      {1,0,0,1,1,1,1},   //E
27-
                      {0,0,0,0,1,0,1}};  //r
27+
                      {0,0,0,0,1,0,1},   //r
28
                      {0,0,0,0,0,0,1}};  //-
29
                      
30
31
//jednotlivé číslice
32
byte value[4] = {7,1,5,3};           // číslice k zobrazení
33
byte dot = 4;                        // pozice desetiné tečky, >4 vypnuto
34
35
//teplota
36
float t;
37
38
//funkce pro výpis číslic z pole value[]
39
void show() {
40
  byte l;
41
  for (int v=0;v < 4;v++) {                 // číslice 1 až 4
42
    analogWrite(digit[v],bright_on);        //zapne číslici
43
    for ( int s=0;s < 7; s++) {             //jeden segment za druhým
44
      if (number[value[v]][s] == 1) l = SEGMENT_ON;    //řádek number dle hodnoty v value[v]
45
      else l = SEGMENT_OFF;
46
      digitalWrite(seg[s], l);             //zapne segment
47
    }
48
    if (dot == v) digitalWrite(seg[7], SEGMENT_ON);     //zapne desetinou tečku
49
    delay(1);                               // svíti milisekundu v cyklu
50
    analogWrite(digit[v],bright_off);       //vypne číslici
51
    for ( int s=0;s < 7; s++) {             //vynulovat segment
52
      digitalWrite(seg[s], SEGMENT_OFF);              
53
    }
54
    digitalWrite(seg[7], SEGMENT_OFF);      //vypne tečku
55
  }  
56
}
57
58
void set_value(float f) {
59
  if ( f < 10000) {
60
    String s = String(f).substring(0,5);
61
    dot = s.indexOf('.') - 1;
62
    s.remove(dot+1,1);
63-
      value[d] = s.substring(d,d+1).toInt();
63+
64
      if ( d == 0 and f < 0) {            // pokud je teplota - a první číslice
65-
  } else {
65+
        value[d] = 13;                    // první znak mínus
66-
    value[0] = 10;
66+
      } else {
67-
    value[1] = 11;
67+
        value[d] = s.substring(d,d+1).toInt();
68-
    value[2] = 12;
68+
      }
69-
    value[3] = 12;
69+
70
  } else {                                // teplota je větší než 9999
71
    value[0] = 10;                        // 
72
    value[1] = 11;                        // E
73
    value[2] = 12;                        // r
74
    value[3] = 12;                        // r
75
  }  
76
}
77
78
//přečte hdnotu z termistoru a převede ji na teplotu
79
float read_temperature() {
80
  //const float BETA = 3950; // should match the Beta Coefficient of the thermistor
81
  const float BETA = 3600; // https://www.tme.eu/cz/details/ntcc-1k/merici-termistory-ntc-tht/sr-passives/
82
  int analogValue = analogRead(A0);
83
  //https://docs.wokwi.com/parts/wokwi-ntc-temperature-sensor
84
  float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
85
  return celsius;
86
}
87
88
//funkce nastavení výstupu a vypnutí všech LED
89
void reset7() {
90
  for (int d=0; d < 4; d++) {
91
    pinMode(digit[d], OUTPUT);
92
    analogWrite(digit[d], DIGIT_OFF);
93
  }
94
95
  for (int s=0; s < 8; s++) {
96
    pinMode(seg[s], OUTPUT);
97
    digitalWrite(seg[s], SEGMENT_OFF);
98
  }
99
}
100
101
void setup() {
102
  reset7();            //nastavení vývodu
103
  pinMode(A0, INPUT);
104
}
105
106
void loop() {
107
  t = read_temperature();
108
  set_value(t);
109
  show();
110
}