Ulkolämpömittari perinteiseen seinäkelloon

Tämä artikkeli on rakentelukertomus seinäkellon muuntamisesta näyttämään ulkolämpötilaa. Mikrokontrollereina Arduino Pro mini 328p ja TI Lauchpad MSP430g2553.

Kuva10.jpg

Perheessämme on sitkuteltu vuosia kummallisessa tilanteessa. Ulkolämpötilan arvioiminen ei ole perustunut helpoimpaan mahdolliseen tapaan. Sen sijaan että joku olisi kipaissut aamuisin tarkistamaan lämpömittarin lukeman, on perheessämme nuuhkittu ilmaa ovenraosta, arvailtu ilmanalaa ikkunan läpi ja lopulta katsottu säätiedotus ilmatieenlaitoksen sivulta.

Saamattomuus istuu joskus lujassa. Hommasin perinteisen lämpömittarin mutta sen asentaminen kivitalon ikkunalle osoittautui hankalaksi. Aika ja elämä ovat vähentäneet esteetikkoa minussa, mutta sille funktionaalisuuden asteelle en ole vielä päässyt, että jaksaisin katsella masentavia digitaalisia lämpömittareita tai sääasemia olohuoneessamme. Toinen estetiikan kaipuun viimeisistä linnakkeista on ollut haluttomuus tyytyä vähempään kuin täydelliseen seinäkellon hankinnassa, ja perheemme on ollut myös ilman julkista ajannäyttäjää.

Päätin iskeä kaksipäistä hirviötä suoraan ytimeen ja rakentaa seinäkellon joka näyttää aikaa, ulkolämpötilaa ja kosteutta. Siirryin tuumasta toimeen hankkimalla seinäkellon, jossa on analogiset viisarinäytöt sisälämpötilalle ja kosteudelle. Suunnitelmaksi tuli että ulkona oleva anturirasia mittaa lämpötilan ja lähettää nämä radioteitse seinäkellolle, joka puolestaan kiertää viisarit oikeaan asentoon.

Kuva12.jpg

Määrittelin seuraavat vaatimukset laitteen toiminnalle:

-Päivittää lämpötilan noin vartin välein.

  • Laitteet toimivat paristoilla/akulla ja vievät mahdollisimman vähän virtaa ettei niitä tarvitse ladata jatkuvasti.

  • kellon lämpötilanäyttö toimii sulavasti ja äänettömästi

Ratkaisut:

-Mikrokontrollerit toimivat molempien päiden aivoina joten niiden valinta vaikuttaa vähän kaikkeen. Useimmiten olen toteuttanut projekteja Arduinolla, mutta Atmega328-mikrokontrolleri ja etenkään Arduinon kehitysalustat eivät todellakaan ole tämän päivän vähävirtaisten laitteiden aatelia. Ne on suunniteltu lähtökohtaisesti 5v käyttöjännitteelle 16mhz nopeudella. AVR-mikrokontrollerin virransäästöominaisuuksia ei ole tuotu osaksi Arduinon perustoimintoja. Lisäksi kehitysalustoissa olevat ledit, regulaattorit ja USB-piirit vievät virtaa, vaikka itse mcu uinuisi syvää unta.

Texas Instrumentsin Launchpad kehitysalusta ja pieniruokainen MSP430g2553 mikrokontrolleri ovat luonteva ratkaisu. Ohjelmoiminen onnistuu onneksi Arduino Energia kehitysympäristöllä joka toimii hyvin pitkälle samoin kun Arduino IDE. Päätin käyttää MSP430g2553:sta ulos sijoitettavassa sensorissa. Jos lähetysten välit nukutaan enimmäkseen LPM3 virransäästötilassa joka vie lämpötilasta riippuen 3,6v käyttöjännitteellä vain 0,5 -0,75 uA, patterien pitäisi kestää melko pitkään. Akuksi ajattelin pientä yksikennoista lipo-akkua, mutta aluksi sensoria olen käyttänyt kolmella ni-mh-paristolla.

Lämpötila ja kosteus mitataan DHT22 anturilla joka kestää pakkasta ja kosteutta myös Suomen mittakaavassa. Tieto välitetään halvalla 433Mhz radiomoduulilla. Tavoite on vaihtaa myöhemmin kehittyneempään Nrf24l01 2.4Ghz taajuutta käyttäviin kaksisuuntaisiin moduuleihin, mutta niiden käyttö kahden eri mikrokontrollerin välillä vaatii vielä tutkimista.

Kellon päässä taas virrankulutus ei ole niin kriittistä. Isohkon kellotaulun taakse mahtuu isommat akut ja latailu/paristojen vaihtokaan ei ole niin hankalaa. Lisäksi kiinnostaa kokeilla miten virtapihiksi Arduinon saa helposti. Päätin käyttää n.3 e maksanutta Arduino pro mini alustaa lopullisessa laitteessa. Siinä ei ole USB-piiriä, power-ledin voi irrottaa ja regulaattorit ohittaa, jotta laitteesta saataisiin energiapihi. Vielä pitäisi uutena asiana saada watchdog timerin avulla toteutetun virransäästömoodi toimimaan.

Arduino pro micro (Atmega328P) ei virallisesti toimi 3.3vjännitteellä 16mhz nopeudella, mutta käytännössä monet ovat huomanneet tämän täysin mahdolliseksi. Itsellänikin on muutama boardi joissa on mahdollisuus säätää käyttöjännitteeksi 3.3v ja hyvin ovat toimineet. Toistaiseksi laite on toiminut kolmella AA-paristolla.

Näyttöjen viisareita on tarkoitus vääntää pienillä vaihteistollisilla askelmoottoreilla joita ajetaan ULN2003 darlintonpiirien avulla. Askelmoottorien hyvä puoli on että ne eivät vie virtaa silloin kun niitä ei ajeta. Lisäksi nämä vaihteistolliset mallit pyörivät sulavasti ilman että moottorin askelet näkyvät.

Kuva13.jpg

Projekti toteutui suotuisissa merkeissä. Kellon avaaminen oli aluksi lievä pettymys. Kellon akseli ja viisari eivät sallineet takakannen irroitusta vaikka sen sinällään sai irti. Päädyin leikkaamaan takakannesta sopivan palan pienoisporakoneella ja pikku laikalla. Tähän palaan jäi kaksi kiinnitysruuvia, joten sen saa tukevasti paikalleen ja helposti irti. Tähän palaan kiinnitin arduinon, radiovastaanottimen ja paristokotelon.

Kuva14.jpg

Mittailin ulottuvuuksia ja tulin siiheen tulokseen että askelmoottori ei aivan mahdu takakannen ja lämpömittarin väliin vaikka askelmoottori akselia lyhentäisikin. Takakanteen piti siis leikata sopiva aukko josta askelmoottorin perä tulee muutaman millin ulos.

Kuva15.jpg

Seuraavaksi piti ratkaista miten neula saadaan kääntymään. En halunnut purkaa näyttötaulua koska haluan että kello näyttää alkuperäiseltä ulospäin. Ensin ajattelin jumittaa lämpömittarin ja kääntää koko osaa, mutta kävi ilmi että vaikkakin se pyöri, liian tahkeasti. Päätin irrottaa metallikierteen ja koneistaa askelmoottorin akselin sopimaan suoraan mittarin akseliin.

Kuva16.jpg

Ensin lyhensin akselin rautasahalla jotta saisin moottorin matalalle ja paksumman osan akselia esiin.

Kuva6.jpg

Sitten pylväsporalla ja pienoisporalla sopiva kolo akseliin, niin syvä kun uskalsin.

Kuva7.jpg

Tein askelmoottorille, joka on yllättävän painava mettallikotelon ja vaihteiston takia, tukevan telineen joka ruuvattiin kellon kehykseen. Minulla on pakkomielteinen tapa vältää liimattuja rakenteita jotta voisin tarvittaessa purkaa laitteen ja parannella sitä. Myös rikkoutuneiden osien vaihtaminen on näin mukavampaa. Tämäkin kehys tuli pienillä ruuveilla kiinni ja askelmoottori puolestaan 3mm mutterilla.

Kuva8.jpg

Testaus osoitti laitteen toimivaksi. Tosin en ollut onnistunut (ei yllätys) koneistamaan akselin reikää niin tiukaksi että viisari olisi pyörinyt luotettavasti mukana. Ratkaisuna laitoin ohuenohuenohuen kerroksen sinitarraan akelinpesän reunoille :slight_smile:, mikä auttoi vain hetken. Päädyin liimaamaan josutavalla pikaliimalla viisarin moottorin akselissa olevaan reikään. Myös takakansi loksahti mukavasti paikalleen, ja moottori ei työnny ulos juuri yhtään.

Sitten koodin kimppuun.Sain molemmat laitteen uinailemaan virransäästötilassa kunnes on aika vaihtaa informaatiota. Sitten tieto välittyy arduinolle joka pyöräyttää askelmoottoria. Täytyi etsiä sopivat askellukemat per aste ja rakentaa prototyyppiharakanpesien tilalle pysyvät laitteistot.

Sain protoyypin nopeasti valmiiksi mutta laitteen saaminen lopulliseen kuntoon oli hieman työlästä. Vaihdoin kellossa olevan arduinon Pro mini-malliin. Poistin kärkipihdeillä murjomalla boardista turhaan virtaa vievät ledit irti sekä tarpeettoman regulaattorin joka veisi vain turhaan virtaa. Radiolähetin vei 3-4 mA virtaa jatkuvasti joten tein sille low-side virtakytkimen 2n222 NPN transistorista. Kello viekin nyt lepotilassa vain alle 10uA virtaa ja viestejä vastaanotettaessa virran kulutus kohoaa n 15 ma.

Jouduin leikkaamaan askelmoottorin darlington booardia että saisin sen mahtumaan kellon sisälle. Jäykät koekytkentäjohdot vaikeuttivat osien sommittelua ja sainkin ährätä saadakseni parisenttiä korkeaan tilaan, kellotaulua vasten ei saisi tulla painoa koska se on löysää ohutta muovia. Paristoiksi tuli nyt aluksi kolme 1,5 alkaliparistoa, mutta nuo voisi vaihtaa johon järkevämpään ratkaisuun.

Kuva11.jpg

Kuva12.jpg

Kuva13.jpg

Laitteen ohjelman tekemisessä suurin työ oli saada askelmoottori kääntämään viisaria siten että se liikkuu asteikon mukaan eikä sekoa laskuissa. Hankaluutta aiheutti että kyseisen BYJ28-48 moottorin akselissa on väljyyttä. Kun moottori vaihtaa suuntaa, menee tietty määrä askelia ennenkuin akseli lähtee pyörimään. Piti selvittää löysien poistoon tarvittava askelmäärä, ja koodissa piti ottaa huomioon edellisen liikkeen suunta.

Laitteen käyttöä helpottaa se, että jokainen viisarin sijainti tallentuu pysyvään EEPROM muistiin, joten patterien vaihtaminen ei hukkaa viisarin sijainti tietoa. Tein varalta kuitenkin kalibrointi toiminnon: Joka kerta kun laite resetoidaan, se tarkistaa onko yhteen pinniin kiinnitetty kytkin kiinni. Jos on, laite alkaa hivuttaa viisaria sattumanvaraisesti valittuun suuntaan kunnes kytkin avautuu. Jos suunta ei ole mieleinen, resetoi laitteen kunnes viisari lähtee kohti nollaa. Nollassa kytkin vapautetaan ja ohjelma on taas kartalla missä viisari menee.

Arduino Pro Mini boardissa ei ole usb-piirä mikä on vain hyvä asia hinnan (n.2 e) ja virrankulutuksen kannalta. Ohjelmointi piti siksi hoitaa spi-väylän kautta käyttäen arduino UNOa ohjelmointilaitteena. Tämä oli helppoa kuin heinänteko ja onnistuu vaikkapa näiden erinomaisten ohejeiden avulla.

Lähettimen kotelointiin aion palata vielä myöhemmin. Nyt laitteet ovat pienessä purkissa, sensori purkin kyljessä olevan reiän kohdalla. Akkuna on lipo-akku. Jännite oli testeissä 3,6v ja lähtein jaksaa sillä lähettää ulkoa sisälle 5-10m matkan.

Kuva14.jpg

Kuva15.jpg

Projekti jatkuu jossakin vaiheessa tuon sensorin uudella koteloinnilla ja omatekoisen MSP430-boardin vaihtamisella launchpadin tilalle. Suunitelma on tällä hetkellä tehdä sensori pienten akkukäyttöisten puutarhasaksien sisälle. Löysin ne joskus alekorista, hinta 5e, ja nyt harmittaa etten ostanut useampia. Siältä löytyy 1500maH li-ion akku latauselektroniikalla ja kun moottori on poistettu tilaa riittää minimaaliselle MSP430-piirille ja ,radiolähettimelle ja sensorille.

Toinen idea olisi lisätä kelloon koputuksen tunnistava anturi, ja kello voisi siten pyynnöstä näyttää muidenkin sensorien tietoja, tai vaikkapa lämpötilaennusteen, jonka internetiin kytketty arduino lähettäisi aika-ajoin. Säätä voisi näin ennustaa perineisellä ilmapuntarin koputtelulla.

Kuva16.jpg
Kuva5.jpg
Kuva4.jpg
Kuva3.jpg
Kuva2.jpg
Kuva1.jpg

Erinomaisesti kirjoitettu artikkeli mielenkiintoisesta aiheesta! :slight_smile:
Juttu oli sopivan rennosti kerrottu, tosin tekniseen puoleen (skemat, speksit jne) olisi voinut panostaa hieman lisää.

+1! Minä jäin myös kaipaamaan sitä insinööripornoa :slight_smile:

Pitää yrittää ehtiä laittamaan teille sitä raskaampaa viihdettä jahka ehtii. Sinällään aika yksinkertaiset on skemat. Kaikki laitteet kytketty niinkun datasheetit antaa olettaa, yksi transistori tuomassa eksotiikkaa.

Ehkä voisi tuota koodipuolta avata. On vaan semmonen tällä hetkellä että en tohi laittaa siistimättä/kommentoimatta kun siitä ei paljon selvää saa. Vuokko kieriskelis painajaishiessä seuraavan yön jos sen koodin näkis… :slight_smile:

Höpöhöpö :smiley:
Ihan vihjeenä kaikille. Ei kannata hävetä niitä omia kötöstyksiä. Päin vastoin, kannattaa ennemmin pää pystyssä pistää omat ratkaisut ongelmiin. Aina joku löytää paremman/hienomman/elegantimman/lyhyemmän tavan ratkaista ongelma. Niistä kannattaa ottaa itselleen hyödyllinen tieto irti, oppii uusia näkökulmia samalla :slight_smile:

Juuri näin. Aina joku löytää tavan säästää pari tavua tai muutaman kellojakson. Täällä kun on runsaasti ammattilaisia ja/tai ammattiin opiskelevia, joten tämä on ihan selvää… Kuitenkin foorumin hienoutena on, ettei ketään tyrmätä ja palaute on rakentavaa!

Joo en minä toisten koodeista ressiä ota, jos ei tarvitse itse oikeasti koskea. Kyllä minä niitä täällä voin lukea, mutta harvemmin edes yritän kääntää. Jos ei itselle aukea, niin yleensä on tapahtunut jotain sellaista mistä on syytä paheksua kirjoittajaa. Tällä kokemuksella ja kyvyllä nyrjäyttää ajatukset ympäri, menee melkoinen spagettikin läpi.

Yritän vain perinteisellä neliapilalla ajaa ihmisiä kirjoittamaan söpömpää koodia, repimään vehkeistä kaiken irti ja sivistämään itseään.

Kamalin pohjanoteeraus on jotain tämmöistä ja sillekin nauroin.

//Check if there is enough clock cycles in MCU
//If not, make MCU faster.
#if F_CPU <16000000UL
#undef F_CPU
#define F_CPU 16000000UL
#endif