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
13.12.2016 v 22:17
#9534
Úč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!