PeterL
Vytvořené odpovědi
-
AutorPříspěvky
-
jurisek81
ÚčastníkDobrý den,
Arduino sice neumím ale mohl bych to udělat na PLC. Amit ADiR. Cena jednotky je ale 8.000 bez DPH. Programování velmi jednoduché. Je to PLC, má to dlouhou životnost a vysokou spolehlivost. Programově nic složitého. Uměl bych i navrhnout a vyrobit rozvaděč pro silové řízení. Jsem z Ostravy.
S pozdravem
Jiří Krmašek
johnyhol
ÚčastníkZdravím, tak jsem to vyzkoušel a poznatky jsou následující:
1) test zapálení, rozhoření, hoření, vypnutí jednoho z termostatů, dohoření -> OK
2) test ztráty plamene během hoření -> tady je něco špatně. Pokud fotobuňka nevidí plamen, tak správně vypne dávkování pelet, ale potom běží čas na dohoření 84s a až pak to začne znovu dávkovat pelety a začne nový pokus o zapálení (respektive dva a pak to jede od znova pořád dokola) a hlavně to nesignalizuje chybu „Alarm“ na výstupu 10 – tady bych to řešil pouze vypnutím dávkování, mohl by ještě doběhnout ventilátor a pak by to zapnulo/ohlásilo poruchu. Jak jsem psal už dřív, tak se tato situace stává pouze když dojdou pelety, proto bych se tím zbytečně moc nezabýval.
3) test vypnutí termostatu během zapalování -> vypne to spirálu a začne běžet dohoření. Taky bych to trochu poopravil, aby to nechalo žhavit po nastavenou maximální dobu (10min.), nebo pokud to nezapálí a pak aby to dalo řekněme dvě dávky paliva a začal proces dohoření. Tím by se vyřešil případný problém s kopou pelet v komoře hořáku při dalším zapálení/zapnutí termostatu.
Díky!dejvicz
ÚčastníkKoukni na https://www.youtube.com/watch?v=ED-eUlwiN6I
Je to více méně použití bezdrátového ovládání a posílání dat na frekvenci 433 jak zmiňoval posjirkaposjirka
Účastníkto je fakt zvláštní. Jak budu mít trochu času a prostředků, tak to zkusím na normálním arduinu. Teď jedu přes simulátor. v příloze je hrubý diagram funkce …
Attachments:
johnyhol
ÚčastníkTakhle by to asi šlo, vyzkouším a dám vědět. Jenom u toho nastavení max. zapalovací doby mně to tak jak píšeš nefunguje. Když dám pin přímo na zem tak to běží cca. 3,5min. a když ho dám na 5V tak to běží cca. 21,5min. Takže když jsem dal 10K trimr na střed, tak mi to běželo cca. 12min a proto jsem to musel honit abych tam dostal těch požadovaných 10min.
posjirka
Účastník// REGULACE PELETKOVEHO KOTLE // author. Johnyhol & by JP // v 20_3_2016 // changelog // v20_3_2016 // sloučení podmíněných funkcí // vypnuti zhaveni pri rozepnutí termostatů (kotlový nebo prostorový) // rozdeleni funkci do vlastnich funkcnich bloku // zapojeni seriove komunikace pro odladeni funkci // v16_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() { // 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(); } void loop() { Serial.println("Cekam na sepnuti termostatu ..."); // ladici seriova komunikace 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ý // startovaci davka pelet //------------------------ zapalovaciDavkaPelet(); // proces zapálení //---------------- zapaleni(); // test poruchy // ----------------- testPlamene(); // udržení hoření //-------------- udrzujHoreni(); // dohoření //--------- dohoreni(); } } // kvitence pripadne poruchy //------------------------------- kvitancePoruchy(); } void vypniVse() { // funkce vypni vše Serial.println("Vypinam vsechny rele ..."); // ladici seriova komunikace digitalWrite(davkovaniPelet, LOW); //vypni dávkování digitalWrite(spirala, LOW); //vypni žhavení digitalWrite(ventilator, LOW); //potom vypni ventilátor } void zapalovaciDavkaPelet() { // prvotni davkovani pelet pro zapaleni Serial.println("Davkuji pelety pro zapaleni ..."); // ladici seriova komunikace 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í } void zapaleni() { // funkce zapaleni pelet // 3 pokusy o zapálení Serial.println("Spoustim zapaleni ..."); // ladici seriova komunikace for (smycka3 = 0; smycka3 < smycka3max; smycka3 ++){ // smyčka "1-10" minut zapalování for (smycka1 = 0; smycka1 < smycka1max; smycka1 ++){ 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(prostorovyTermostat) == LOW || digitalRead(kotlovyTermostat) == LOW){ // prostorovy nebo kotlovy termostat vypne digitalWrite(spirala, LOW); //vypni žhavení smycka1 = smycka1max; // ukonči smyčku1 smycka3 = smycka3max; // ukonči smyčku3 Serial.println("Rozepnuti termostatu ..."); // ladici seriova komunikace } 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 Serial.println(" hori ..."); // ladici seriova komunikace } else { Serial.println(" nehori ..."); // ladici seriova komunikace } delay(1000); } delay(5000); //čekej 5s } } void testPlamene() { // test plamene Serial.println("Test plamene ..."); // ladici seriova komunikace if(digitalRead(fotobunka) == LOW){ //pokud fotobuňka nevidí plamen delay(1000); // pocekej jeste 1s a zkus to znovu 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 } } } } if(porucha == 1){ Serial.println("Test plamene ... porucha"); // ladici seriova komunikace } else { Serial.println("Test plamene ... ok"); // ladici seriova komunikace } } void udrzujHoreni() { // funkce udržení hoření Serial.println("Udrzeni horeni ..."); // ladici seriova komunikace for (smycka2 = 0; smycka2 < smycka2max; smycka2 ++){ smycka2 = 0; // vynuluj smyčku if(digitalRead(prostorovyTermostat) == HIGH && digitalRead(kotlovyTermostat) == HIGH){ // prostorovy + kotlovy termostat je zapnuty 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 { delay(1000); // pocekej jeste 1s a zkus to znovu if(digitalRead(fotobunka) == LOW){ //pokud fotobuňka nevidí plamen smycka2 = smycka2max; // ukonči smyčku porucha = 1; // nastav poruchu } } } else { smycka2 = smycka2max; // ukonči smyčku } } } void dohoreni() { // funkce dohoreni Serial.println("Dohoreni ..."); // ladici seriova komunikace digitalWrite(davkovaniPelet, LOW); //vypni dávkování pelet digitalWrite(spirala, LOW); //vypni žhavení - pro jistotu delay(84000); //počkej 84s digitalWrite(ventilator, LOW); //potom vypni ventilátor } void kvitancePoruchy() { // funkce kvitance poruchy Serial.println("Kvitance poruchy ..."); // ladici seriova komunikace if(porucha > 0 ){ // když je porucha aktivní // vypni vse vypniVse(); while (digitalRead(tlacitkoKvitance) == HIGH) { // zapni alarm a cekej na stisk tlačítka digitalWrite(alarm, HIGH); // zapni alarm Serial.println("Porucha ... cekam na kvitanci"); // ladici seriova komunikace } Serial.println("Porucha kvitovana ..."); // ladici seriova komunikace digitalWrite(alarm, LOW); // vypni alarm porucha = 0; // vynuluj poruchu } else { // jinak Serial.println("Zadan porucha ..."); // ladici seriova komunikace digitalWrite(alarm, LOW); // vypni alarm } }
Je tam pro odladění nastavena komunikace po seriove lince.
Po odladění jí můžeš smazat/zakomentovat. je dobře označenaduck130883
ÚčastníkDiky za tip s temi zasuvkami, neco takoveho by bylo taky reseni ale ja bych potreboval misto spinaciho tlacitka neco jako spinaci rele.
Jinak, napisu to jako blb, protoze mi to asi nejde moc dobre vysvetlit.
-idealni by byl nejaky vysilac a prijimac a vetsim dosahem
-vysilac bych zapojil misto puvodni LED diody
-prijimac bych zapojil nekde dal mezi baterii a led diodu
-kdyz by vysilac dostal signal (puvodni proud pro LEDku) na dalku by sepl prijimac ktery by slouzil jako rele a pustil by proud z baterie do LEDkyMyslim si ze neco takoveho musi prece uz existovat hotove, nebo se pletu?
A ted k veci, proc to vlastne potrebuji a na co.
– mam software v PC kde v realnem case striham video z kamer
– do pc mam zapojene Arduino UNO R3 a v nem nahrama Firmata, ktere potrebuje soft v PC aby mohl s deskou komunikovat.
– deska pak dle pokynu softu v PC pousti prou do ruznym pinu a spina ruzne pripojene LEDky, ktere jsou natazeny u jednotlivych kamer
– kdyz v softweru v PC zvolim kameru1 tak clovek u kamery1 vidi rozsvicenou LEDku a tim padem vi ze ho vysilam a ma si davat majzla.V podtate se jedna o jednoduche tzv. TALLY LIGHTS
Ted uz umim bezdratove prenaset obraz z HDMI a chtel bych i TALLY bezdratove, proto to resim.
Nevim zda je to mozne cele zprovoznit jenom s prvky od ARDUINA protoze programarine ARDUINA vubec nerozumim a netusim co vsechno to umi nebo umi.
Nebo spis zakhle, ARDUINO umi hodne, JA umim malo.Treba ani netusim kdyz budu mit jedno arduino s modulem nRF24L01+ tak zda je mozne ovladat s nim vice arduin s tim samym modulem soucasne.
predem diky za info
posjirka
Účastník1) Proces zapalování je zdá se v pořádku, včetně nastavení max. zapalovací doby trimrem (mimochodem super nápad, není to sice moc elegantní – musel jsem si s tím trochu pohrát abych tam dostal těch 10min., ale účel to splní)
Právě že to máš vcelku jednoduché, buď ten pin dáš přímo na zem (1 minuta) nebo na +5V (10 minut)
2) Zkoušel jsem simulovat během zapalování vypnutí prostoráku a tady to ještě bude chtít odladit -> po vypnutí to pořád žhaví a točí se ventilátor, ten se po 84s vypne, ale spirála žhaví dál. Hlavně to vůbec nereaguje na fotobuňku.
Opraveno …
3) Zkoušel jsem taky simulovat ztrátu plamene během hoření a tady je to celkem v pořádku – přestane to podávat pelety, počká to 84s, pak vypne ventilátor a začne proces zapalování -> tady by to možná chtělo řešit poruchou, protože plamen by pokud se nezasekne peleta v dopravníku, nebo nedojdou pelety neměl zhasnout nikdy.
opraveno + doplněna porucha při ztrátě plamene při hoření.
Zkusil jsem udělat takovou fintu: kontroluje že tam je plamen a pokud ne počká 1s a zkusí to znovu. Pak vyhlási chybu.Podívej se na to a vyzkoušej. Kod dám do dalšího příspěvku:
posjirka
Účastníkco spíš použít formu dotaz/odopvěď.
Můžeš si říct, že char(2) je dotaz na minutu, char(3) dotaz na hodinu, …
tím pádem nebudeš posílat 18 bytů (bitu?) v základu je I2C (TWI) navržena pro komunikaci po 8 bitech + adresa + start/stop bity.
Zkus si poslat jednoduché informace : … posílej si stále dokola číslo po každém přijmuti jej zvyš o 1.je to super pro monitorování stability komunikace. Při každé přijmuté odpovědi si můžeš ověřit, že jsi dostal správné data, případně si nechat rozsvítit LED diodu jako chybu .posjirka
Účastníkexistuje, třeba bezdrátově ovládané zásuvky na 433MHz:
http://www.conrad.cz/bezdratove-spinaci-systemy-433-mhz.c0806012
tím můžeš spínat spotřebiče na dálku pomocí ovladače. Ovladač se spáruje se zásuvkami, takže vlastně může 1 ovladač teoreticky ovládat na 1 tlačítko více zásuvek zároveň.
Samotné arduino nemusí využívat vždy SPI rozhraní. Navíc analogové vstupy jdou také přepnout na digitální vstupy/výstupy.
Pro komunikaci můžeš použít boduly jako Bluetooth nebo WIFI. Ty jsou připojené přes UART, takže zabírají pouze 2 piny.Jde spíš o to jaké potřebuješ finální řešení = co to vlastně bude dělat….
rakocid
Účastníkmusím použivať odpory?, keď mam na wire zbernicu pripojene ds3231? myslím že už ds3231 obsahuje odpory. Skúsil som to snimi aj bez nich ale správalo sa to rovnako. mohlo by pomocť vyradiť z ds3231 interne rezistory a pridať externe s nižsím odpor?
Alebo som rozmýšľal neposielať naraz 18 bytov ale rozdeliť to. Pýtať si napríklad po troch postupne. Nieje to veľa? Ale neviem ako sa to robí, či sa to dá. DS3231 knižnica funguje tak že si pýta stále len to čo potrebuje s funkciami (getSecond(); getMinute();…). Dalo by sa takéto slave zariadenie urobiť aj z arduino nano?
Ďakujem za radi
posjirka
ÚčastníkKoukám, že jsi použil tutorial odtud :
Tutoriál – užívání hodin reálného času DS1307 a DS3231 s Arduinem
Je to v pořádku, člověk se musí učit na něčem vyzkoušeném. Na mě je to zbytečně komplikované. Doporučoval bych použít tuto knihovnu + exampl:
https://github.com/JChristensen/DS3232RTC/blob/master/examples/TimeRTC/TimeRTC.ino
Ten kod se ti zpřehlední a bude pro tebe možná srozumitelnější. k jednotlivým informacím se dostáváš pomocí předdefinovaných funkcím. Např pro aktuální minutu použiješ :
int AktualniMinuta = minute();
Knihovna používá kombinaci sznchronizovaného času z RTC +knihovnu arduina Time pro přístup k aktuálnímu času.To s odopjením modulu od arduina: možná bych zkusil odpojit baterii a dát tam jinou.
Pro nastavení zapnutí/vypnutí bych tě odkázal na forum, kde jsem něco podobného už řešil:
http://duinozone.cz/index.php?topic=611.0posjirka
Účastníkještě jak to máš od sebe vzdálené, Někdy to blbne když je to daleko. Pak se snižuje odpor PULL UP třeba na 2k2 nebo 1k0 … Kdyžtak to zkus a jak budu mít chvilku tak se na to já nebo někdo jiný podívá …
posjirka
ÚčastníkJe taková obecná poučka pro logické obvody.
Rozděl si napětí zdroje na třetiny = 0 – 8 – 16 – 24V
Takže 0-8V je logická nula
16-24V je logická jednička
8-16V je zakázáné/necitlivé pásmo = hazardní stavLMXLuke
ÚčastníkTo je právě ten problém, Já jsem v podstatě na začátku. našel jsem na netu nějaký kód, kterým můžu zapsat do obvodu a pak číst datum a čas. Ale potřebuju z toho obvodu času přečíst den v týdnu, hodinu a minutu a pak to použít v IFu. Když tak ten kód sem můžu dát a někdo mi vysvětlete kde se čtou tyhle hodnoty a kam se zapíšou, s kterou proměnnou můžu pracovat v podmínce. Já to v tom kódu prostě nevidím. Dál jsem taky zjistil, že zřejmě ten obvod, co jsem koupil, je vadný. Dám příklad: Zapíšu do něj 12:30 a pak čtu jestli tam je správnej čas, všechno běží jak má. Ve 12:35 odpojim arduino z usb abych zjistil jestli obvod tiká i na baterce. Ve 12:40 ho znovu připojím, znovu nahraju program do arduina, tentokrát ale BEZ zapisovací části a čtu, ale obvod začne znovu tikat od chvíle 12:35, tedy od chvíle odpojení, tudíž na baterce netiká, nebo nevím
#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); } void setup() { Wire.begin(); Serial.begin(9600); // set the initial time here: // DS3231 seconds, minutes, hours, day, date, month, year // setDS3231time(30,42,21,4,26,11,14); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes of data from DS3231 starting from register 00h *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void displayTime() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // send it to the serial monitor Serial.print(hour, DEC); // convert the byte variable to a decimal number when displayed Serial.print(":"); if (minute<10) { Serial.print("0"); } Serial.print(minute, DEC); Serial.print(":"); if (second<10) { Serial.print("0"); } Serial.print(second, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" Day of week: "); switch(dayOfWeek){ case 1: Serial.println("Sunday"); break; case 2: Serial.println("Monday"); break; case 3: Serial.println("Tuesday"); break; case 4: Serial.println("Wednesday"); break; case 5: Serial.println("Thursday"); break; case 6: Serial.println("Friday"); break; case 7: Serial.println("Saturday"); break; } } void loop() { displayTime(); // display the real-time clock data on the Serial Monitor, delay(1000); // every second }
rakocid
ÚčastníkMASTER:
#include <DS3231.h>
#include <Wire.h>DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;
int c[18] ;
float humid, templ = 20, humid_2, temp2 = 20,humid_3, temp3 = 20,humid_4, temp4 = 20,humid_5, temp5 = 20, humid_6, temp6 = 20;void setup()
{
Wire.begin();
}void loop()
{
Wire.requestFrom(44, 18);
int x = 0;while (Wire.available())
{
c[x] = Wire.read();
x++;
}if(c[0] < 35 && c[0] > 5){
humid_5 = c[2];
temp5 = (c[0]*10)+(c[1]/10);
temp5 = temp5/10;}if(c[3] < 35 && c[3] > 5){
humid_4 = c[5];
temp4 = (c[3]*10)+(c[4]/10);
temp4 = temp4/10;}if(c[6] < 35 && c[6] > 5){
humid = c[8];
templ = (c[6]*10)+(c[7]/10);
templ = templ/10;}if(c[9] < 35 && c[9] > 5){
humid_2 = c[11];
temp2 = (c[9]*10)+(c[10]/10);
temp2 = temp2/10;}if(c[12] < 35 && c[12] > 5){
humid_3 = c[14];
temp3 = (c[12]*10)+(c[13]/10);
temp3 = temp3/10;}if(c[15] < 35 && c[15] > 5){
humid_6 = c[17];
temp6 = (c[15]*10)+(c[16]/10);
temp6 = temp6/10;}Serial.println(templ);
Serial.println(temp2);
Serial.println(temp3);
Serial.println(temp4);
Serial.println(temp5);
Serial.println(temp6);Serial.print(Clock.getHour(h12, PM), DEC);
Serial.print(‚ ‚);
Serial.print(Clock.getMinute(), DEC);
Serial.print(‚ ‚);
Serial.print(Clock.getSecond(), DEC);delay(2000);
}SLAVE:
#include <Wire.h>
byte c[18] ;void setup() {
Wire.begin(44);
Wire.onRequest(requestEvent);
}void loop() {
//…
}void requestEvent()
{
Wire.write(c,18);
}Program je dosť dlhý prepísal som základ toho ako využívam wire, dufam že len vtom budem mať neaku chybu, mam to zapojene na testovanie takto… používam aj ethernet modul, pretože udaje posielam po sieti. Odpory používam 4,7 kOhm
Attachments:
posjirka
Účastníkhod se kod a zapojení … ale to jak to máš opravduzapojené, né stažené z netu 🙂
johnyhol
ÚčastníkChápu že bych to musel předělat na 5V když bych tam chtěl dát Arduino tak jak to je momentálně, ale jde mi o to jak se chová stávající zapojení. Konkrétně jestli musí být na konkrétním digitálním vstupu přesně 24V aby to vykonalo požadovanou věc, nebo jestli tam jde nastavit ať to dělá něco v případě že je na vstupu např. > 0V. Protože pokud měřím ostatní vstupy, tak tam je právě těch 24V a ani se to nehne, kdežto u fotobuňky to kolísá. Jinak pokud se nám to podaří rozchodit s Arduinem tak to plánuju stejně komplet předělat (přepojit).
posjirka
ÚčastníkArduino 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.johnyhol
ÚčastníkOK, díky!
Ten Schneider právě nemůžu naprogramovat ani ručně, protože to má výrobce zamknutý. Dostanu se pouze do nastavení jednotlivých parametrů. (třeba jak dlouho to má sypat pelety, jakou dobu má běžet ventilátor, nebo jak dlouho má žhavit spirála) Ještě bych měl dotaz. Jak si psal, tak to má digitální vstupy 24V a do jednoho je napojená i fotobuňka. Respektive je napojená do silové jednotky a z ní pak leze do toho vstupu podle intenzity světla co vidí napětí v rozmezí 0-20V. Je to tedy tak v pořádku? Dají se nastavit ty vstupy, že reagují na určitý rozsah (hodnotu) napětí? a těch 24V je maximum co se tam dá poslat? Napadlo mě, jestli nemůže být problém v tý silový jednotce (že třeba dává menší napětí) a ta pak zblbne to program. relé.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.
johnyhol
ÚčastníkAhoj. Tak jsem to podrobil rozsáhlým testům a poznatky jsou následující:
1) Proces zapalování je zdá se v pořádku, včetně nastavení max. zapalovací doby trimrem (mimochodem super nápad, není to sice moc elegantní – musel jsem si s tím trochu pohrát abych tam dostal těch 10min., ale účel to splní)
2) Zkoušel jsem simulovat během zapalování vypnutí prostoráku a tady to ještě bude chtít odladit -> po vypnutí to pořád žhaví a točí se ventilátor, ten se po 84s vypne, ale spirála žhaví dál. Hlavně to vůbec nereaguje na fotobuňku.
3) Zkoušel jsem taky simulovat ztrátu plamene během hoření a tady je to celkem v pořádku – přestane to podávat pelety, počká to 84s, pak vypne ventilátor a začne proces zapalování -> tady by to možná chtělo řešit poruchou, protože plamen by pokud se nezasekne peleta v dopravníku, nebo nedojdou pelety neměl zhasnout nikdy.Ještě k tomu Schneideru. Taky jsem si původně myslel, že tomu zkusím aspoň přehrát firmware, ale jenom kabel na připojení k PC stojí cca. 2tis. Tak proto jsem se rozhodl, že to zkusím s Arduinem a aspoň se něco přiučím.
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 …
Simakai
ÚčastníkAhoj všem,
zatím na projektu pracuju a hotový ještě není. Tento příspěvek píšu jednak proto, abych vykázal nějakou aktivitu, jednak proto, aby posjirka věděl, že tohle vlákno nepošlo : a jednak proto, že zrovna mám čas hodit sem pár postřehů.
1) Peklo s diodou: Koupil jsem si několik diod, k nim dle rad na internetu dopočítal rezistory, zapojil do kontaktního nepájivého pole a nic. Zkoušel jsem s rezistorem, bez, tak či onak, otočit atd a nesvítila. Jen se mi podařilo pár diod rozsvítit na jejich poslední cestu do křemíkového nebe (red dwarf spoiler 😉 při jejich odvaření. Řešení se nakonec ukázalo samo – já pakoš jsem zapojoval kaskádu rezistor + dioda do jedné řady v breadboardu a tedy jsem všechny nožičky napojoval do jednoho uzlu obvodu :-D. Po elementárním uvědomění jak vlastně pozapojovat obvod na breadboardu to již fičí.
2) Peklo s SD kartou 1: občas to kartu detekovalo, občas ne. V celém cyklu dělám totiž několik testů, zda je SD karta dostupná, abych buď diodou signalizoval že je či není, nebo před samotným zápisem dat. Nakonec jsem vygooglil, že SD knihovna má v sobě elementární chybu a musel jsem upravit SDClass::begin proceduru a přidat tam něco jako if(root.isOpen()) root.close(). Pak to začlo fungovat dobře a test přítomnosti SD karty je možno volat opakovaně.
3) Peklo s SD kartou 2: při zahájení měření se prohledá SD karta, zda tam existuje soubor typu mer00001.csv a pokud ne, tak ho založí, pokud jo, tak se zjistí nejvyšší číslo v souborech a vytvoří se nový soubor s číslem o jedna vyšším, tedy například při existenci mer000001.csv se vytvoří mer000002.csv. Nu a občas to správně našlo všechny soubory a propočítalo z jejich názvů jméno nového souboru a někdy to nenašlo nic a tedy mi to otevřelo základní mer000001.csv. Po několika probrečených večerech jsem přišel na to, že v proceduře pro procházení souborů musím za root = SD.open(„/“); přidat příkaz root.rewindDirectory(); a pak prohledávat soubory, neboť SD knihovna si bez rewindu pamatovala konec řady prohledávaných souborů a tedy nic neobjevila. Rewindem se to vyřešilo.
4) Peklo s časem: po startu logování se mi na LCD display ukazuje čas ve formátu hh:ii:ss a i se to zapisuje na SD kartu. K mému údivu při testu mi to po cca 5 hodinách a 47 minutách začlo čas počítat opět od začátku. Čas odvozuju od millis a ty se mi logovaly správně (stále narůstaly). Po deseti hrstích vytrhaných vlasů jsem zjistil, že v proceduře pro formát času z hodnoty millis (kterou jsem převzal z internetu), musím nahradit řádek days = inttime / (24 * 3600); jiným zápisem a sice days = inttime / 86400; a pak to funguje dobře. To mě, věru, překvapilo nejvíc. Nakonec jsem zjistil, že tam vlastně dny ani nepotřebuju a rovnou tam hledám hodiny pomocí řáku hours = inttime / 3600; a to funguje bezpečně dobře. Krásně mi to loguje i 31:25:13 atd, tedy vím, že od startu logování uběhlo 31 hodin.
Jiné 1): LCD display se mi podařilo připojit napoprvé, resp. velmi rychle, dokonce jsem tam zapojil i potenciometr na nastavení kontrastu a taktéž to funguje dobře.
Jiné 2): Malý senzor s na teplotu se mi taktéž podařilo zprovoznit rychle, za využití knihoven OneWire.h a DallasTemperature.h
Co mě čeká: stále mi nedorazily termočlánky a k nim objednané převodníkové moduly, takže se těším, co mě překvapí. Už teď vím, že budu muset vyřešit více zařízení na SPI sběrnici, ale teoreticky to zmáknuté mám, SD čtečku už na SPI vlastně taky mám a funguje, takže jsem skoro v závěru.
Snad mé postřehy uvedené výše pomůžou i dalším při řešení problémů s arduinem.
Martin
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 } }
johnyhol
ÚčastníkTak znova:
Attachments:
johnyhol
ÚčastníkJe tam tohle:
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í…
-
AutorPříspěvky