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:

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.

BME280 sensor board with
      voltage regulator and I2C level conversion

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.

Kuivanapitolämmitin FW v2.0 tilakaavio

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