Prof Creative Commons License 2020.03.26 0 0 3635

Szia,

 

 

Ami az elvet illeti. Egy kis tehetetlenségű, nagy pontosságú pid szabályozó (pl. kávégépekben, pákában, stb.) van ilyen, adott esetben másodpercenként többször kapcsol. Azt, hogy ne legyen szükség sűrű kapcsolgatásra, azt a teljes rendszer hőtehetetlenségének növelésével tudod elérni (feltételezve, hogy nem akarsz engedni a +/- 1 fokos maximális tűrésből). Nagyobb tömeg = jobb hőtartás (pontosabban több tárolt hő) = ritkább kapcsolgatás. Már feltéve, hogy egyéb környezeti feltételek és/vagy a szigetelés ezt lehetővé teszik. Segíthet a közeg direkt áramoltatása is, mert sok esetben a gravitációs áramlás nem ad megfelelő homogenitást a közegnek, még a viszonylag jó vezető víz esetében sem.

 

A nagy kérdés, hogy mennyire akarsz a lehetséges legjobb megoldásig elmenni? Mert ahhoz nem biztos, hogy önmagában a kód nyegletése elegendő lesz.

 

Nézzük a kóddal kapcsolatos nehézségeket.

 

Változók

A millis() visszatérő értéke unsigned long. A kód elején három változót deklarálsz float-ként, amiből az idopont tuti nem jó, helyette:

unsigned long idopont = 0;

Az időben én nem kínlódnék a másodpercekkel, minden olvasásnál/írásnál az ezerrel való osztás sok-sok órajelciklus, feleslegesen.

A felirat kiírása így kissé faramuci, sem jó, sem rossz, van előnye, van hátránya, én nem bíbelődnék vele így (valószínű: állapotgép-státus alapján lenne, menüt terveztem így i2c kijelzőre, kiválóan működött).

Általában: a változók elnevezései abszolúte nem beszédesek. Ezek elengedhetetlenek a jól olvasható (és így jól karbantartható) programhoz.

 

Logika

Itt is bejön a változó-elnevezés, mivel az idopont nevű változóra azt írod, hogy "előző vezérlés időpontja", pedig nem erről van szó, hanem arról, hogy mikor volt utoljára ellenőrzés.

Az if vizsgálatnál matekozol (ciklusonként egyszer, feleslegesen).

A fűtés szükségességét (teljesen jól) kiszervezted egy belső függvénybe, de az speciel nem azt csinálja, ahogy hívják, hanem ellenőrzi, hogy kell-e fűteni (konkrétan a kapcsolást a loop()-ban lévő két állapotú if kapcsolja).

A futes() függvényben van egy érdekesség, ha a táptalaj hőmérséklete 28 fok felett van és a külső hőmérséklet 26 fok alatt, akkor bekapcsolja a fűtést. Viszont van olyan állapot, amikor semmit sem csinál:

 

A bal oldalon a külső, a felső sorban a belső hőmérséklet. Ha a belső hőmérséklet 28 fok felett van ÉS a külső hőmérséklet kisebb vagy egyenlő, mint 28 ÉS nagyobb vagy egyenlő, mint 26, akkor az állapot nem változik. Nyilván valószerűtlen, hogy ez a helyzet előforduljon, mert a rendszer 29 fokos külső hőmérsékletnél és a felett mindenképp kikapcsol, de ettől ez még ettől eltérő esetben egy csúnya megfutás eredménye lehet (vagyis a rendszer fűt, mint a veszedelem, de nincs rá szükség, viszont nem alakul ki olyan helyzet a feltételek ellenőrzési láncolatában, ami indukálná a kikapcsolást).

 

A futes() függvényben ez a boolean igaz = true; azért erős. (Ismét: változó-elnevezés.) Az egész kódra igaz, hogy "meg kell fejteni", ahelyett, hogy simán végigolvasná az ember.

 

Egyebek

Én kitettem volna az adatok kiíratását egy külső függvénybe (lcd.print sorozat).

Ha nem muszáj, elengedném a Serial.print-eket, ha feltétlen kell debug-információ, azt pár számmal a kijelzőre ki tudod írni.

 

Egyelőre ennyi.

 

Előzmény: granov (3633)