kair.us/ projects/
temp_controller/ temp_controller_fw2
Kuivanapitolämmittimen ohjelmistoversio 2.0
Kuivanapitolämmittimen uusi 2.x ohjelmisto tuo mukanaan paljon
uudistuksia. Lisääntyneiden ominaisuuksien myötä myös asetusten
teko on hieman monimutkaisempaa ja ohjelmassa on todennäköisesti
alkuun myös bugeja. Jos et nimenomaisesti tarvitse jotakin 2.x
version ominaisuutta, suosittelen toistaiseksi käyttämään 1.x
sarjan ohjelmistoa.
Jos olet päätynyt tälle sivulle linkin tai hakukoneen avulla,
tutustu ensin kuivanapitolämmittimen
pääsivuun.
Ohjelmistossa 2.0 on seuraavat ominaisuudet:
- Ohjaa lämmitintä releen avulla
- Näyttää sekä sisä- että ulkolämpötilan ja ohjausreleen tilan
- Pitää sisätilan halutun verran ulkolämpötilaa lämpimämpänä,
lämpötilaero aseteltavissa
- Säädettävä hystereesi
- Säädettävät sisälämpötilan ylä- ja alarajat jota kylmemmäksi
sisätilaa ei päästetä ja jota kuumemmaksi sitä ei lämmitetä
- Säädettävä ulkolämpötilan alaraja jota kylmemmässä lämmitys
sammutetaan kokonaan (vaihtoehtoinen em. sisälämpötilan
alaraja-asetukselle)
- Tuntilaskurit kokonaisajalle ja ajalle jonka lämmitin päällä,
voi käyttää kulutuksen seurantaan
- Releen kytkentäkertojen lukumäärän näyttö
- Termistorien resistanssi / lämpötila vastaavuus valittavissa
joko kiinteän
taulukon mukaan 10k, beta 3950 taikka aseteltavien r25 ja
beta arvojen mukaan laskemalla, sisä- ja ulkoanturille erikseen
- Tuki Bosch
BME280 lämpötila-, ilmanpaine-, ja ilmankosteusanturille.
- Lämmittimen ohjaus sisäilman kosteuden perusteella.
Suhteellisen kosteuden yläraja ja hystereesi aseteltavissa.
- Minimi / maksimi arvojen muisti sisälämpätilalle,
ulkolämpötilalle ja ilmankosteudelle
- Ilmankosteuden näyttö jos Bosch BME280 anturi käytössä
- Käyttöliittymän kieli valittavissa suomi tai englanti
Lähdekoodi ja käännetty binääri
Ohjelma on tehty CCS PIC-C
kääntäjällä. Zip-paketissa on lähdekoodit ja käännetyt
binäärit sekä yhteiskatodi- että yhteisanodinäytöille.
Kosteusanturin lähdekooditiedostoa bme280.c ei paketissa ole, mutta
se tulee kääntäjän mukana. Kyseinen tiedosto täytyy kuitenkin
kopioida projektihakemistoon. Siihen täytyy lisätä yksi rivi. Ennen
static unsigned int32 _bme280_compensate_H_int32(signed int32 adc_H)
-funktiota täytyy lisätä rivi jossa lukee #separate Tämä tarvitaan
koska muuten kääntäjä yrittää kääntää kyseisen funktion
inline-muodossa funktioon josta sitä kutsutaan. Lopputuloksena on
muuten funktio joka ei sovi PIC16 -arkkitehtuurin yhdelle
muistisivulle.
temp_controller_fw_v20.zip
31.3.2018 Lähdekoodi ja CCS 5.077 versiolla käännetyt binäärit
Ohjelman rakenne
Ohjelman rakennetta on hieman muokattu 1.x versioon nähden.
Toimintoja on hajautettu eri lähdetiedostoihin.
ntc_temperature.c
Tässä tiedostossa on termistorien lukemiseen tarittavat funktiot.
read_ntc_sensors() funktio lukee termistorin ja kiinteäarvoisen
vastuksen muodostaman jännitejaon jännitettä PIC:n sisäisellä
AD-muuntimella. Lukemisessa käytetään ylinäytteistystä. Se
tarkoittaa että arvoa luetaan monta kertaa ja tulokset summataan
yhteen. Tällä tavoin lukutarkkuutta saadaan parannettua ja myös
häiriöiden määrää vähennettyä. Oletuksena ylinäytteistetään 512
kertaa. Koska PIC16F1789:n AD-muunnin on 12-bittinen, on lopullinen
mittaus ylinäytteistyksen kanssa 21-bittinen. Funktiota on
kutsuttava säännöllisesti, esimerkiksi keskeytyksestä. Kun molemmat
termistorit on luettu, sums_ready muuttuja kertoo että luenta on
valmis.
Kun termistorit on luettu, täytyy AD-muunnosten tulos vielä muuttaa
lämpötilaksi. Tähän on kaksi vaihtoehtoista funktiota.lookup_32bit()
käyttää kiinteää taulukkoa 10 kohm, beta 3950 termistoreille.
calculate_32bit() funktiolle on annettava termistorin r25 ja beta
parametrit, ja se laskee lämpötilan näiden perusteella.
Ensinmainittu funktio toimii tarkemmin laajalla lämpötila-alueellea.
Jälkimmäinen taas antaa mahdollisuuden käyttää erilaisia
termistoreja, ja toimii yleensä riittävän tarkasti käytännössä
tarvittavalla lämpötila-alueella. calculate_32bit() funktio käyttää
liukulukulaskentaa, mutta nopeus ja tilankäyttö eivät ole tässä
sovelluksessa ongelma.
7seg_display.c
Sisältää funktiot joilla numeroita tai merkkijonoja voidaan muuttaa
7-segmenttinäytölle sopivaan muotoon. show_7seg_number() funktiolla
saadaan näytettyä numeroita. Tätä käytetään ohjelmassa mm.
lämpötilojen esittämiseen. show_7seg_string() funktiolla voidaan
näyttää merkkijonoja. Tätä käyetään mm. valikkojen tekstien
esittämiseen. Lisäksi on vielä funktio show_7seg_scroll() jolla
voidaan esittää pitempiä tekstejä jotka rullaavaat näytöllä. Tällä
hetkellä tätä funktiota ei käytetä.
temp_controler_v20.c
Ohjelman päätiedosto. Ohjelmassa käyetään kontrollerin sisäistä
ajastinta, joka antaa keskeytyksen 1 millisekunnin välein.
Keskeytysrutiinissa päivitetään 7-segment näytön skannaus, luetaan
enkooderi, päivitetään valikon tilanne, lasketaan ajan kuluminen
tuntilaskureihin ja lopuksi luetaan termistoreja.
menu_machine() funktio huolehtii valikoissa liikkumisesta. Se
hyödyntää enkooderilta tulevaa syötettä (muuttuja event), ja
päivittää sijaintia valikkorakenteessa (muuttuja state) sen mukaan.
Koska funktio suorittaa vain tilasiirtymät, sen suoritus on hyvin
nopea ja sitä voidaan kutsua joka kerta kun enkooderia on luettu.
Tämä mahdollistaa ettei enkooderilta tulleita viestejä missata, ja
käyttökokemus on sujuva.
display_machine() funktio päivittää näytöllä esitettävät numerot ja
tekstit kulloisenkin tilan mukaan. Funktio on hidas suorittaa, ja
sitä kutsutaan pääohjelman loputtomasta loopista.
adjust_with_limits() funktioita hyödynnetään parametrien
säätämisessä ja valikkorakenteessa liikkumisessa. Niillä voi nimensä
mukaisesti säätää muuttujaa ala- ja ylärajan välillä enkooderin
syöteen mukaisesti.
controlHeater() funktiossa on koko kuivanapitolämmityksen
toimintalogiikka. Se vertailee sisä- ja ulkolämpötilan eroa, ylä- ja
alarajat huomioiden, ja päättelee pitäisikö lämmityksen olla päällä.
Myös ilmankosteuden mukaan tapahtuva säätö tapahtuu tässä.
handle_pending_tasks() funktiota kutsutaan pääohjelman loopista. Se
hoitaa tarvittaessa EEPROM muistiin tallennukset, jotka ovat liian
hitaita suoritettavaksi esim. keskeytyksestä.
check_minmax() funktio tarkkailee onko lämpötilat tai ilmankosteus
pienempiä tai suurempia kuin aiemmat 'ennätyslukemat'
main() Pääfunktiossa aluestetaan ensin kontrollerin toiminta mm.
halutut ajastinkeskeytykset ja luetaan parametrit EEPROM muistista.
Kun alustus on valmis ajetaan loputtomasti silmukkaa jossa
päivitetään lämpötilat ja kosteus kun uudet arvot ovat saatavilla,
kutsutaan controlHeater(), display_machine(), check_minmax() ja
display_machine() funktioita vuoronperään.
Bosch BME280 lämpötila-, ilmanpaine-, ja ilmankosteusanturin
kytkentä
Bosch BME280 anturi tukee kahta väylävaihtoehtoa, SPI ja I²C.
Kuivanapitolämmittimessä käytetään I²C väylää. Se on saatavilla
OPT merkitystä 4-piikkisestä liittimestä X6. Anturia ei voi
kuitenkaan kytkeä aivan suoraan, sillä kuivanapitolämmittimessä
käytetään 5 V käyttöjännitettä ja BME280 anturille suurin sallittu
on 3,6 V. Helpoimmalla pääsee kun hankkii piirikortin jossa on
itse anturin lisäksi jänniteregulaattori ja I²C väylän
tasonmuunninkytkentä. BME280 on LGA-tyyppisessä kotolossa jota on
hankala juottaa käsin, joten valmiin piirikortin hankinta on
tässäkin mielessä järkevä valinta. Alla esimerkkikuva eBaystä
hankitusta anturikortista jossa on regulaattori ja
tasonmuunnin (oikean puoleisen kuvan kaksi mikropiiriä).
Useimmiten korteista joissa on enemmän kuin 4 pinniä puuttuu nuo
tarvittavat jännitemuunnospiirit. Kannattaa myös ostaessa lukea
kuvaus tarkasti ja varmistaa että kortilla todellakin on BME280
eikä BMP280 anturi. Jälkimmäisessä ei ole kosteusmittausta,
ainaostaan lämpötila ja ilmanpaine.
Liittimen X6 pinnijärjestys on seuraava: 1. SDA 2. GND 3. SCL ja
4. +5V. Nämä pitäisi kytkeä vastaaviin pinneihin anturikortilla,
tarkista kytkentä anturikortin ohjeista. Kuivanapitolämmittimen
firmwaressa anturin I²C osoitteeksi on asetettu 0x76. Se tuntuisi
olevan ainakin useimmissa anturikorteissa vakiona, joissakin
korteissa osoite saattaa olla valittavissa myös toiseen
vaihtoehtoon, 0x77. Tämä mahdollistaisi kahden anturin kytkemisen
yhtä aikaa, mutta ainakaan toistaiseksi sitä ei ole firmwaressa
tuettuna.
Kun laitteeseen kytketään sähköt, ohjelma tutkii onko BME280
anturi kytketty. Jos on, niin sisälämpötila otetaan BME anturilta
eikä termistoria käytetä. Tällöin riittää siis pelkkä
ulkolämpötilan termistori. Lisäksi laitteen valikkorakenteeseen
ilmaantuu alempana esitetyssä tilakaaviossa vihreällä taustalla
olevat valikot. Voit asettaa kosteudelle ylärajan. Jos
sisäilmankosteus nousee tätä korkeammaksi, niin lämmitys kytkeytyy
päälle. Kosteuden mukaan tapahtuvan lämmityksen kytkennän
hystereesin voi säätää erikseen. Lämmitin kytketään päälle kun
kumpi tahansa ohjausehdoista täyttyy (sisä- ja ulkolämpötilan
erotus pienempi kuin asetus tai sisäilman kosteusprosentti
suurempi kuin asetus).
Ohjelmisto toimii sisäisesti prosenttiyksikön kymmenesosan
tarkkuudella, mutta näytöllä kosteus esitetään vain yhden
prosenttiyksikön tarkkuudella. BME280 anturin suhteellisen
kosteuden tarkkuus on +/- 3% lämpötilassa +25ºC. Tarkempia tietoja
anturin tarkkuudesta saa anturin datalehdestä.
Termistorien r25 ja beta arvojen asetukset ja termistorien
kalibrointi
Olen huomannut että osa eBay:ssä myytävistä termistoreista ei
noudata r25 = 10 kohm, beta = 3950 taulukon arvoja. Erityisesti
jotkut kahden metrin kaapelilla varustetut termistorit tuntuvat
olevan selkeästi erilaisia, tuntuisi että niissä on käytetty
jotain muuta kuin nimellisesti 3950 betan termistoria. Yhden
metrin kaapelilla olevat ovat kaikki olleet varsin hyvin
kohdallaan.
Firmwaresta 2.0 lähtien sekä sisä- että ulkolämpötilan
termistorille voi erikseen valita käytetäänkö lämpötilakonversioon
taulukoituja arvoja 10k, 3950 termistorille vaiko valikon kautta
syötettyjä r25 ja beta arvoja. Kuinka sitten määrittää r25 ja beta
arvot jos lämpötila tuntuu näyttävän väärin? Määrittämiseen
tarvitsee vain mitata termistorin resistanssi kahdessa eri
tunnetussa lämpötilassa. Tarvitset siis yleismittarin ja mieluusti
lisäksi riittävän tarkan lämpömittarin referenssiksi. Kyseiset
kaksi lämpötilaa olisi hyvä olla riittävän kaukana toisistaan, ja
lisäksi sellaisella lämpötila-alueella joita loppusovelluksessa
käytetään. Toinen näistä voi hyvin olla jäävesi; se kun on
hyvinkin lähelle 0ºC. Toinen lämpötila voi olla vaikkapa
huoneenlämpö. Kannattaa mitata sekä sisä- että ulkoanturin
resistanssit samalla kertaa, anturit toisiinsa kiinni teipattuina.
Tällöin niistä saadaan keskenään varsin hyvin yhtä pitävät. Nollan
lähellä tarkkuuden on syytä olla melko hyvin kohdallaan jos
lämmittimellä on tarkoitus ehkäistä putkien jäätyminen. Tässäkin
mielessä jäävesi on varsin sopiva valinta toiseksi
kalibrointipisteeksi. Kiehuvan veden 100ºC on turhan kaukana
sovellusalueelta, ja siellä NTC termistorien resistanssi on jo
varsin pieni.
Kun olet saanut mitattua resistanssit kahdessa eri lämpötilassa,
syötä ne tähän
kaavakkeeseen T1, T2, R1 ja R2 kenttiin. Calculate nappia
painamalla saat R25 ja beta arvot, jotka voit syöttää
kuivanapitolämmittimeen valikon avulla. Firmwaressa käytetyt
lämpötilan laskentakaavat on myös tuolta samaiselta nettisivulta
otettu.
Käyttöliittymä
Ohjelmistoversio 2.0 käyttöliittymän valikkorakenne on esitetty
allaolevassa tilakaaviossa. Tilojen nimet on alla esitetty
englanninkielisen valikkokielen mukaan. Suomenkieliset valikot ovat
jopa vieläkin epäselvemmät. Valikossa liikutaan pyörittelemällä ja
painamalla nuppia. Vihreällä taustalla korostetut valikot ovat
käytettävissä ainoastaan jos Bosch BME280 anturi on kytketty
ohjaimeen.
Perustila on siis tuo oikealla ylhäällä jossa näytössä näkyy sisä-
ja ulkolämpötilat. Jos ilmankosteusanturi on käytössä, voi
'perustilaksi' valita myös 'inrh' tai 'togg' tilat. Ensin mainitussa
näytetään sisälämpötila ja ilmankosteus, jälkimmäisessä näkyy
ylemmässä näytössä kokoajan sisälämpötila, alemmassa vuorottelee
ulkolämpötila ja ilmakosteus.
Ulkolämpötilanäytön oikeanpuoleisin desimaalipiste ilmaisee
onko lämmitys päällä. Lämmityksen ohjaus toimii normaalisti
riippumatta siitä ollaanko lämpötilanäkymässä vaiko jossain valikon
syövereissä.
kair.us/
projects/ temp_controller/ temp_controller_fw2
page created 30.3.2018
last updated 4.4.2018 webmaster@kair.us