posjirka
Vytvořené odpovědi
-
AutorPříspěvky
-
posjirkaÚčastník
Arduino má digitální vstupy a vyýstupy na všech pinech a to v napěťové hladině 5V.
to je tedy pro něj max. napětí, pro které bylo stavěné. Některé modely jej mají snížené na 3,3V.
Uno má navíc na 6 pinech analogový vstup pro 0-5V (hodnoty 0-1023). 24V je pro něj moc.
Musíš jej snížit na 5V (nejčastěji stabilizátorem řady 78xx). To ovšem znamená, že i celá logika vstupů musí být na 5V. Předpokládám, že se vše odvijí od 24V zdroje a kotel je vybaven tzv. bezpotenciálovými kontakty = prostě kontakty ve vzduchu, s ničím nespojené. To je vcelku časté řešení. Pak by nebyl problém překopat to na 5V.
Výstupy budou v každém případě pomocí relé (opět ze stejného důvodu). Předpokládám že budou místy spínat 230V ze sítě.
Takže vstup bych dal na 5V logiku a výstupy přes relé.
Ten foto odpor nevím jak je zapojený. Většinou je to formou napě´tového děliče, takže je někde již zapojený odpor.
Pak budeš mít hodnoty třeba 0 – 4V (0 – 820 hodnoty převodníku).Nastavit si že plamen je cokoliv > 2V je úplně v pořádku. Nevím jaká je tam tedy logika. Jestli 0V je tma nebo plamen.posjirkaÚčastníktak ti asi nikdo neodpoví. Zkus nahodit jednoduchý příklad co to má dělat a k tomu dej svůj kod, kam až ses dostal. Určitě ti pak můžeme pomoci. Jinak dostaneš pouze hordu odkazů bez jakékoliv myšlenky.
posjirkaÚčastníkpodívám se na to.
Programovatelné relé jako je ten schneider se dají naprogramovat i bez kabelu.
Mám na mysli programování pomocí tlačítek. Dobře je to vidět tady:
http://www.conrad.cz/ridici-releovy-plc-modul-eaton-easy-512-dc-r-274108-ip20-4x-rele-24-v-dc.k198179není to u všech modelů ale může to programovat tak, že se odstaneš do ručního programování a pomocí tlačítek tam nadatluješ „kontakové zapojení“.
Pak to odzkoušíš a je to. Bez kabelů, bez SW, …Existuje i podobné vývojové prostředí free a pro mikroprocesory. jmenuje se to LDMICRO:
http://cq.cx/ladder.pl
V tom programu si napojíš na jednotlivé linie kontkty tak, že vlastně každý řádek je jedna podmínka. v ní se nachází stav vstupů (i virtuálních) zobrazen jako kontakty (zapni, vypni, hodnota, …) a ukončíš to výstupem nebo virtuální cívkou, která zase může ovládat další linie. Ten SW je včetně simulátoru, takže si to můžeš vyzkoušet dřív než to nahraješ. Výstup může být i pro arduino resp. pro mikročip ATMEGA328 🙂To jen pro úplnost. Večer se podívám na ty problémy a zkusím je poopravit.
posjirkaÚčastníkděkuji ti za sdílení informací a zkušeností. To je důvod, proč jsou tyto fóra oblíbená a využitelná i pro laiky. Máš problém, vyřešil si jej a dáváš nám řešení do placu. Držím palce a kdybys něco potřeboval ozvi se …
posjirkaÚčastníksmart rele od schneideru 🙂
dalo se to čekat, je spolehlivé, jednoduše programovatelné a vcelku levné.
Jinak to si můžeš naprogramovat sám pomocí kontaktových schémat …
Používá se např. Siemens LOGO.
Jen pozor na na digitální vstup – tady má hodnotu 24V !!!
Já jsem zatím udělal toto:// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 16_3_2016 // changelog 16_3_2016 // uprava podmínky smyček (zrušeno =) // posun zpoždění 5s z procesu zapálení na jeho konec // doplněna podmínka reakce na termostaty (kotlový/prostorový) v procesu zapálení // 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 // nastavení poruchy a její kvitance tlačítkem na pinu 9 #define davkovaniPelet 6 //dávkování pelet – šnek #define spirala 5 //zapalovací spirála #define ventilator 3 //ventilátor #define alarm 10 //signalizace poruchy #define prostorovyTermostat 12 //prostorový termostat #define kotlovyTermostat 2 //kotlový termostat #define fotobunka 8 //fotobuňka pro kontrolu plamene #define trimr1 14 // nastaveni doby zapaleni DI14 = A0 pro arduino UNO #define tlacitkoKvitance 9 // pin tlačítka kvitance poruchy long cas=13000; int smycka1 = 0; // pomocna smycka - zapálení int smycka1max = 600; // max.pomocne smycky - ted jiz nastavitelne trimrem na A1 60-600s int smycka2 = 0; // pomocna smycka - udržení hoření int smycka2max = 2; // max.pomocne smycky int smycka3 = 0; // pomocna smycka - počet pokusu o zapalení int smycka3max = 2; // max.pomocne smycky int porucha = 0; // proměnná pro záznam poruchy (zatím v režimu 0-1) void setup() { 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 digitalWrite(davkovaniPelet, LOW); //vypni dávkování digitalWrite(spirala, LOW); //vypni žhavení digitalWrite(ventilator, LOW); //potom vypni ventilátor } void loop() { smycka1max = map(analogRead(trimr1), 0, 1024, 60, 600); // nastaveni dobz zapaleni trimrem na A0 if(digitalRead(prostorovyTermostat) == HIGH){ // prostorovy termostat je zapnuty if(digitalRead(kotlovyTermostat) == HIGH){ // kotlový termostat je zapnutý // start //------ digitalWrite(davkovaniPelet, HIGH); //dávkuj pelety delay(12000); //po dobu 12s digitalWrite(davkovaniPelet, LOW); //potom vypni dávkování digitalWrite(ventilator, HIGH); //zapni ventilátor digitalWrite(spirala, HIGH); //zapni žhavení // proces zapálení //---------------- for (smycka3 = 0; smycka3 < smycka3max; smycka3 ++){ for (smycka1 = 0; smycka1 < smycka1max; smycka1 ++){ if(digitalRead(prostorovyTermostat) == HIGH){ // prostorovy termostat je zapnuty if(digitalRead(kotlovyTermostat) == HIGH){ // kotlový termostat je zapnutý if(digitalRead(fotobunka) == HIGH){ //pokud fotobuňka vidí plamen digitalWrite(spirala, LOW); //vypni žhavení smycka1 = smycka1max; // ukonči smyčku1 smycka3 = smycka3max; // ukonči smyčku3 } } else { smycka1 = smycka1max; // ukonči smyčku1 smycka3 = smycka3max; // ukonči smyčku3 } } else { smycka1 = smycka1max; // ukonči smyčku1 smycka3 = smycka3max; // ukonči smyčku3 } delay(1000); } delay(5000); //čekej 5s } // porucha if(digitalRead(fotobunka) == LOW){ //pokud fotobuňka nevidí plamen if(digitalRead(prostorovyTermostat) == HIGH){ // prostorovy termostat je zapnuty if(digitalRead(kotlovyTermostat) == HIGH){ // kotlový termostat je zapnutý // tzn. termostaty chteji topit, ale plamen se nezapalil porucha = 1; // nastav poruchu } } } // udržení hoření //-------------- for (smycka2 = 0; smycka2 < smycka2max; smycka2 ++){ smycka2 = 0; // vynuluj smyčku if(digitalRead(prostorovyTermostat) == HIGH){ // prostorovy termostat je zapnuty if(digitalRead(kotlovyTermostat) == HIGH){ // kotlový termostat je zapnutý if(digitalRead(fotobunka) == HIGH){ //pokud fotobuňka vidí plamen digitalWrite(davkovaniPelet, HIGH); //dávkuj pelety delay(1000); //počkej 1s digitalWrite(davkovaniPelet, LOW); //vypni dávkování delay(1000); //počkej 1s } else { smycka2 = smycka2max; // ukonči smyčku } } else { smycka2 = smycka2max; // ukonči smyčku } } else { smycka2 = smycka2max; // ukonči smyčku } } // dohoření //--------- digitalWrite(davkovaniPelet, LOW); //vypni dávkování pelet delay(84000); //počkej 84s digitalWrite(ventilator, LOW); //potom vypni ventilátor } } if(porucha > 0 ){ // když je porucha aktivní while (digitalRead(tlacitkoKvitance) == HIGH) { // zapni alarm a cekej na stisk tlačítka digitalWrite(alarm, HIGH); // zapni alarm } digitalWrite(alarm, LOW); // vypni alarm porucha = 0; // vynuluj poruchu } else { // jinak digitalWrite(alarm, LOW); // vypni alarm } }
posjirkaÚčastníkmožná mám někde chybku já. budu si muset nadatvit simulator a zjistit kde je chyba.
Proč trápit spirálu? Práv když nevíš kolik je tam pelet, tak zkusit zapálit a když nic tak je tam naládovat. ta podmínka vypnutí termostatu po zapálení a následně 1 min. hoření, vypnutí … těch proměnných a podmínek je tam pak vcelku dost.
asi opustíme tuto myšlenku a necháme to na původní funkci regulace. Opravdu se to pak dá dodělat, jen bych rád udělal 1 fuknční kus a ten pak vylepšoval. kotel a zbytek HW je na tento proces připraven, tak by to neměl být problém. mohl bys sem dát jak ta stávající regulace vypadá? celkem by mě zajímalo co má za signalizaci na sobě a jaké má možnosti nastavení. je dobré vycházet z typového řešení…
posjirkaÚčastníka byl by problém kdyby spirála žhavila třeba 5 minut bze peletek,
Napadlo mě udělat zapalovací proces ve 3 stupních.
1, zapni spirálu a zkus do 5 minut zapálit peletky.
2, nepovedlo se? tak tak 12s naláduj pelekty a zkus to znovu
3, add.2,
Když ani te´d nic tak spus´t alarm a ukonči vše,posjirkaÚčastníkje to otázka co je žádáno.
Dá se udělat proměnná, která bude řešit jednotlivé stupně procesu a když termostat vypne + zapne, tak se vrátí k poslednímu stupni a bude pokračovat dál. V tu chvíli je nutné si říct nějáké podmínky za kterých se má k tomu stupni vrátit a v případě nepslnění podmínek sjet o stupeň dolu.
Už je to pak o více potřebných informacích :
– mám v kotli dost peletek na zapálení?
– nehoří mi už zbytek peltek = je nutené tam cpát 12s plnou dávku pelet?
– …Tohle všechno už moc nesouvisí s programováním, ale s tzv. procesním algoritmem.
Jeho funckí je popsat všechyn možné a nemožné stavy zařízení a reakce na ně.
Vracíme se zpět k tomu diagramu co jsem tady dávali do kupy …Ve výsledku bych být tebou poslat reakce stvávající regulace a „pouze“ ji zkopíroval. čas na vylepšení je vhodné využit na již fungující platformě.
jinak se zasekneš na banalitě a celek tím bude trpět…Dej si tedy dohromady funkcionalitu stávající regulace v jednotlivých provozních režimech + reakci na nenadálé situace a jdeme na to.
Základ si myslím, že už máš ….posjirkaÚčastníkadd 1, co by to mělo dělat, když se vypne termostat? nezapomeń, že máš nasypané peletky a žhavíš spirálu….
add 2, to pujde dodělat. 3,5min může být bu´d nesprávnou frekvencí Arduina (mělo s tím prlbémy moje Arduino u verze IDE tuším 1.0.3). Dej si jednoduchý příklad, rozsvi´t LED na 10s, pak 10s zhasni. No a změř si čas stopkama.
add 3, to else je tam proto, že když vypne termostat kotle, nebo prostorový termostat nebo zmizí plamen, tak automaticky ukončuje „nekonečnou“ smyčku udržení hoření. No a jelikož jsem to nechtel koplikovat tak jsem dal jednu stopku do každé podmínky když se nesplní.Tu upravu zvládneš sám, nebo jí tam mám dát?
posjirkaÚčastníkje myslím čas začít řešit poruchy.
Navrhuji použít „registr poruch“.
uděláš si proměnnou typu byte :
byte porucha = 0; // registr poruch
proměnná typu byte má velikost 8 bite. tzn. 8x pozice 1 nebo 0 pro záznam poruchy.
Můžeš totiž přistupovat ke každému bitu zvlášť a zároveń jej brát jako číslo.
Myslím to tak, že budeme mít 2 typy poruch:
– drobné
– vážné
Přiřadíme si ke každému typu 4 pozice (nikdy nevíš kolik jich budeš potřebovat)
takže bite 0 až 3 budou drobné poruchy – třeba zhasnul plamen během hoření
a bite 4 až 7 budou závažné poruchy – nepodařilo se mi zapálit peletkyJe to super, že máš kam zapisovat chyby, zároveň si je můžeš zobrazit i třídit.
Navíc, pokud se nejedná o závažnou chybu můžeš pokračovat dál.if(porucha < 8) { // když jsou poruchy pouze drobné pokračuj dál ... }
posjirkaÚčastníksakryš, nepodařilo se mi nahrát soubor. no nic vložím ho tedy sem:
// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 15_3_2016_a #define davkovaniPelet 6 //dávkování pelet – šnek #define spirala 5 //zapalovací spirála #define ventilator 3 //ventilátor #define alarm 10 //signalizace poruchy #define prostorovyTermostat 12 //prostorový termostat #define kotlovyTermostat 2 //kotlový termostat #define fotobunka 8 //fotobuňka pro kontrolu plamene long cas=13000; int smycka1 = 0; // pomocna smycka - zapálení int smycka1max = 120; // max.pomocne smycky int smycka2 = 0; // pomocna smycka - udržení hoření int smycka2max = 2; // max.pomocne smycky void setup() { pinMode(davkovaniPelet, OUTPUT); pinMode(spirala, OUTPUT); pinMode(ventilator, OUTPUT); pinMode(alarm, OUTPUT); pinMode(prostorovyTermostat, INPUT); pinMode(kotlovyTermostat, INPUT); pinMode(fotobunka, INPUT); // vsechno vypni digitalWrite(davkovaniPelet, LOW); //vypni dávkování digitalWrite(spirala, LOW); //vypni žhavení digitalWrite(ventilator, LOW); //potom vypni ventilátor } void loop() { if(digitalRead(prostorovyTermostat) == HIGH){ // prostorovy termostat je zapnuty if(digitalRead(kotlovyTermostat) == HIGH){ // kotlový termostat je zapnutý // start //------ digitalWrite(davkovaniPelet, HIGH); //dávkuj pelety delay(12000); //po dobu 12s digitalWrite(davkovaniPelet, LOW); //potom vypni dávkování digitalWrite(ventilator, HIGH); //zapni ventilátor digitalWrite(spirala, HIGH); //zapni žhavení // proces zapálení //---------------- for (smycka1 = 0; smycka1 <= smycka1max; smycka1 ++){ if(digitalRead(fotobunka) == HIGH){ //pokud fotobuňka vidí plamen digitalWrite(spirala, LOW); //vypni žhavení delay(5000); //čekej 5s smycka1 = smycka1max; // ukonči smyčku } delay(1000); } // udržení hoření //-------------- for (smycka2 = 0; smycka2 <= smycka2max; smycka2 ++){ smycka2 = 0; // vynuluj smyčku if(digitalRead(prostorovyTermostat) == HIGH){ // prostorovy termostat je zapnuty if(digitalRead(kotlovyTermostat) == HIGH){ // kotlový termostat je zapnutý if(digitalRead(fotobunka) == HIGH){ //pokud fotobuňka vidí plamen digitalWrite(davkovaniPelet, HIGH); //dávkuj pelety delay(1000); //počkej 1s digitalWrite(davkovaniPelet, LOW); //vypni dávkování delay(1000); //počkej 1s } else { smycka2 = smycka2max; // ukonči smyčku } } else { smycka2 = smycka2max; // ukonči smyčku } } else { smycka2 = smycka2max; // ukonči smyčku } } // dohoření //--------- digitalWrite(davkovaniPelet, LOW); //vypni dávkování pelet delay(84000); //počkej 84s digitalWrite(ventilator, LOW); //potom vypni ventilátor } } // if(millis() >= cas+60000){ //délka žhavení 60s po uplynutí 13s od spuštění/resetu // cas = millis(); // digitalWrite(spirala, LOW); //po vypršení času vypni žhavení(pokud už není vypnuté) // } // if(digitalRead(fotobunka) == HIGH){ //pokud fotobuňka vidí plamen // digitalWrite(spirala, LOW); //vypni žhavení // delay(5000); //čekej 5s // } // while(digitalRead(fotobunka) == HIGH && digitalRead(prostorovyTermostat) == HIGH && digitalRead(kotlovyTermostat) == HIGH){ //dokud fotobuňka vidí plamen+prostorový+kotlový termostat jsou zapnuté // digitalWrite(davkovaniPelet, HIGH); //dávkuj pelety // delay(1000); //počkej 1s // digitalWrite(davkovaniPelet, LOW); //vypni dávkování // delay(1000); //počkej 1s // } // if(digitalRead(prostorovyTermostat) == LOW || digitalRead(kotlovyTermostat) == LOW){ //pokud vypne prostorový nebo kotlový termostat // digitalWrite(davkovaniPelet, LOW); //vypni dávkování pelet // delay(84000); //počkej 84s // digitalWrite(ventilator, LOW); //potom vypni ventilátor // } }
posjirkaÚčastníknejedeš podle diagramu … je potřeba vložit jednu podmínku do druhé a když se poruší tak z ní hend vypadnout.
Upravil jsem ti to podle se …. nezapomeň na verzování a kod vkládej buď jako soubor (díky moc admine) nebo do párových zanček CODE. Je to to tlačítko vedle UZAVŘÍT ZANČKY.posjirkaÚčastníkok … hlavně v klidu všechno rozmyslet, pořádně vyzkoušet, uložit novou revizi a pokračovat dál.
držím palce …posjirkaÚčastníkmě to ani tak nechytlo, jako ti chci pomoct vyhnout se slepým uličkám.
Nemám kotel na peletky a ani ho neplánuji …
Nic méně, zkus se na to podívat sám. Z diagramu zjistíš, co vlastně potřebuješ.
Funkce zapni, vypni a td jsou pouze digitalWrite(rele,1); nebo 0.
kosočtverce jsou rozhodovací příkazy If(…).
Pauza je vlastně delay(…) a smyčka je cyklus For(….);máš zadání, návod i princip. Já se jdu věnovat dalším věcem, ale rád ti pomůžu dál. jen čas na ostatní věci se mi trochu smrskl, tak musím pozornost na čas převést tam.
Zkoušej ptej se, …. věřím že výsledek bude stát za to.jen drobná poznámka. Při delay(..); se ti na nastvenosu dobu „uspí“ procesor.
proto je dobré řešit delší pauzy jäkou smyčka krátkých pauz. Máš totiž mezitím čas otestovat satv zařízení.
navíc bude určitě nutné zapnout WATCHDOG na procesoru (hlídání zda se nezasekl).
ten funguej tak, že nastavíš max. timeout a před vypršením tohoto času musíš resetovat jeho proměnnou. když to neuděláš, procesor je považován za zaseknutý a sám se resetuje. Jeho časy ovšem nejsou úplně variabilní a nejdelší timeout je tuším 8s. Při použití delay(..) délky třeba 10 minut ti ani deoběhne a sám procesor se resetuje. ještě můžeš použít externí obvod s delším časem, ale připadá mi to komplikované když máme all-in-one přímo od výrobce. Stačí to jen dobře uchopit.posjirkaÚčastníkještě jsem to poupravil, jak si myslím, že to asi funguje i když těch šedých míst tam je pořád hodně.
Ještě jsem to rozdělil na jednotlivé funkční celky (funkce), které se dají odladit samostatně a následně doplnit do celku. navíc bude lepší přehled o tom co která část dělá….
I přes to potřebuji vědět odpovědi na předešlé otázkyAttachments:
-
AutorPříspěvky