Close

Řídící jednotka pro peletový kotel

Úvodní stránka Fórum Vaše projekty Arduino Řídící jednotka pro peletový kotel

  • Toto téma obsahuje celkem 112 odpovědí. Do diskuze (6 diskutujících) se naposledy zapojil uživatel johnyhol a poslední změna proběhla před 7 roky a 3 měsíci.
Aktuálně je na stránce zobrazeno 15 příspěvků - 76. až 90. (celkem z 113)
  • Autor
    Příspěvky
  • #9209
    johnyhol
    Účastník

    Aha, tak to mě vůbec nenapadlo, tam jsem s tím oproti předešlý verzi nic nedělal. Proč to tedy teď nefungovalo, když to předtím s tou závorkou šlo? Potřeboval bych to dovysvětlit.
    Díky!

    #9211
    posjirka
    Účastník

    to nemohlo fungovat … nech to být. Je opraveno a připraveno k testování 🙂

    #9212
    johnyhol
    Účastník

    Právě že to fungovalo, jenom jsem promazal části kódu kde byl prostorový termostat a na závorky jsem nesahal. Proto se divím, hlavně proč mi to hlásilo chybu ve „void setup -> vypniVse ();“, když ta závorka navíc byla ve void loop. Chtěl bych to pochopit, abych se toho do budoucna vyvaroval.

    Ještě jeden dotaz. Přemýšlím o tom displeji jak jsi mi dřív radil a zajímalo by mě, jestli by se na něm dalo zobrazit to co mám teď přes seriovou komunikaci (jaká běží aktuální část programu, časy atd.), abych měl přehled co zrovna Arduino dělá.

    Díky

    #9213
    posjirka
    Účastník

    On kompilator obcas vypíše chybové hlášení, které není uplně přesně to co očekáváš. Prostš se dostane do slepé uličky a neví proč, tak zapíše poslední známé místo a chybu. Ve VBA je to ještě veselejší. Každá verze MS ACCESS má vlastní syntaxi a ty pak přemýšlíš, proč ti letitý kod najednounejde použít v této aplikaci … no to už je mimo téma.

    LCD je super. Doporučuju 2 řády 16 znaků, protože je dostupný a realitvně levný.
    Stačí si třeba v excelu udělat tabulku 2×16 a zkusti si vypsat jednotlivé možnosti a funkce. Resp. vymezit si prostor pro zobrazení a optimalizovat zprávy.
    třeba místo „rozpenutí termostatu“ nechat na LCD zobrazit 1 nebo 0 pro jednotlivé funkce.
    příklad
    0123456789012345
    0 DOHORENI 1 0 1 1
    1 KVITANCE PORUCHY

    Prvních 8 znaků v prvním (0) řádku zálohovat pro aktuální proces.
    Další 8 (2×4) nechat pro zobrazení stavu 4 hodnot (termostat kotle, prostorový, plamen, …)
    Poslední řádek nechat na zprávy.

    Je to příklad nikoliv kuchařka. Promysli si co bys tam chtěl zobrazit a kouknem na to.

    #9214
    johnyhol
    Účastník

    Aha, tak proto to vypsalo všechno možný a já z toho byl hotovej. Něco podobnýho se mi stalo, když jsem se po půl roce vrátil k mýmu (našemu) projektu regulace kotle a najednou mně to házelo jednu chybovou hlášku za druhou. Asi po dvou dnech trápení jsem odinstaloval a znova nainstaloval Arduino IDE a pak už to jelo. Myslím že to bylo nakopnutý výroční aktualizací Windows.

    Displej rozmyslím a ozvu se. Zatím díky a promiň že potřebuju všechno vysvětlit, když mně něco nejde tak musím zjistit kde jsem udělal chybu.

    #9215
    posjirka
    Účastník

    JASNĚ V POHO … 🙂

    #9232
    johnyhol
    Účastník

    Displej jsem objednal podle doporučení (vzal jsem rovnou celej schield s tlačítky-možná se budou ještě hodit pro nastavování funkcí/časů) a trochu jsem přemejšlel o tom zobrazování a viděl bych to asi tak jako na obrázku. Na prvním řádku vždy aktuální proces, za ním čas a na druhým doplňkový informace. Bylo by to tak možný?

    Attachments:
    #9534
    johnyhol
    Účastník

    Ahoj, tak jsem se pustil do toho dipleje, něco jsem naštudoval, něco vyzkoušel. Teď se to snažím nacpat do mýho projektu, ale nějak se mi to nedaří. Zkusíš mi na to prosím kouknout? Zatím jsem jenom nastavil do setupu hlášku „nastavuji vstupy/vystupy“ (to funguje) a pak jsem zkoušel dát do loopu fotobuňku a do vypniVse „vypinam vsechny rele“, ale tam už se mi to nedaří.
    Tady je aktuálmí kód:

    
    // REGULACE PELETKOVEHO KOTLE
    // author. Johnyhol & by JP
    // v 13_12_2016
    
    // changelog
    // v 13_12_2016
    //   testovani displeje
    // v 13_11_2016
    //   zrusena reakce na prostorovy termostat -> není potreba, reseno jiz v kotli
    // v 10_11_2016
    //   uprava seriove komunikace -> pridani casovacu jednotlivych funkci 
    // v 5_11_2016
    //   zmena casu - upraveno pro realny provoz
    // v 4_11_2016
    //   zmena vsech vystupu na rele
    // v 14_5_2016
    //   precislovani pinu
    //   zmena funkce fotobunky z digitalu na analog
    //   dolpneni seriove komunikace o hodnotu fotobunky 
    // v 30_3_2016
    //   oprava funkce tlacitka kvitace poruchy -> HIGH->LOW
    //   umazani parametru "long cas=13000;" -> jiz neni potreba
    //   umazani parametru "//delay(84000); //pockej 84s" u funkce dohoreni -> jiz neni potreba
    //   umazani parametru "//delay(12000); //po dobu 12s" u funkce davkovani zapalovaci davky pelet -> jiz neni potreba
    //   umazani parametru "//if(digitalRead(prostorovyTermostat) == LOW || digitalRead(kotlovyTermostat) == LOW){  // prostorovy  nebo  kotlovy termostat vypne" u funkce zapaleni
    //   drobne upravy textu/popisu jednotlivych parametru/funkci
    // v 27_3_2016
    //   uprava procesu zapalovani - nebude reagovat na prostorovy termostat
    //   uprava dlouhych delayu na smycky,  pro vyuziti watchdogu - autoreset pri zaseknuti procesou - doba nez se resetuje = 8s
    //   nastaveni definice poruch pro pozdejsi vyuziti
    // v22_3_2016
    //   uprava ladicich textu pro termostaty
    // v21_3_2016
    //   presunuti testuPlamene pouze do smycky udrzuj horeni
    //   doplneni textu do testu horeni
    //   oprava textu zprav
    //   zruseni diakritiky
    //   zapnuti alarmu pri vyskytu poruchy
    // v20_3_2016
    //   slouceni podminenych funkci  
    //   vypnuti zhaveni pri rozepnuti termostatu (kotlovy nebo prostorovy)
    //   rozdeleni funkci do vlastnich funkcnich bloku
    //   zapojeni seriove komunikace pro odladeni funkci 
    // v16_3_2016
    //   uprava podminky smycek (zruseno =)
    //   posun zpozdeni 5s z procesu zapaleni na jeho konec
    //   doplnena podminka reakce na termostaty (kotlovy/prostorovy) v procesu zapaleni
    //   upravena doba na 1 zapalovaci proces - nastavitelna trimrem na analog.vstupu A0. v rozsahu 60 - 600 s = 1 - 10 min. - nastaveni pouze v dobe necinosti kotle
    //   nastaveni poruchy a jeji kvitance tlacitkem na pinu 9
    
    // definice poruch
    // bit  funkce
    // 0    prehrati kotle pri zapalovani
    // 1    ztrata plamene pri horeni
    // 2    volne
    // 3    volne
    // 4    volne
    // 5    volne
    // 6    volne
    // 7    volne
    
    // knihovna watchdogu
    #include <avr/wdt.h>
    // knihovna displeje
    #include <LiquidCrystal.h>
    
    // nastaveni pinu displeje
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    
    #define davkovaniPelet 2 //davkovani pelet snek
    #define spirala 3 //zapalovaci spirala
    #define ventilator 5 //ventilator
    #define alarm 6 //signalizace poruchy
    #define kotlovyTermostat 8 //kotlovy termostat
    #define fotobunka 15 //fotobunka pro kontrolu plamene DI15 = A1 pro arduino UNO
    #define trimr1 14 // nastaveni doby zapaleni  DI14 = A0 pro arduino UNO
    #define tlacitkoKvitance 9 // pin tlacitka kvitance poruchy
    
    int smycka1 = 0; // pomocna smycka - zapaleni
    int smycka1max = 600; // max.pomocne smycky - ted jiz nastavitelne trimrem na A0 60-600s
    int smycka2 = 0; // pomocna smycka - udrzeni horeni
    int smycka2max = 2; // max.pomocne smycky
    int smycka3 = 0; // pomocna smycka - pocet pokusu o zapaleni
    int smycka3max = 2; // max.pomocne smycky
    int smycka4 = 0; // pomocna smycka - davkovani zapalne davky pelet
    int smycka4max = 10; // max.pomocne smycky
    int smycka5 = 0; // pomocna smycka - rozhoreni
    int smycka5max = 5; // max.pomocne smycky
    int smycka6 = 0; // pomocna smycka - dohoreni
    int smycka6max = 84; // max.pomocne smycky
    byte porucha = 0; // promenna pro zaznam poruchy
    int ldr = 1; //analogovy pin kde je pripojen fotorezistor
    int ldr_value = 0; //promenna pro zaznam hodnot z fotorezistoru
    
    void setup() {
      // nastav seriovou komunikaci na rychlost 9600 bd 
      Serial.begin(9600);
      Serial.println("Nastavuji vstupy/vystupy"); // ladici seriova komunikace
      // nastaveni displeje
      lcd.begin(16, 2);
      // zobrazeni na displeji
      lcd.print("NAST.VSTUPY/VYST");
      delay (5000);
      // smaze displej pred dalsi smyckou
      lcd.clear();
      pinMode(davkovaniPelet, OUTPUT);
      pinMode(spirala, OUTPUT);
      pinMode(ventilator, OUTPUT);
      pinMode(alarm, OUTPUT);
      pinMode(kotlovyTermostat, INPUT);
      pinMode(fotobunka, INPUT);
      pinMode(trimr1, INPUT);
      pinMode(tlacitkoKvitance, INPUT);
      // vsechno vypni
      vypniVse();
            // nastav watchdog na 8s
            wdt_enable(WDTO_8S);
    }
    
    void loop() {
            wdt_reset(); // resetuj watchdog
            ldr_value = analogRead(ldr); //čte hodnoty LDR
      Serial.print("HODNOTA FOTOBUNKY = ");
      Serial.println(ldr_value); //zobrazí hodnoty LDR na seriove lince
      // (poznamka: oznaceni 1 je druhy radek, prvni radek je 0):
      lcd.setCursor(0, 1);
      // zobrazeni na displeji
      lcd.print("FOTOBUNKA");
      // smaze displej pred dalsi smyckou
      lcd.clear();
      Serial.println("Cekam na sepnuti termostatu ..."); // ladici seriova komunikace
      smycka1max = map(analogRead(trimr1), 0, 1024, 60, 600); // nastaveni doby zapaleni trimrem na A0
      if(digitalRead(kotlovyTermostat) == HIGH){  // kotlovy termostat je zapnuty
              Serial.println("Kotlovy termostat zapnut"); // ladici seriova komunikace
          // startovaci davka pelet
          //------------------------
          zapalovaciDavkaPelet();
          
          // proces zapaleni
          //----------------
          zapaleni();
          
          // test poruchy
          // -----------------
          //testPlamene(); 
          
          // udrzeni horeni
          //--------------
          udrzujHoreni();
          
          // dohoreni
          //---------
          dohoreni();
        
        } else {
          Serial.println("Kotlovy/Prostorovy termostat vypnut"); // ladici seriova komunikace
        }
      // kvitence pripadne poruchy
      //-------------------------------
      kvitancePoruchy();
    }
    
    void vypniVse() {
      // funkce vypni vse
      Serial.println("Vypinam vsechny rele ..."); // ladici seriova komunikace
      // (poznamka: oznaceni 1 je druhy radek, prvni radek je 0):
      lcd.setCursor(0, 1);
      // zobrazeni na displeji
      lcd.print("VYPINAM VS. RELE");
      // smaze displej pred dalsi smyckou
      lcd.clear();
      digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
      digitalWrite(spirala, HIGH); //vypni zhaveni
      digitalWrite(ventilator, HIGH); //vypni ventilator
    }
    
    void zapalovaciDavkaPelet() {
      // prvotni davkovani pelet pro zapaleni
      Serial.println("Davkuji pelety pro zapaleni ... 110s"); // ladici seriova komunikace
      digitalWrite(davkovaniPelet, LOW); //davkuj pelety
            for (smycka4 = 0;  smycka4 < smycka4max; smycka4 ++){
        delay(1000); 
              wdt_reset(); // resetuj watchdog
      Serial.print("Stav: ");
      Serial.print(smycka4);
      Serial.print("s/");
      Serial.print(smycka4max);
      Serial.println("s ");
            }
      digitalWrite(davkovaniPelet, HIGH); //potom vypni davkovani
      digitalWrite(ventilator, LOW); //zapni ventilator
      digitalWrite(spirala, LOW); //zapni zhaveni
    }
    
    void zapaleni() {
      // funkce zapaleni pelet
      // 2 pokusy o zapaleni
      Serial.println("Spoustim zapaleni ..."); // ladici seriova komunikace
      for (smycka3 = 0;  smycka3 < smycka3max; smycka3 ++){
        // smycka "1-10" minut zapalovani
        for (smycka1 = 0;  smycka1 < smycka1max; smycka1 ++){
                            wdt_reset(); // resetuj watchdog
          Serial.print("Pokus o zapaleni "); // ladici seriova komunikace
          Serial.print(smycka3); // ladici seriova komunikace
          Serial.print("/"); // ladici seriova komunikace
          Serial.println(smycka3max); // ladici seriova komunikace
          Serial.print("Stav: "); // ladici seriova komunikace
          Serial.print(smycka1); // ladici seriova komunikace
          Serial.print("s/"); // ladici seriova komunikace
          Serial.print(smycka1max); // ladici seriova komunikace
          Serial.println("s "); // ladici seriova komunikace
                            
          if(digitalRead(kotlovyTermostat) == LOW){ // kotlovy termostat vypne
            digitalWrite(spirala, HIGH); //vypni zhaveni
            smycka1 = smycka1max; // ukonci smycku1
            smycka3 = smycka3max; // ukonci smycku3
            Serial.println("Rozepnuti termostatu ..."); // ladici seriova komunikace
                                    bitSet(porucha,0); // nastav poruchu bit c.0 na "1"
          }
          if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen
            digitalWrite(spirala, HIGH); //vypni zhaveni
            smycka1 = smycka1max; // ukonci smycku1
            smycka3 = smycka3max; // ukonci smycku3 
            Serial.println(" hori ...");   // ladici seriova komunikace
            Serial.println("Rozhoreni ... 50s ");
                  
          } else {
            Serial.println(" nehori ...");   // ladici seriova komunikace 
          }
          delay(1000);
        }
                    for (smycka5 = 0;  smycka5 < smycka5max; smycka5 ++){
                delay(1000); 
                      wdt_reset(); // resetuj watchdog
            Serial.print("Stav: ");
            Serial.print(smycka5);
            Serial.print("s/");
            Serial.print(smycka5max);
            Serial.println("s ");
                    }
        //delay(5000); //cekej 5s
      }
    }
    
    void udrzujHoreni() {
      // funkce udrzeni horeni
      ldr_value = analogRead(ldr); //čte hodnoty LDR
      Serial.print("HODNOTA FOTOBUNKY = ");
      Serial.println(ldr_value); //zobrazí hodnoty LDR na seriove lince
      Serial.println("Udrzeni horeni ..."); // ladici seriova komunikace
      for (smycka2 = 0;  smycka2 < smycka2max; smycka2 ++){
                    wdt_reset(); // resetuj watchdog
        smycka2 = 0; // vynuluj smycku
        if(digitalRead(kotlovyTermostat) == HIGH){ // kotlovy termostat je zapnuty
          if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen
                      Serial.println("Test plamene ... hori"); // ladici seriova komunikace
                      Serial.println("Davkuji pelety ... ");
            digitalWrite(davkovaniPelet, LOW); //davkuj pelety
            delay(4000); //pockej 4s
            wdt_reset(); // resetuj watchdog
            delay(4000); //pockej 4s
            wdt_reset(); // resetuj watchdog
            //Serial.print("s/");
            //Serial.print(davkovaniPelet, LOW);
            //Serial.print("s ");
            
            Serial.println("Pauza ... ");
            digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
            delay(5000); //pockej 5s
            wdt_reset(); // resetuj watchdog
            delay(5000); //pockej 5s
            wdt_reset(); // resetuj watchdog
          } else {
            delay(1000); // pocekej jeste 1s a zkus to znovu
            if(analogRead(fotobunka) >= 500){  //pokud fotobunka nevidi plamen
                                    Serial.println("Test plamene ... porucha"); // ladici seriova komunikace
                                    smycka2 = smycka2max; // ukonci smycku
                        //porucha = 1; // nastav poruchu
                                    bitSet(porucha,1); // nastav poruchu bit c.1 na "1"
                                    digitalWrite(alarm, LOW); // zapni alarm
            }
          }
        } else {
          smycka2 = smycka2max; // ukonci smycku
        }  
      }
    }
    
    void dohoreni() {
      // funkce dohoreni
      Serial.println("Dohoreni ... 840s "); // ladici seriova komunikace
      digitalWrite(davkovaniPelet, HIGH); //vypni davkovani pelet
      digitalWrite(spirala, HIGH); //vypni zhaveni - pro jistotu
      
            for (smycka6 = 0;  smycka6 < smycka6max; smycka6 ++){
      Serial.print("Stav: ");
      Serial.print(smycka6);
      Serial.print("s/");
      Serial.print(smycka6max);
      Serial.println("s ");
        delay(1000); 
              wdt_reset(); // resetuj watchdog
            }
      digitalWrite(ventilator, HIGH); //vypni ventilator
      
    }
    
    void kvitancePoruchy() {
      // funkce kvitance poruchy
      
      if(porucha > 0 ){ // kdyz je porucha aktivni
            Serial.println("Kvitance poruchy ..."); // ladici seriova komunikace
        // vypni vse
        vypniVse();
        while (digitalRead(tlacitkoKvitance) == LOW) { // zapni alarm a cekej na stisk tlacitka
          digitalWrite(alarm, LOW); // zapni alarm
          Serial.println("Porucha ... cekam na kvitanci"); // ladici seriova komunikace
                            wdt_reset(); // resetuj watchdog
        }
        Serial.println("Porucha kvitovana ..."); // ladici seriova komunikace
        digitalWrite(alarm, HIGH); // vypni alarm
        porucha = 0; // vynuluj poruchu
      } else {  // jinak 
        Serial.println("Zadna porucha  ..."); // ladici seriova komunikace
        digitalWrite(alarm, HIGH); // vypni alarm
    }
    }
    

    Díky moc!

    #9537
    posjirka
    Účastník

    ahoj,
    chybka je jasná:
    – nejdřív musíš smazat LCD
    – pak nastavit kurzor
    – nakonec vypsat text

    teď to máš takto:

      lcd.setCursor(0, 1);
      // zobrazeni na displeji
      lcd.print("FOTOBUNKA");
      // smaze displej pred dalsi smyckou
      lcd.clear();
    

    správně to má být takto:

    
      // smaze displej
      lcd.clear();
      // nastaveni kurzoru
      lcd.setCursor(0, 1);
      // zobrazeni na displeji
      lcd.print("FOTOBUNKA");
    
    
    #9538
    johnyhol
    Účastník

    Ahoj, díky za rychlou reakci. Zkoušel jsem to jak radíš, ale stejně to nic nezobrazí, pořád funguje jenom „nastavuji vstupy/vystupy“ a pak už nic. Když to zkusím v extra projektu (jenom displej bez ostatních funkcí) tak to funguje. Ještě musí bejt někde něco.

    #9541
    posjirka
    Účastník

    hod sem poslední kod včetně tech uprav lcd odemně

    #9551
    johnyhol
    Účastník

    Tak tady:

    
    // REGULACE PELETKOVEHO KOTLE
    // author. Johnyhol & by JP
    // v 13_12_2016
    
    // changelog
    // v 13_12_2016
    //   testovani displeje
    // v 13_11_2016
    //   zrusena reakce na prostorovy termostat -> není potreba, reseno jiz v kotli
    // v 10_11_2016
    //   uprava seriove komunikace -> pridani casovacu jednotlivych funkci 
    // v 5_11_2016
    //   zmena casu - upraveno pro realny provoz
    // v 4_11_2016
    //   zmena vsech vystupu na rele
    // v 14_5_2016
    //   precislovani pinu
    //   zmena funkce fotobunky z digitalu na analog
    //   dolpneni seriove komunikace o hodnotu fotobunky 
    // v 30_3_2016
    //   oprava funkce tlacitka kvitace poruchy -> HIGH->LOW
    //   umazani parametru "long cas=13000;" -> jiz neni potreba
    //   umazani parametru "//delay(84000); //pockej 84s" u funkce dohoreni -> jiz neni potreba
    //   umazani parametru "//delay(12000); //po dobu 12s" u funkce davkovani zapalovaci davky pelet -> jiz neni potreba
    //   umazani parametru "//if(digitalRead(prostorovyTermostat) == LOW || digitalRead(kotlovyTermostat) == LOW){  // prostorovy  nebo  kotlovy termostat vypne" u funkce zapaleni
    //   drobne upravy textu/popisu jednotlivych parametru/funkci
    // v 27_3_2016
    //   uprava procesu zapalovani - nebude reagovat na prostorovy termostat
    //   uprava dlouhych delayu na smycky,  pro vyuziti watchdogu - autoreset pri zaseknuti procesou - doba nez se resetuje = 8s
    //   nastaveni definice poruch pro pozdejsi vyuziti
    // v22_3_2016
    //   uprava ladicich textu pro termostaty
    // v21_3_2016
    //   presunuti testuPlamene pouze do smycky udrzuj horeni
    //   doplneni textu do testu horeni
    //   oprava textu zprav
    //   zruseni diakritiky
    //   zapnuti alarmu pri vyskytu poruchy
    // v20_3_2016
    //   slouceni podminenych funkci  
    //   vypnuti zhaveni pri rozepnuti termostatu (kotlovy nebo prostorovy)
    //   rozdeleni funkci do vlastnich funkcnich bloku
    //   zapojeni seriove komunikace pro odladeni funkci 
    // v16_3_2016
    //   uprava podminky smycek (zruseno =)
    //   posun zpozdeni 5s z procesu zapaleni na jeho konec
    //   doplnena podminka reakce na termostaty (kotlovy/prostorovy) v procesu zapaleni
    //   upravena doba na 1 zapalovaci proces - nastavitelna trimrem na analog.vstupu A0. v rozsahu 60 - 600 s = 1 - 10 min. - nastaveni pouze v dobe necinosti kotle
    //   nastaveni poruchy a jeji kvitance tlacitkem na pinu 9
    
    // definice poruch
    // bit  funkce
    // 0    prehrati kotle pri zapalovani
    // 1    ztrata plamene pri horeni
    // 2    volne
    // 3    volne
    // 4    volne
    // 5    volne
    // 6    volne
    // 7    volne
    
    // knihovna watchdogu
    #include <avr/wdt.h>
    // knihovna displeje
    #include <LiquidCrystal.h>
    
    // nastaveni pinu displeje
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    
    #define davkovaniPelet 2 //davkovani pelet snek
    #define spirala 3 //zapalovaci spirala
    #define ventilator 5 //ventilator
    #define alarm 6 //signalizace poruchy
    #define kotlovyTermostat 8 //kotlovy termostat
    #define fotobunka 15 //fotobunka pro kontrolu plamene DI15 = A1 pro arduino UNO
    #define trimr1 14 // nastaveni doby zapaleni  DI14 = A0 pro arduino UNO
    #define tlacitkoKvitance 9 // pin tlacitka kvitance poruchy
    
    int smycka1 = 0; // pomocna smycka - zapaleni
    int smycka1max = 600; // max.pomocne smycky - ted jiz nastavitelne trimrem na A0 60-600s
    int smycka2 = 0; // pomocna smycka - udrzeni horeni
    int smycka2max = 2; // max.pomocne smycky
    int smycka3 = 0; // pomocna smycka - pocet pokusu o zapaleni
    int smycka3max = 2; // max.pomocne smycky
    int smycka4 = 0; // pomocna smycka - davkovani zapalne davky pelet
    int smycka4max = 10; // max.pomocne smycky
    int smycka5 = 0; // pomocna smycka - rozhoreni
    int smycka5max = 5; // max.pomocne smycky
    int smycka6 = 0; // pomocna smycka - dohoreni
    int smycka6max = 84; // max.pomocne smycky
    byte porucha = 0; // promenna pro zaznam poruchy
    int ldr = 1; //analogovy pin kde je pripojen fotorezistor
    int ldr_value = 0; //promenna pro zaznam hodnot z fotorezistoru
    
    void setup() {
      // nastav seriovou komunikaci na rychlost 9600 bd 
      Serial.begin(9600);
      Serial.println("Nastavuji vstupy/vystupy"); // ladici seriova komunikace
      // nastaveni displeje
      lcd.begin(16, 2);
      // zobrazeni na displeji
      lcd.print("NAST.VSTUPY/VYST");
      //delay (5000);
      // smaze displej pred dalsi smyckou
      //lcd.clear();
      pinMode(davkovaniPelet, OUTPUT);
      pinMode(spirala, OUTPUT);
      pinMode(ventilator, OUTPUT);
      pinMode(alarm, OUTPUT);
      pinMode(kotlovyTermostat, INPUT);
      pinMode(fotobunka, INPUT);
      pinMode(trimr1, INPUT);
      pinMode(tlacitkoKvitance, INPUT);
      // vsechno vypni
      vypniVse();
            // nastav watchdog na 8s
            wdt_enable(WDTO_8S);
    }
    
    void loop() {
            wdt_reset(); // resetuj watchdog
            ldr_value = analogRead(ldr); //čte hodnoty LDR
      Serial.print("HODNOTA FOTOBUNKY = ");
      Serial.println(ldr_value); //zobrazí hodnoty LDR na seriove lince
      // smaze displej pred dalsi smyckou
      lcd.clear();
      // (poznamka: oznaceni 1 je druhy radek, prvni radek je 0):
      lcd.setCursor(0, 1);
      // zobrazeni na displeji
      lcd.print("FOTOBUNKA");
      Serial.println("Cekam na sepnuti termostatu ..."); // ladici seriova komunikace
      smycka1max = map(analogRead(trimr1), 0, 1024, 60, 600); // nastaveni doby zapaleni trimrem na A0
      if(digitalRead(kotlovyTermostat) == HIGH){  // kotlovy termostat je zapnuty
              Serial.println("Kotlovy termostat zapnut"); // ladici seriova komunikace
          // startovaci davka pelet
          //------------------------
          zapalovaciDavkaPelet();
          
          // proces zapaleni
          //----------------
          zapaleni();
          
          // test poruchy
          // -----------------
          //testPlamene(); 
          
          // udrzeni horeni
          //--------------
          udrzujHoreni();
          
          // dohoreni
          //---------
          dohoreni();
        
        } else {
          Serial.println("Kotlovy/Prostorovy termostat vypnut"); // ladici seriova komunikace
        }
      // kvitence pripadne poruchy
      //-------------------------------
      kvitancePoruchy();
    }
    
    void vypniVse() {
      // funkce vypni vse
      Serial.println("Vypinam vsechny rele ..."); // ladici seriova komunikace
      // smaze displej pred dalsi smyckou
      lcd.clear();
      // (poznamka: oznaceni 1 je druhy radek, prvni radek je 0):
      lcd.setCursor(0, 1);
      // zobrazeni na displeji
      lcd.print("VYPINAM VS. RELE");
      digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
      digitalWrite(spirala, HIGH); //vypni zhaveni
      digitalWrite(ventilator, HIGH); //vypni ventilator
    }
    
    void zapalovaciDavkaPelet() {
      // prvotni davkovani pelet pro zapaleni
      Serial.println("Davkuji pelety pro zapaleni ... 110s"); // ladici seriova komunikace
      digitalWrite(davkovaniPelet, LOW); //davkuj pelety
            for (smycka4 = 0;  smycka4 < smycka4max; smycka4 ++){
        delay(1000); 
              wdt_reset(); // resetuj watchdog
      Serial.print("Stav: ");
      Serial.print(smycka4);
      Serial.print("s/");
      Serial.print(smycka4max);
      Serial.println("s ");
            }
      digitalWrite(davkovaniPelet, HIGH); //potom vypni davkovani
      digitalWrite(ventilator, LOW); //zapni ventilator
      digitalWrite(spirala, LOW); //zapni zhaveni
    }
    
    void zapaleni() {
      // funkce zapaleni pelet
      // 2 pokusy o zapaleni
      Serial.println("Spoustim zapaleni ..."); // ladici seriova komunikace
      for (smycka3 = 0;  smycka3 < smycka3max; smycka3 ++){
        // smycka "1-10" minut zapalovani
        for (smycka1 = 0;  smycka1 < smycka1max; smycka1 ++){
                            wdt_reset(); // resetuj watchdog
          Serial.print("Pokus o zapaleni "); // ladici seriova komunikace
          Serial.print(smycka3); // ladici seriova komunikace
          Serial.print("/"); // ladici seriova komunikace
          Serial.println(smycka3max); // ladici seriova komunikace
          Serial.print("Stav: "); // ladici seriova komunikace
          Serial.print(smycka1); // ladici seriova komunikace
          Serial.print("s/"); // ladici seriova komunikace
          Serial.print(smycka1max); // ladici seriova komunikace
          Serial.println("s "); // ladici seriova komunikace
                            
          if(digitalRead(kotlovyTermostat) == LOW){ // kotlovy termostat vypne
            digitalWrite(spirala, HIGH); //vypni zhaveni
            smycka1 = smycka1max; // ukonci smycku1
            smycka3 = smycka3max; // ukonci smycku3
            Serial.println("Rozepnuti termostatu ..."); // ladici seriova komunikace
                                    bitSet(porucha,0); // nastav poruchu bit c.0 na "1"
          }
          if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen
            digitalWrite(spirala, HIGH); //vypni zhaveni
            smycka1 = smycka1max; // ukonci smycku1
            smycka3 = smycka3max; // ukonci smycku3 
            Serial.println(" hori ...");   // ladici seriova komunikace
            Serial.println("Rozhoreni ... 50s ");
                  
          } else {
            Serial.println(" nehori ...");   // ladici seriova komunikace 
          }
          delay(1000);
        }
                    for (smycka5 = 0;  smycka5 < smycka5max; smycka5 ++){
                delay(1000); 
                      wdt_reset(); // resetuj watchdog
            Serial.print("Stav: ");
            Serial.print(smycka5);
            Serial.print("s/");
            Serial.print(smycka5max);
            Serial.println("s ");
                    }
        //delay(5000); //cekej 5s
      }
    }
    
    void udrzujHoreni() {
      // funkce udrzeni horeni
      ldr_value = analogRead(ldr); //čte hodnoty LDR
      Serial.print("HODNOTA FOTOBUNKY = ");
      Serial.println(ldr_value); //zobrazí hodnoty LDR na seriove lince
      Serial.println("Udrzeni horeni ..."); // ladici seriova komunikace
      for (smycka2 = 0;  smycka2 < smycka2max; smycka2 ++){
                    wdt_reset(); // resetuj watchdog
        smycka2 = 0; // vynuluj smycku
        if(digitalRead(kotlovyTermostat) == HIGH){ // kotlovy termostat je zapnuty
          if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen
                      Serial.println("Test plamene ... hori"); // ladici seriova komunikace
                      Serial.println("Davkuji pelety ... ");
            digitalWrite(davkovaniPelet, LOW); //davkuj pelety
            delay(4000); //pockej 4s
            wdt_reset(); // resetuj watchdog
            delay(4000); //pockej 4s
            wdt_reset(); // resetuj watchdog
            //Serial.print("s/");
            //Serial.print(davkovaniPelet, LOW);
            //Serial.print("s ");
            
            Serial.println("Pauza ... ");
            digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
            delay(5000); //pockej 5s
            wdt_reset(); // resetuj watchdog
            delay(5000); //pockej 5s
            wdt_reset(); // resetuj watchdog
          } else {
            delay(1000); // pocekej jeste 1s a zkus to znovu
            if(analogRead(fotobunka) >= 500){  //pokud fotobunka nevidi plamen
                                    Serial.println("Test plamene ... porucha"); // ladici seriova komunikace
                                    smycka2 = smycka2max; // ukonci smycku
                        //porucha = 1; // nastav poruchu
                                    bitSet(porucha,1); // nastav poruchu bit c.1 na "1"
                                    digitalWrite(alarm, LOW); // zapni alarm
            }
          }
        } else {
          smycka2 = smycka2max; // ukonci smycku
        }  
      }
    }
    
    void dohoreni() {
      // funkce dohoreni
      Serial.println("Dohoreni ... 840s "); // ladici seriova komunikace
      digitalWrite(davkovaniPelet, HIGH); //vypni davkovani pelet
      digitalWrite(spirala, HIGH); //vypni zhaveni - pro jistotu
      
            for (smycka6 = 0;  smycka6 < smycka6max; smycka6 ++){
      Serial.print("Stav: ");
      Serial.print(smycka6);
      Serial.print("s/");
      Serial.print(smycka6max);
      Serial.println("s ");
        delay(1000); 
              wdt_reset(); // resetuj watchdog
            }
      digitalWrite(ventilator, HIGH); //vypni ventilator
      
    }
    
    void kvitancePoruchy() {
      // funkce kvitance poruchy
      
      if(porucha > 0 ){ // kdyz je porucha aktivni
            Serial.println("Kvitance poruchy ..."); // ladici seriova komunikace
        // vypni vse
        vypniVse();
        while (digitalRead(tlacitkoKvitance) == LOW) { // zapni alarm a cekej na stisk tlacitka
          digitalWrite(alarm, LOW); // zapni alarm
          Serial.println("Porucha ... cekam na kvitanci"); // ladici seriova komunikace
                            wdt_reset(); // resetuj watchdog
        }
        Serial.println("Porucha kvitovana ..."); // ladici seriova komunikace
        digitalWrite(alarm, HIGH); // vypni alarm
        porucha = 0; // vynuluj poruchu
      } else {  // jinak 
        Serial.println("Zadna porucha  ..."); // ladici seriova komunikace
        digitalWrite(alarm, HIGH); // vypni alarm
    }
    }
    
    #9552
    posjirka
    Účastník

    předpokládám, že se ti ve smyčce nic nezobrazuje a zobrazí se tit o až op sepnutí termostatu. („FOTOBUNKA“).
    Vidím tu problém ten, že ve smyčce LOOP() není žádná prodleva pro LCD a tak když se nic nedej neustále se maže a zobrazuje LCD.
    Vidím 3 řešení:
    1, misto
    lcd.print("FOTOBUNKA");
    dej

     lcd.print("FOTOBUNKA");
    delay(500);

    2, nedavej lcd.clear() ale zapisuj texty tak dlouhe aby přepsal všechny znaky v řádku

    3, místo sáhodlouhých popisků procesu použij ikony. Může na LCD uědlat až 15 vlastních znaků. ty můžeš dát jako reakce na nějákou funkci. Příklad 1. ikona bude plamen. dáme jí pozici 0,1. Když bude fotobuńka vidět plamen zobrazí v té pozici 1. ikonu, když né zapíše do této pozice mezeru. Cílem je nemazat LCD, ale neustále jej přepisovat. pro pozici 0,3 dámetřeba hvězdičku (nemusíš psát, máš již ve znakové sadě). Když bude zapalovat pelety, objeví se v této pozioci hvězdička jinak mezera ,….

    jak s tím začít by to moholo pomoci toto:
    https://omerk.github.io/lcdchargen/

    nechám výběr na tobě … .

    #9553
    Luke_CZ
    Účastník

    1, a co raději vyhodnocovat, zda ke změně stavu došlo? Tedy jednoduše dát globální boolean proměnnou (výchozí FALSE), pokud dojde ke změně stavu, pak nastavit tuto proměnnou na TRUE (přímo ve proceduře). V případě, že je proměnná TRUE tak změnit text na LCD a nastavit proměnnou zpět na FALSE, pokud je FALSE, tak nic na displeji neměnit.
    Tedy přepisovat jen tehdy, kdy je potřeba a co je potřeba.
    Delay je sice řešení, ale takové kostrbaté, navíc delay v tomto případě jen brzdí běh programu.
    2, lze jen souhlasit, navíc jde, pokud použiješ char jako pole, krásně text zarovnat na střed displeje, je to opticky mnohem výraznější, než vše psát od kraje.
    Jen malé doporučení: Texty vypisuj na LCD přes makro F(), ušetříš si SRAM
    3, na LCD lze udělat pouze 8 vlastních znaků pro jedno zobrazení(TO posjirka: ty umíš víc?). Nic proti ikonám, ale na rastru 5×7 moc zázraků nepředvedeš.

    L.

    #9556
    posjirka
    Účastník

    máš pravdu … tech vlastních znamků je max 8 (0-7).
    Delay taky nemám rád, ale tady mi přišel jako vhodný, protože celý kod je vlastně jen odkrokovaná smyčka s krokem po jednotlivých funkcích. Tady by se změna detekovala celkem neprakticky. Jedině stejně jako je chybový registr tak zavést stavový, ten měnit a regaovat na něj při zobrazení.
    ve výsledku bys v každémkroku (někdy i vícekrát) volal pod funkci na změnu zobrazení.
    Osobně bych šel do vlastních znaků. 8 ikon v pohodě stačí. Zobrazoval by se jen stav jaký je požadován + některé hodnoty proměnných .
    rozhodnutí ale nechávám na johnyhola .. přeji jen je to jeho zařízení.

Aktuálně je na stránce zobrazeno 15 příspěvků - 76. až 90. (celkem z 113)
  • Pro reakci na toto téma se musíte přihlásit.