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

#9124
johnyhol
Účastník


// REGULACE PELETKOVEHO KOTLE
// author. Johnyhol & by JP
// v 14_5_2016

// changelog
// 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>

#define davkovaniPelet 2 //davkovani pelet snek
#define spirala 3 //zapalovaci spirala
#define ventilator 5 //ventilator
#define alarm 6 //signalizace poruchy
#define prostorovyTermostat 7 //prostorovy termostat
#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 = 110; // max.pomocne smycky
int smycka5 = 0; // pomocna smycka - rozhoreni
int smycka5max = 50; // max.pomocne smycky
int smycka6 = 0; // pomocna smycka - dohoreni
int smycka6max = 840; // 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
  pinMode(davkovaniPelet, OUTPUT);
  pinMode(spirala, OUTPUT);
  pinMode(ventilator, OUTPUT);
  pinMode(alarm, OUTPUT);
  pinMode(prostorovyTermostat, INPUT);
  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

  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(prostorovyTermostat) == HIGH){ // prostorovy termostat je zapnuty
            Serial.println("Prostorovy termostat zapnut"); // ladici seriova komunikace
    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("Prostorovy termostat vypnut"); // ladici seriova komunikace
    }
  // kvitence pripadne poruchy
  //-------------------------------
  kvitancePoruchy();
}

void vypniVse() {
  // funkce vypni vse
  Serial.println("Vypinam vsechny rele ..."); // ladici seriova komunikace
  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
        }
  digitalWrite(davkovaniPelet, HIGH); //potom vypni davkovani
  digitalWrite(ventilator, LOW); //zapni ventilator
  digitalWrite(spirala, LOW); //zapni zhaveni
}

void zapaleni() {
  // funkce zapaleni pelet
  // 3 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 "); // ladici seriova komunikace
      Serial.print(smycka3); // ladici seriova komunikace
      Serial.print("/"); // ladici seriova komunikace
      Serial.print(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       
      } else {
        Serial.println(" nehori ...");   // ladici seriova komunikace 
      }
      delay(1000);
    }
                for (smycka5 = 0;  smycka5 < smycka5max; smycka5 ++){
            delay(1000); 
                  wdt_reset(); // resetuj watchdog
                }
    //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(prostorovyTermostat) == HIGH  && digitalRead(kotlovyTermostat) == HIGH){ // prostorovy + kotlovy termostat je zapnuty
      if(analogRead(fotobunka) <= 500){ //pokud fotobunka vidi plamen
                  Serial.println("Test plamene ... hori"); // ladici seriova komunikace
        digitalWrite(davkovaniPelet, LOW); //davkuj pelety
        delay(8000); //pockej 8s
        digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
        delay(1000); //pockej 1s
      } 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 ..."); // ladici seriova komunikace
  digitalWrite(davkovaniPelet, HIGH); //vypni davkovani pelet
  digitalWrite(spirala, HIGH); //vypni zhaveni - pro jistotu
        for (smycka6 = 0;  smycka6 < smycka6max; smycka6 ++){
    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
}
}

Měním čas(zpoždění) u funkce „udrzujHoreni“:


digitalWrite(davkovaniPelet, LOW); //davkuj pelety
        delay(8000); //pockej 8s
        digitalWrite(davkovaniPelet, HIGH); //vypni davkovani
        delay(1000); //pockej 1s

Původně tam bylo 1s davkovani pelet a 1s vypnuto davkovani. To fungovalo bez problémů, ale když změním zpoždění „vypni davkovani“ na jiný čas než 1s tak to nejde.