Minimalista hőmérő, fűtés és hűtés vezérlés Atmel ATTINY13 mikrokontrollerrel (5 diódás érzékelővel)

Az akvárium fűtésének vezérlése kényes pont...(ok:). Adva volt a már korábban elkészített 12 voltos (max. 24V - a lényeg, hogy ne rázzon stb.) fűtő, amihez egy megbízható, olcsó vezérlést próbáltam kreálni.. lássuk mi jött össze:

tulajdonságok, elvárások

  • kezelőgombok mellőzése: ne lehessen véletlen elállítani... tapasztalat, ha egy adott akváriumhoz a hőfokot egyszer belövi az ember, akkor többet nem kell hozzányúlni
  • kijelző egyszerűsítése, azaz 1 LED-re redukálása, ami beállítás után - ügyesebbeknek előbb - el is hagyható (nincs fényszennyezés és energiatakarékos is:): az aktuális hőfokot kivillogja ill. ha hiba keletkezne azt is jelzi
  • egyszerű, olcsó, diódás hőérzékelő: akváriumi hőmérséklet tartományon belül pontos, meghibásodása könnyen észlelhető
  • hűtést is lehet vele kapcsolni: miért is ne....
  • fűtés teljesítményének szabályozhatósága: így kisebb akváriumhoz is használhatunk nagyobb teljesítményű fűtőt anélkül, hogy a halak egészségét veszélyeztetnénk a gyors felfűtéssel

hozzávalók

Hozzávalók:

  1. érzékelő: 5db dióda (pl. 1N4148, lehet más hasonló is), üveg szemcseppentő (patikában beszerezhető)
  2. ész: Atmel ATTINY13 mikrokontroller (lehet okosabb típus is) felprogramozva, 8 lábú IC foglalattal
  3. hőfok- és hibajelző: 1db LED és 1db 10 KOhm-os ellenállás (elhagyható ha van külön hőmérőnk és bízunk a kütyüben)
  4. 12 Voltos üzemeléshez: 78L05 (5 Voltos stab. IC)
  5. 1db 100 nF kondenzátor (zavarszűrés) és 1db 10 KOhm-os ellenállás
  6. egy kevés szilikon ragasztó
  7. valamilyen doboz és vezeték (ha az érzékelő nagyobb távolságra lesz a kütyütől, akkor használj árnyékolt kábelt)

működés röviden

A hőérzékelő jelét (10 mV/Celsius) feldolgozza a kütyü ADC (10 bites) bemenete, melyet 2-es osztás és egy konstansból (ezzel lehet a hőérzékelőt pontosra beállítani; konstans neve Const Korrekcio) történő kivonás (dióda negatív karakterisztikáját fordítja meg) után Celsiusban kapunk meg (Hőfok). Ezt hasonlítja össze az általunk megadott Hofokkapcs és Huteskapcs értékekkel:
- ha kisebb mint a Hofokkapcs akkor bekapcsolja a fűtés kimenetet, ha nagyobb akkor lekapcsolja azt;
- ha nagyobb vagy egyenlő mint a Huteskapcs akkor bekapcsolja a hűtés kimenetet, ha kisebb akkor lekapcsolja azt;
- ha az érzékelő leszakadna, vagy meghibásodás miatt az akváriumi/tavi élettel összeegyeztethetetlen értéket mérne (3 Celsius fok alatt és 35 Celsius felett, szükség esetén ezek értéke is módosítható), akkor is lekapcsolja a fűtést/hűtést és folytonos hibajelzést ad a LED-en. Ellenkező esetben másodpercenként felvillanva kijelzi az aktuális hőmérsékletet, pl. 25 Celsiust eképpen: 2 villogás (ezek jelzik a tízes jegyeket) - majd 3 másodperc szünet - 5 villogás (ezek jelzik az egyeseket) - majd tíz másodperc szünet....... és kezdődik elölről a menet:)

A fűtőtest teljesítményét lehet korlátozni a Futoteljesitmeny (nem futóteljesítmény:) érték megadásával:
0-255-ig: 0 a 0%-nak (gyakorlatilag nincs fűtés), 255 a 100%-nak (teljes fűtőteljesítmény) felel meg. Ha a fűtés bekapcsol akkor az fokozatosan (kb. 2másodperc alatt) éri el 0-tól a beállított értékig a teljesítményét - ha lekapcsol akkor fordítva.
256: Teljes fűtőteljesítmény, de a be és kikapcsolás fokozatmentes (ez akkor lehet előny ha más típusú pl. bolti fűtőt vezérlünk és ezért relés a kapcsoló kimenetünk)

Az alább látható (program forrásából kiemelt) és fentebb említett értékeket szabad változtatni:

változtatható értékek

kapcsolási rajzok

A kütyü avagy minimalista akváriumi hőmérő, fűtés- és hűtéskapcsoló:

minimalista akváriumi hőmérő, fűtés- és hűtéskapcsoló

Fűtés (a már korábban megépített) és hűtés (a még meg nem épített, egyelőre nincs rá szükség..):

saját készítésű fűtőtest akváriumi hűtés PC ventillátorral

Relés kapcsolóelem rajza, más típusú fűtő- és hűtőtesthez történő illesztés estén (NE FELEDD!! Ebben az esetben a fűtőteljesítmény értéke 256 legyen):

relés kapcsolóelem rajza más típusú fűtőtest/hűtés illesztéséhez

elkészítés

Érzékelő:
Forraszd össze a diódákat a vezetékkel, majd helyezd a sapkájától megfosztott cseppentőbe majdnem ütközésig. Kend be szilikonragasztóval a vezeték felőli részt, majd tapadj 'arcoddal' a cseppentő másik végére és szívd meg úgy, hogy a ragasztó egyre beljebb csússzon - ismételd míg a megfelelő mennyiséget be nem szívtad... Ha megvagy, akkor zárd le ragasztóval a cseppentő másik végét és várj az előírt száradásig.
cseppentő szárad az érzékelő

Kütyü:
Forraszd össze az alkatrészeket (ha lehet a fenti rajz szerint:). Építsd félig a dobozába - nálam ez egy 'telefonelosztó, beltéri, fali, külső' (no ebből nehéz lenne kitalálni, ezért mellékelek egy képet róla).
a doboz: telefonelosztó, beltéri, fali, külső félig beépítve

Élesztés, kalibrálás:
Mérd meg a szűkebben vett környezeted (szobád vagy ahol építed a kütyüt:) hőmérsékletét és jegyezd is meg vagy fel (továbbiakban HŐFOK; tételezzük fel, hogy pl. 22 Celsius fokot mértél). Égesd be a programot úgy az ATTINY13-ba (továbbiakban TINY), hogy a fűtés kapcsolási értéket magasabbra állítsd 3 fokkal mint a HŐFOK (Hofokkapcs = 25). Helyezd be a TINYt majd kapcsold be a kütyüt és várj... Ha minden oké, akkor 10 másodperc után villog vagy folyamatosan világít a LED - ha nem akkor keresd meg a hibát ami bárhol lehet (könnyebb leírni mint megtalálni).
Ha folyamatosan világít az azt jelenti hogy vagy 4 Celsius alattit mér vagy 35 Celsius felettit. Állítsd a Const Korrekcio értékét előbb le, majd fel irányba (5 fokonként 5 lépésben, nyilván újrafordítás és TINY égetés minden változtatásnál) amíg a villogás elő nem jön - ha így sem jársz sikerrel, akkor az érzékelő körben lehet valami hiba vagy a TINY rossz.
Ha villog, várj 5-10 hőfokkijelzést majd olvasd le a legutóbbit és vond ki a HŐFOK értékből - ha nulla az eredmény, akkor nyert ügyed van, azaz nem kell kalibrálni - ha nem nulla, akkor add hozzá a Const Korrekcio értékhez (újrafordítás, TINY égetés) és kész is a kalibrálás.
Példák (HOFOK 22 Celsius, Const Korrekcio = 297):
- villogott érték pl. 19, akkor 22-19 = 3, tehát a Const Korrekcio = 300
- villogott érték pl. 27, akkor 22-27 = -5, tehát a Const Korrekcio = 292
remélem érthető ....

Tesztelés/véglegesítés: Mivel a Hofokkapcs értékét a HOFOK felé állítottuk 3 fokkal, így egyszerűen kezünkbe véve az érzékelőt az felmelegszik és előbb lekapcsolja a fűtés kapcsolójelet (példa szerint 25 foknál, TINY 5-ös láb), majd bekapcsolja a hűtés kapcsolójelet (31 foknál, TINY 3-as láb). Ha kellően meleg vagy, akkor 36 fok felett folytonos hibajelzést ad.
Véglegesítéshez döntsük el, hogy mekkora teljesítménnyel akarjuk járatni a fűtőtestet (Futoteljesitmeny), továbbá a fűtés lekapcsolási (Hofokkapcs) és a hűtés felkapcsolási (Huteskapcs) értékét. Írjuk át a programban, fordítsuk le, majd égessük be a TINY-be és jó nagy betűkkel írjuk fel a kütyü dobozára a korrekciós (Const Korrekcio) értékkel együtt. Pár napig teszteljük (pl. egy vödör vízben) a rendszert, majd építsük be végleges helyére..... remélhetőleg többet nem kell hozzányúlnunk.

program

A program Basic nyelven íródott - sok magyarázó szöveggel - (könnyebb érthetőség, módosíthatóság miatt) melyet a Bascom-avr (ingyenesen letölthető/használható demó) programmal fordíthatunk le és egy egyszerű házilag is megépíthető programozóval égethetünk be a kontrollerbe (részletesebb infó a http://avr.tavir.hu oldalon vagy gúgliban).

A program forráskódja: minimalista_akvarium_homero_futes_hutes_kapcsolo.bas letölthető ill. megtekinthető:

'minimalista akváriumi fűtés(PWM)/hűtés kapcsoló és hőmérő 5 diódás érzékelővel $regfile = "ATtiny13.dat" $crystal = 9600000 '9.6 MHz belső oszci. 8-as osztás nélkül. $prog &HFF , &H3A , &HFF , &H00 'generated. Take care that the chip supports all fuse bytes. 'konfigok Config Timer0 = Pwm , Compare A Pwm = Clear Down , Prescale = 1 'időzítő PWM beállítása. Tccr0a = &B10100001 ' PWM A beállítása Set Ddrb.0 Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC beállítása... Config Portb.2 = Input 'adc1 - hőérzékelő IC 7-es láb Config Portb.0 = Output 'PWM kapcsolt kimenet (ez kapcsolja a fűtőt) IC 5-ös láb Config Portb.3 = Output 'ledes jelző kimenet IC 2-es láb Config Portb.4 = Output 'kapcsolt kimenet (ez kapcsolja a hűtőegységet) IC 3-as láb 'változók Dim Hofok As Word 'számított hőfok celsius Dim Hofokkapcs As Byte 'ennél a hőfoknál kapcsol ki a fűtés Dim Fut As Bit 'fűtést jelző bit Dim Huteskapcs As Byte 'ennél a hőfoknál kapcsol be a hűtés Dim Futoteljesitmeny As Word 'PWM értéke, azaz a fűtő teljesítménye Dim N As Byte 'villogás szám Dim X As Byte 'segédváltozó 'kezdőértékek megadása Enable Interrupts ' megszakítások engedélyezése Enable Timer0 ' Timer0 engedélyezése Start Adc ' ADC índítása Start Timer0 ' Timer0 indítása Ocr0a = 0 'PWM érték beállítása azaz nincs fűtés Futoteljesitmeny = 255 'fűtő teljesítménye (0-255), fel és lekapcsolás átmenettel '0 nem fűt, 128 fél teljesítménnyel fűt, '255 teljes erővel fűt , 'ha 256 akkor teljes erővel fűt, fel és lekapcsolás átmenet nélküli Const Korrekcio = 297 '5 diódás érzékelő korrekciós értéke Hofokkapcs = 22 'ennél a hőfoknál kapcsol ki a fűtés Huteskapcs = 31 'ennél a hőfoknál kapcsol be a hűtés Reset Portb.4 'csak a biztonság kedvéért Fut = 0 'csak a biztonság kedvéért ' főciklus Do Wait 10 'hőmérséklet lekérdezése Hofok = Getadc(1) 'analóg feszültség lekérdezés Shift Hofok , Right 'átszámítás celsiusra: 2-vel osztás If Hofok <= Korrekcio Then Hofok = Korrekcio - Hofok 'szakadás ellenőrzés és konstansból kivonás 'fűtés/hűtés esedékesség eldöntése 'ill. ha szakadt a hőérzékelő akkor is lekapcsolja a fűtést/hűtést If Fut = 0 And Hofok < Hofokkapcs And Hofok >= 1 Then If Futoteljesitmeny > 255 Then Ocr0a = 255 'fűtő bekapcsol Else For X = 0 To Futoteljesitmeny Ocr0a = X 'fűtő fokozatosan bekapcsol Waitms 20 Next End If Fut = 1 End If If Fut = 1 And Hofok >= Hofokkapcs Then If Futoteljesitmeny > 255 Then Ocr0a = 0 'fűtő kikapcsol Else For X = Futoteljesitmeny To 0 Step -1 Ocr0a = X 'fűtő fokozatosan kikapcsol Waitms 20 Next End If Fut = 0 End If If Hofok >= Huteskapcs And Hofok < 50 Then Set Portb.4 Else Reset Portb.4 'életjel küldése a működésről és a mért hőfok értékének kijelzése is egyben N = 0 If Hofok > 29 And Hofok < 36 Then N = 3 Gosub Villog N = Hofok - 30 End If If Hofok > 19 And Hofok < 30 Then N = 2 Gosub Villog N = Hofok - 20 End If If Hofok > 9 And Hofok < 20 Then N = 1 Gosub Villog N = Hofok - 10 End If If Hofok > 3 And Hofok < 10 Then N = Hofok Gosub Villog Loop End Villog: If N = 0 Then 'ha a hőfokérték akváriumi értékhatáron (4-35 Celsius) kívüli Set Portb.3 'akkor (folytonos) hibajelzés Return Else Reset Portb.3 End If Wait 2 Do Set Portb.3 Waitms 500 Reset Portb.3 Waitms 500 Decr N Loop Until N = 0 Return