Advertisement
Matqux

Fűtésvezérlő

Feb 22nd, 2021
1,187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Források
  2. //https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce
  3. //https://www.hobbielektronika.hu/cikkek/will-i_the_end_robotika_es_avr_kezdoknek.html?pg=5
  4.  
  5. //A ledek kivezetéseinek definiálása
  6. #define LED1 10
  7. #define LED2 2
  8. #define LED3 3
  9. #define LED4 4
  10. #define LED5 5
  11.  
  12. //A nyomógombok kivezetéseinek definiálása
  13. #define BUTTON_PLUS 6
  14. #define BUTTON_MINUS 7
  15.  
  16. //A relé kivezetésének definiálása
  17. #define RELAY 8
  18.  
  19. //A MOSFET kivezetésének definiálása
  20. //Mindenképpen PWM képes lábat kell kiválasztani ide!
  21. #define MOSFET 9
  22.  
  23.  
  24. //A nyomógombokról beolvasott értékek tárolására szolgáló változók
  25. bool minusRead = false;
  26. bool plusRead = false;
  27. //A nyomógombok aktuális állapotának tárolására szolgáló változók
  28. bool minusState = false;
  29. bool plusState = false;
  30. //A nyomógombok legutóbbi állapotának tárolására szolgáló változók
  31. bool lastMinusState = false;
  32. bool lastPlusState = false;
  33.  
  34. //Pergésmentesítéshez használt változók
  35. unsigned long lastDebounceTime = 0; //
  36. unsigned long debounceDelay = 50; //
  37.  
  38. //Az aktuális fűtési szintet tároló változó
  39. byte actualLevel = 0;
  40. //Az adott fűtési szinthez tartozó kitöltési tényezőket tároló tömbs
  41. byte powerLevels[6] = {0, 51, 102, 153, 204, 255};
  42.  
  43.  
  44. void setup()
  45. {
  46.   //A LEDek defeiniálása kimenetként
  47.   pinMode(LED1, OUTPUT);
  48.   pinMode(LED2, OUTPUT);
  49.   pinMode(LED3, OUTPUT);
  50.   pinMode(LED4, OUTPUT);
  51.   pinMode(LED5, OUTPUT);
  52.  
  53.   //A nyomógombok definiálása bemenetként
  54.   pinMode(BUTTON_PLUS,  INPUT);
  55.   pinMode(BUTTON_MINUS, INPUT);
  56.  
  57.   //A relé defeiniálása kimenetként
  58.   pinMode(RELAY,  OUTPUT);
  59.  
  60.   //A MOSFET defeiniálása kimenetként
  61.   pinMode(MOSFET, OUTPUT);
  62.  
  63.   //A LED-ek alaphelyzetbe állítása
  64.   digitalWrite(LED1, LOW);
  65.   digitalWrite(LED2, LOW);
  66.   digitalWrite(LED3, LOW);
  67.   digitalWrite(LED4, LOW);
  68.   digitalWrite(LED5, LOW);
  69.  
  70.   //A relé alaphelyzetbe állítása
  71.   digitalWrite(RELAY, LOW);
  72.  
  73.   //A MOSFET alaphelyzetbe állítása
  74.   analogWrite(MOSFET, 0);
  75. }
  76.  
  77. void loop()
  78. {
  79.   //a gombok állapotainak beolvasása
  80.   plusRead  = digitalRead(BUTTON_PLUS);
  81.   minusRead = digitalRead(BUTTON_MINUS);
  82.  
  83.   //Pergésmentesítés
  84.   if(plusRead != lastPlusState || minusRead != lastMinusState) //ha valamelyik gomb állapota megváltozott (zaj vagy lenyomás miatt)
  85.   {
  86.     lastDebounceTime = millis(); //akkor az utolsó prellezés ideje az aktuális futási idővel lesz egyenlő
  87.   }
  88.  
  89.   if ((millis() - lastDebounceTime) > debounceDelay) // ha az aktuális futási idő és a legutóbbi prellezés közötti idő nagyobb, mint a pergésmentesítéshez használt késleltetési idő
  90.   {
  91.     if(plusRead != plusState) //ha az érték növelő gomb állapota megváltozott
  92.     {
  93.       plusState = plusRead; //akkor a gomb állapota, az olvasott értékkel lesz egyenlő
  94.  
  95.        if(plusState == true && actualLevel < 5) //ha a gomb megnyomva lett, nem elengedve és még növelehető a fűtési szint
  96.        {
  97.          actualLevel++; //növeljük a fűtési szintet
  98.        }
  99.     }
  100.     if(minusRead != minusState) //ha az érték csökkentő gomb állapota megváltozott
  101.     {
  102.       minusState = minusRead; //akkor a gomb állapota, az olvasott értékkel lesz egyenlő
  103.  
  104.       if(minusState == true && 0 < actualLevel) //ha a gomb megnyomva lett, nem elengedve és még csökkenthető a fűtési szint
  105.       {
  106.        actualLevel--; //növeljük a fűtési szintet
  107.       }
  108.     }
  109.   }
  110.  
  111.   //Lényegi kód
  112.   LEDWrite(actualLevel); //LED-ek állapotának írása
  113.   RelayWrite(actualLevel); //Relé állapotának írása
  114.   MOSFETWrite(actualLevel); //MOSFET állapotának írása
  115.  
  116.   //A legutóbi állapot az olvasott értékekel lesz egyenlő
  117.   lastMinusState = minusRead;
  118.   lastPlusState = plusRead;
  119. }
  120.  
  121. //LED-ek állapotának írása a fűtési szint alapján
  122. void LEDWrite(byte powerLevel)
  123. {
  124.   //az adott fűtési szintnek megflelelő darabszámú LED világít, a többi pedig nem
  125.   switch(powerLevel)
  126.   {
  127.     case 0:
  128.       digitalWrite(LED1, LOW);
  129.       digitalWrite(LED2, LOW);
  130.       digitalWrite(LED3, LOW);
  131.       digitalWrite(LED4, LOW);
  132.       digitalWrite(LED5, LOW);
  133.       break;
  134.     case 1:
  135.       digitalWrite(LED1, HIGH);
  136.       digitalWrite(LED2, LOW);
  137.       digitalWrite(LED3, LOW);
  138.       digitalWrite(LED4, LOW);
  139.       digitalWrite(LED5, LOW);
  140.       break;
  141.     case 2:
  142.       digitalWrite(LED1, HIGH);
  143.       digitalWrite(LED2, HIGH);
  144.       digitalWrite(LED3, LOW);
  145.       digitalWrite(LED4, LOW);
  146.       digitalWrite(LED5, LOW);
  147.       break;
  148.     case 3:
  149.       digitalWrite(LED1, HIGH);
  150.       digitalWrite(LED2, HIGH);
  151.       digitalWrite(LED3, HIGH);
  152.       digitalWrite(LED4, LOW);
  153.       digitalWrite(LED5, LOW);
  154.       break;
  155.     case 4:
  156.       digitalWrite(LED1, HIGH);
  157.       digitalWrite(LED2, HIGH);
  158.       digitalWrite(LED3, HIGH);
  159.       digitalWrite(LED4, HIGH);
  160.       digitalWrite(LED5, LOW);
  161.       break;
  162.     case 5:
  163.       digitalWrite(LED1, HIGH);
  164.       digitalWrite(LED2, HIGH);
  165.       digitalWrite(LED3, HIGH);
  166.       digitalWrite(LED4, HIGH);
  167.       digitalWrite(LED5, HIGH);
  168.       break;  
  169.   }
  170. }
  171.  
  172. //Relé állapotának írása a fűtési szint alapján
  173. void RelayWrite(byte powerLevel)
  174. {
  175.   if(0 < powerLevel && powerLevel <= 5) //ha a fűtési szint 0 és 5 között van
  176.   {
  177.     digitalWrite(RELAY, HIGH); //akkor a relé behúz
  178.   }
  179.   else
  180.   {
  181.     digitalWrite(RELAY, LOW); //egyébként pedig nem
  182.   }
  183. }
  184.  
  185. //MOSFET állapotának írása a fűtési szint alapján
  186. void MOSFETWrite(byte powerLevel)
  187. {
  188.   //kiválasztjuk a fűtési szinteknek megfelelő PWM értékeket tároló tömbből az adott szinthez tartozó elemet, majd a PWM kitöltési tényezőjét arra az értékre állítjuk be
  189.   analogWrite(MOSFET, powerLevels[powerLevel]);
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement