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
6.11.2016 v 18:49
#9124
Úč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.