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.