Advertisement
miklik

ArduTemp1-10

Jan 28th, 2024
918
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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[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
  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.     for (int d=0; d<4; d++){              //vnořený cyklus, jedna číslice za druhou
  64.       if ( d == 0 and f < 0) {            // pokud je teplota - a první číslice
  65.         value[d] = 13;                    // první znak mínus
  66.       } else {
  67.         value[d] = s.substring(d,d+1).toInt();
  68.       }
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement