Advertisement
miklik

ArduTemp1-11

Feb 5th, 2024
922
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.10 KB | Source Code | 0 0
  1. #define SEGMENT_ON HIGH
  2. #define SEGMENT_OFF LOW
  3. #define DIGIT_ON_HIGH 100
  4. #define DIGIT_ON_LOW 240
  5. #define DIGIT_OFF 255
  6.  
  7. //výstupy připojených číslic
  8. byte digit[4] = {10,11,9,3};
  9. byte bright_on = DIGIT_ON_HIGH;
  10. byte bright_off = DIGIT_OFF;
  11.  
  12. //výstupy segmentů čísle A-G a DP
  13. byte seg[8] = {12,7,5,13,2,8,6,4};
  14.  
  15. //mapa číslic  segment A B C D E F G
  16. byte number[14][7] = {{1,1,1,1,1,1,0},   //0
  17.                       {0,1,1,0,0,0,0},   //1
  18.                       {1,1,0,1,1,0,1},   //2
  19.                       {1,1,1,1,0,0,1},   //3
  20.                       {0,1,1,0,0,1,1},   //4
  21.                       {1,0,1,1,0,1,1},   //5
  22.                       {1,0,1,1,1,1,1},   //6
  23.                       {1,1,1,0,0,0,0},   //7
  24.                       {1,1,1,1,1,1,1},   //8
  25.                       {1,1,1,1,0,1,1},   //9
  26.                       {0,0,0,0,0,0,0},   //nic
  27.                       {1,0,0,1,1,1,1},   //E
  28.                       {0,0,0,0,1,0,1},   //r
  29.                       {0,0,0,0,0,0,1}};  //-
  30.                      
  31.  
  32. //jednotlivé číslice
  33. byte value[4] = {7,1,5,3};           // číslice k zobrazení
  34. byte dot = 4;                        // pozice desetiné tečky, >4 vypnuto
  35.  
  36. //teplota
  37. float t;
  38.  
  39. //funkce pro výpis číslic z pole value[]
  40. void show() {
  41.   byte l;
  42.   for (int v=0;v < 4;v++) {                 // číslice 1 až 4
  43.     analogWrite(digit[v],bright_on);        //zapne číslici
  44.     for ( int s=0;s < 7; s++) {             //jeden segment za druhým
  45.       if (number[value[v]][s] == 1) l = SEGMENT_ON;    //řádek number dle hodnoty v value[v]
  46.       else l = SEGMENT_OFF;
  47.       digitalWrite(seg[s], l);             //zapne segment
  48.     }
  49.     if (dot == v) digitalWrite(seg[7], SEGMENT_ON);     //zapne desetinou tečku
  50.     delay(5);                               // svíti milisekundu v cyklu
  51.     analogWrite(digit[v],bright_off);       //vypne číslici
  52.     for ( int s=0;s < 7; s++) {             //vynulovat segment
  53.       digitalWrite(seg[s], SEGMENT_OFF);              
  54.     }
  55.     digitalWrite(seg[7], SEGMENT_OFF);      //vypne tečku
  56.   }  
  57. }
  58.  
  59. void set_value(float f) {
  60.   if ( f < 10000) {
  61.     String s = String(f).substring(0,5);
  62.     dot = s.indexOf('.') - 1;
  63.     s.remove(dot+1,1);
  64.     for (int d=0; d<4; d++){              //vnořený cyklus, jedna číslice za druhou
  65.       if ( d == 0 and f < 0) {            // pokud je teplota - a první číslice
  66.         value[d] = 13;                    // první znak mínus
  67.       } else {
  68.         value[d] = s.substring(d,d+1).toInt();
  69.       }
  70.     }
  71.   } else {                                // teplota je větší než 9999
  72.     value[0] = 10;                        //
  73.     value[1] = 11;                        // E
  74.     value[2] = 12;                        // r
  75.     value[3] = 12;                        // r
  76.   }  
  77. }
  78.  
  79. //přečte hdnotu z termistoru a převede ji na teplotu
  80. float read_temperature() {
  81.   //const float BETA = 3950; // should match the Beta Coefficient of the thermistor
  82.   const float BETA = 3600; // https://www.tme.eu/cz/details/ntcc-1k/merici-termistory-ntc-tht/sr-passives/
  83.   int analogValue = analogRead(A0);
  84.   //https://docs.wokwi.com/parts/wokwi-ntc-temperature-sensor
  85.   float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  86.   return celsius;
  87. }
  88.  
  89. //přečte hdnotu z fotodporu a převede ji na požadovanou PWM (100-240) hodnotu
  90. float read_light() {
  91.   int analogValue = analogRead(A1);
  92.   int pwm_light = map(analogValue, 0, 390, DIGIT_ON_HIGH, DIGIT_ON_LOW);
  93.   //int pwm_light = analogValue; // pro testování fotoodporu
  94.   return pwm_light;
  95. }
  96.  
  97. //funkce nastavení výstupu a vypnutí všech LED
  98. void reset7() {
  99.   for (int d=0; d < 4; d++) {
  100.     pinMode(digit[d], OUTPUT);
  101.     analogWrite(digit[d], DIGIT_OFF);
  102.   }
  103.  
  104.   for (int s=0; s < 8; s++) {
  105.     pinMode(seg[s], OUTPUT);
  106.     digitalWrite(seg[s], SEGMENT_OFF);
  107.   }
  108. }
  109.  
  110. void setup() {
  111.   reset7();            //nastavení vývodu
  112.   pinMode(A0, INPUT);
  113. }
  114.  
  115. void loop() {
  116.   bright_on = read_light();
  117.   t = read_temperature();
  118.   //set_value(read_light()); // pro testování fotoodporu
  119.   set_value(t);
  120.   show();
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement