Close

Odpověď na: Řídící jednotka pro peletový kotel

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

#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!