Meg kellene nézni, hogy miért szalad bele a végtelen ciklusba. Valahogy írj ki egy logot, hogy el tudd csípni a hibajelenséget (én azt sem tartom kizártnak, hogy nem végtelen ciklusba szalad -- a kód alapján nem tud, bár ehhez alant lesz egy megjegyzésem --, hanem a feszültség instabilitása egyszerűen kiüti a mikrokontrollert (megáll, mint a bot).
Az elektronikai tervezés oldalához annyit kell hozzátenni, hogy vagy nagyon védeni kell a mikrokontrollert (stabilizátor IC-k, kondenzátorok a táphoz), vagy teljesen külön tápról kell járatni a nagyobb fogyasztókat, és a mikrokontrollerről teljesen függetleníteni kell minden "meleg" részt (meleg itt = tápfeszültség).
A jelek átadásának ilyetén való módját galvanikus leválasztásnak hívják, és egyik (nem egyetlen) eszköze az optocsatoló. Bináris jelátvivő, egyik oldalán az adóval (arduino láb), másik oldalán a vevővel (relé tápellátás). A két tápoldal teljesen külön van, visszafelé nem jöhet semmi (nagyon leegyszerűsítve egy LED és egy fényérzékelő ellenállás), áram nem is folyik. A föld közösítés sem feltétlen muszáj, de ha a föld valami okból kifolyólag nem azonos potenciálon van, abból lehetnek galibák. Több megoldás van erre, ezt lásd alant.
A kódra visszatérve:
if (cefrezo >= cefrezo_cel_be){ digitalWrite(rele_c, LOW); } else{ } if (cefrezo <= cefrezo_cel_ki){ digitalWrite(rele_c, HIGH); } else{ }
Mondom sorban a javaslatokat:
1. else teljesen fölösleges, redundáns (le sem fordítja a compiler).
2. elegánsabb megoldás külön venni a vizsgálatot és a kimenet állítását. Ehhez kell egy boolean változó, mondjuk cefrezoReleAllapot néven, true szinten behúzva, false szinten kiengedve.
bool cefrezoReleAllapot = false; // ez a Setup-ba vagy elé, deklarálunk és hozzá is rendelünk egyből
// vizsgáljuk a célértéket ÉS azt is, hogy a relé be van-e húzva, csak akkor változtatunk, ha nincs. Az && jelentése logikai ÉS, vagyis az if csak akkor teljesül, ha mindkét feltétel igaz.
if (cefrezo >= cefrezo_cel_be && cefrezoReleAllapot == false)
{
cefrezoReleAllapot == true;
}
digitalWrite(rele_c. cefrezoReleAllapot); // Itt csak beállítjuk a relé állapotát aszerint, ahogy előtte módosítottuk (ha módosítottuk egyáltalán).
A tápot multiméterrel tudod ellenőrizni. Rákötöd a két relét és párhuzamosan a multimétert (ha van két multimétered, akkor az egyiket sorosan árammérésre). Mérsz egy feszültséget és bízol benne, hogy 4,9 és 5,1 között lesz. Behúzod az egyik relét. Ha röccen vagy változik a feszültség, akkor szar a táp. Aztán behúzod a másik relét is, ha röccen vagy változik, akkor vegyél új tápot, nem lehet segíteni rajta. A röccenésen mondjuk annyit lehet, hogy egy tetemes méretű kondit beleraksz a lehető legközelebb a tápfelvételi ponthoz (reléhez). 0,2 A áramfelvételt is láttam már kicsiolcsókínai relétől, ami egy Arduino táp IC-hez képest igen tetemes és USB-n sem épp elhanyagolható.
Nézzük tovább.
Van a hőelem és van a hőelem csatoló. A hőelem csatolóra írhatott Lady Ada 3,3 V-ot, de specifikáció szerint 3–5,5 V-ig működőképes. Az igaz (nagyon igaz), hogy két eltérő feszültségre két eltérő hőmérsékletet fog konvertálni, ezért fontos, hogy stabil tápegységet kapjon (amelyik minden bekapcsolásnál, minden körülmények között stabilan mondjuk 5 V-ot ad neki). Az Arduino kimenete kevésbé tud ilyet produkálni. Illetve az egyes lábak ugye high-on rendszerint 5V +/-0,5V kb., kivéve a Due-t, ami 3,3V.
Nézzük az ideális bekötést egyszerűsítve, szövegesen.
1. Az egyik tápról menjen az Arduino és a két hőelem csatoló, de lehetőleg úgy, hogy a hőelem csatolók tápellátása közvetlenül vagy az Arduino 3.3 V-os lábáról vagy közvetlenül a tápról menjenek (ha küldesz linket arról, hogy pontosan milyen eszközeid vannak, akkor lehet konkrét ötletet adni).
2. A reléken lévő bemeneten remélem van optocsatoló (elvileg kell lennie). Normális körülmények között ez úgy van megoldva, hogy a relé két oldala teljesen el van választva (van egy erősáramú relés oldal és egy másik, ami a mikrokontroller felé néz, ezeken nincs közösítve a földelés vagy egy jumperrel széthúzható). A +5V-ra menjen a másik táp +5V-ja, a GND-re a táp GND-je, a bemenetre az Arduino láb kimenete.
3. Az Arduino GND-t és a relé GND-t össze kell kötni (ellenkező esetben az optocsatoló "adó" oldala nem fog működni).
A kalibrálásnak utána kell olvasnom, de a max6675-ben eleve van valami (a hidegpontot kompenzálja hozzá, de a kapott adat már feldolgozott/korrigált).
Igen, az fontos valóban, hogy ahány kártya (szinte), annyi különböző feszültség a HIGH.
Minden hőelem azonos elven működik: két félvezető hőmérséklettől függően adott feszültséget produkál, ezt lehet nagyon pontosan mérni. Nem feltétlen kell hozzá átalakító (MAX6675 például), de az analóg jelfeldolgozásnak vannak hátrányai. A K a legszélesebb körben támogatott, legsűrűbben használt típus, hátránya, hogy a vízhez kapcsolódó feladatokra már nem kellően nagy a felbontása/pontossága.
Processing (az Arduino IDE alapja). Ugyanúgy C, de inkább a PC-s oldalra kihegyezve. A serial adatokat simán tudja fogadni és onnan már azt csinálsz vele, amit akarsz, grafikus kijelzést is akár. C alapú ez is. Adatmegjelenítésre, feldolgzásra, mentésre is van rengeteg példa rá.
Sima USB-s telefontöltőt, 1,5Ah -at már próbáltam USBn keresztül megtáplálni, de ugyanazt a jelenséget produkálta amit leírtam. Teljensen jól működött míg csak az egyik hűtővel kellett bajlódnia, de mikor párhuzamosan melegedett mind a kettő, akkor elkezdett másodpercenként ki-be kapcsolni. Rá tudtam nézni gépről a mért adatokra, és bizony mikor valamelyik relét húzni kellett, akkor a következő mérés már 30C-vel mellé ment, és az már túl volt a hiszterézisen, így elengedte, majd megint húzta, megint el.... egyenlőre rendes USB-ről "stabilan" működik, azon kívül, hogy bele-bele szalad egy végtelen ciklusba.
Van mellette egy 5V-os 2A-s tápom, amit perpill nem használok, de oda lett hozzá tervezve, mondjuk nem tudom menniyre stabil, szkópom sajnos nincs, de multival "jónak néz ki".
Ha legközelebb ott leszek akkor megpróbálom külön-külön meghajtani, mert jelenleg valóban a board 5V-járól kapja a relé is a tápot. Ha kér külön tápot tennék a relének és a boardnak akkor csak a "gndket összekötöm"( lehet hülyeség de nem lesz ettől +- os a táp) ?
A hőelemmel viszont egyenlőre nem tudok mit kezdeni ( a pufferkondin kívül) mivel annak sajnos 3,3V-ra van szüksége, ezért külön tápot nem akartam hozzá, így szeretném ha maradna a boardról.
A kalibrálásra én is gondoltam, de ezt programban hogy kezelhetem le? Csak beleírom, hogy ha mér X-et de az amúgy 5-el kevesebb akkor Y=X+5 és Y-ra kapcsoljon?
A kijelző tervben van, de ettől még van egy nagyobb projekt ami több figyelmet igényel, ( szerintem arról is be fogok számolni :-) ) A Serial.print csak azért maradt, hogy rá tudjak nézni gépről.
@mekkGyver a hűtőtornyokba direkt a K elemeknek lett fészek kialakítva (10cm-es belső felületen mérnek), illetve az ithoni fűtésemet is ők ellenőrzik évek óta, így megbízom bennük, ezért ragaszkodom is hozzá.
@titusz99 légy szíves kifejtenéd bővebben ezt az optóval való leválasztást?
Köszi mindenkinek!!
u.i.: még nem sikerült kipróbálnom a wdt-t talán jövőhéten
Ezért érdemes lehet optóval leválasztani az arduino-ról és külön táppal ellátni, mert különben csúnyán mellé tud mérni. A kondenzátorok a tápon és a hőelemen semmit sem segítenek.
A lényeget Prof elmondta, és azt én is kihangsúlyoznám, hogy semmit nem SZABAD a vezérlő kimenetéről táplálni. Nem csak azért, mert tönkremegy, hanem azért is, mert nem mindig stabil, hiszen a szabvány szerint nem kell fix 5V-nak lennie a H értékhez, és a L érték is lehet néhány mV.
Nem ismerem a K-hőelem lényegét, de azt tudom, hogy többszáz fokot tud mérni, de gondolom ez esetben, ha vízhűtésről van szó, akkor 100C lehet a teteje, 0 az alja, és ezek is csak extrém esetben. Ilyen tartományban tud mérni a DS18B20 is, ami nagyon olcsó, és 2 ér elég neki, mivel onewire kommunikációt használ, és atomstabil, nem kell kalibrálni. Persze ezt mondom úgy, hogy nem ismerem a fizikai hátteret és hogy hogyan tudnád rögzíteni a méréshez.
Nanoval csak bootloader csere után megy a watchdog. Legalábbis 5 db ami nekem van alapból nem tudta. Megán még nem próbáltam. Sikerült bekapcsolni? Jövő héten kell építenem egy vezérlést de wdt nélkül nem hagynám !
-- veszel egy bármilyen USB-s töltőt, rádugsz egy USB kábelt, bedugod a kártyába, ezzel ez a rész meg van oldva,
-- veszel egy megfelelő teljesítményű (2A+) stabilizált bedugós tápot, rádugod a relére, a relé vezérélének földelését (optokapun) közösíted az arduino földelésével.
És ugye arduino táp lábra direktben nem kötünk relét, mert nem vagyunk füstjelzéssel kommunikáló indiánok.
Hőelem meghajtó IC tápját ne már GPIO-ról adjuk! Oké, elbírja, de akkor sem elgáns.
Hőelem datasheet a VCC-re (tápra): Positive Supply. Bypass with a 0.1μFcapacitor to GND. Ez a stabilitásán segíthet.
Sokan nem tudják, hogy a K-elemet kalibrálni kell (elég sűrűn), emiatt simán előfordulhat, hogy jelentősen félremér. Relatív hőmérsékletmérésnél ez irreleváns, de ha pontos abszolút hőmérséklet kell, akkor figyelni kell rá. Bár ha 25-30 fok a hiszterézis,
Előbb vizsgáld me ezeket a fentieket.
Serial.print helyett én inkább rátennék egy LCD-t vagy ledekből tákolnék egy kijelzőt. Elegánsabb, mint a géppel szenvedni állandóan.
Watchdog csak ha a fentiek nem hoznak stabil megoldást. (Nem kezdek bunkert építeni emiatt. :-D )
Ez pont olyan, mint a nem olyan régi Huawei reklám, hogy "egészen olyan képeket csinálhat vele, mint egy dSLR-rel", mellette meg az eredeti dSRL kép... Ezzel csak az a gond, hogy a "majdnem olyan" az soha nem olyan... :-D
Köszi, a kódot alább bemásolom, nem atomreaktor hűtőt vezérel, hanem egy pálinkafőzdében a hűtőtorony kézzelvezérlését hivatott kiváltani szakaszosan. Semmi probléma nem történik, ha nem hűt időben, vagy ha befagy is észreveszem, de most egy ideje a táppal kínlódok, mivel nagyon érzékeny a kapott tápegységre, mikor a relé behúz az 10mA-el megcsapolja a tápot és rögtön félremér a K-elem amitől ki-be húzgál minden másodpercben. Ez csak külsőtápról csinálja, ha gépre kötöm tökéletesen működik, mivel az USB-t meg tudja húzni... jelenleg USB-ről jár, hosszú 7,5m-es kábelen de így meg a feszültségesés miatt ~10C vel alámér... :D A táppal szívok egy ideje, nincs valami "tökéletes" megoldás? Egy 500W-os AXT-t nem akarok járatni miatta... :-D
#include <max6675.h>
float cefrezo; int rele_c = 28; float cefrezo_cel_be; float cefrezo_cel_ki;
float finomito; int rele_f = 29; float finomito_cel_be; float finomito_cel_ki;
int c_vcc = 39; int c_gnd = 41; int c_so = 37; int c_cs = 35; int c_sck = 33; //Max6675 K-hőelemhez szükséges lábkiosztás
int f_vcc = 38; int f_gnd = 40; int f_so = 36; int f_cs = 34; int f_sck = 32; //Max6675 K-hőelemhez szükséges lábkiosztás
Beállítod az időzítőt, hogy mennyi idő múlva járjon le, utána a lehető leggyakrabban nullázod. Ha valami miatt a program elakad, akkor lejár, és reseteli a kontrollert. Nem nagy dolog beállítani. Nem kell semmit bűvészkedni bootloaderrel. A gond ott szokott lenni, ha úgy fagy meg a cucc, hogy nem ugrik a megszakításokra, mert akkor nem tud ugrani a resetre sem. Ha valami fontos dolgot üzemeltetsz (pl. atomreaktor hűtéshez kell :D), akkor jobb egy kiegészítő áramkört beépíteni, ami ugyanezt csinálja, hogy ha nem kap jelet bizonyos időn belül, akkor újraindítja az arduinodat. Minél primitívebb áramkör, annál biztosabban üzemel! Lehet sima passzív R-C tag, vagy egy kifejezetten erre fejlesztett wdt áramkör, de jó egy másik arduino is, könnyen lehet, hogy olcsóbb, mint egy wdt ic. Csak akkor fontos, hogy oda-vissza figyeljék egymást.
No, itten van. Nem rövid alapvetően, de működik (lesz mit fejtegetni).
Használat: bekábelezel bármilyen Arduino lapot a megadott paraméterekkel, a kódot kimásolod, aztán bemásolod az IDE-be, feltöltöd, megnyitod a Serial Monitort (Ctrl+Shitf+M), alul a sebességet átállítod 9600-ra és kész.
A beillesztéshez kell látni a programot, magában elég nehéz, illetve gondokat okozhat.
watchdog valóban két féle van. Az alapelv többé-kevésbé azonos. A lényeg, hogy adott időpillanatban elindul két számláló (idő), az egyik, amikor lejár, indít egy jelzést a másiknak és újraindul. A másik figyeli, hogy jön-e jelzés a türelmi időn belül, ha nem, akkor automatikusan elindít egy protokollt, ami eszközről eszközre változhat (lehet reset, megszakítás stb.). Nyilván az első időintervallum számottevően rövidebb, mint a második. A watchdog alkalmazástól függően néhány tizedmásodperctől akár perces várakozásra is beállítható.
Arduino keretrendszerben a szűk keresztmetszet az, hogy ugyan az Atmega 328 dugig van órákkal, ezek közül az IDE+bootloader páros sajnos csak elég keveset, konkrétan egyet enged egyszerűen elérni, és azt is csak hívás szintjén (megkérdezhetjük, hogy reset vagy túlcsordulás óta mennyi idő telt el). A másik, hogy mivel a jelek szerint végtelen ciklusba kerül a rendszer, tök mindegy, hogy kód szintjén mit oldasz meg, mert a watchdog kódrészhez nem fog elérni a szoftver.
Itt jön képbe a külső watchdog, ami lehet egy pár alkatrészből álló egyszerű áramkör, ami úgyszintén számol és nulláz, ha jelet kap. Ha nem jön jel az adott ideig, akkor például elindít egy hard reset-et.
A műszaki megvalósításban nem tudok segíteni, Arduino keretrendszerben nem foglalkoztam a dologgal.
Egy kisebb problémába ütköztem. Csináltam egy vezérlést ami két, egymástól független hűtőtorony vízcseréjét működteti.
Egy Mega panel MAX6675-ös chippel ellátott K-típusú hőelem értékeit olvassa be 1 másodpercenként, és egy ha függvénnyel a programba beírt hőmérséklet fölé emelkedik, akkor HIGH-ra húzza a kimenetét, amin egy optorelé kapcsol, és vezetésben marad, mindaddig míg nem hűtötte le a megadott érték alá.
A programmal nincs is magában gond, jól végzi a dolgát, eltekintve attól, hogy szabálytalan időközönként valahol megakad, végtelen ciklusba fut, ezt az Rx,Tx ledekről lehet észrevenni, mivel nem olvas, illetve a hűtő is túlmelegszik...
Táp, ki, be megoldja a gondot, órákra, néha napokra.
Itt jött az ötlet, hogy kell egy Watchdog...
Utánaolvasva a témának, nem is biztos, hogy olyan egyszerű a dolog... gondoltam beillesztek pár sort a programba, és működik... ha nem számol akkor reset.
Olvastam több fórumon, hogy valamit át kell írni a bootloaderben, mert kizárhatom magam a chipből stb... vannak csak szoftveres és hardveres őrkutyák is, mi a különbség? Mitől függ, hogy melyiket kell használni?
Valaki tud benne segíteni, hogy tisztába tegyem ezeket a dolgokat, illetve hogyan is illesszem be a meglévő programba?