Prologue langaton lämpötila-anturi ja Arduino

Tarvitsin kotiautomaatiojärjestelmään halvan tavan mitata lämpötiloja langattomasti eri huoneista. Pienen googlettelun jälkeen löysin halvimman mahdollisimman langattoman lämpötila-anturin, joka toimii 433,95 Mhz taajuudella. Koska halusin anturit mahdollisimman nopeasti käsiini, etsin antureita vain kotimaisista tavarataloista. Käsiini sattui 8,99€ maksava lämpötila-anturi Clas Olsonilta (http://www.clasohlson.com/fi/L%C3%A4mp%C3%B6mittarin-anturi/36-4744).

image02.png

Lämpötila-anturille ei ollut valmista softaa Arduinolle, eikä ollut tietoakaan käytetystä protokollasta, joten se piti selvitellä heti ensimmäiseksi. Protokollan selvittelyssä käytin pulseview-sovellusta ja USBee (klooni) logiikka-analysaattoria (9$ dollarin Kiinan ihme).

Avattuani lämpötila-anturin huomasin, että lähetin on erillisellä piirilevyllä ja sinne menee vain kolme piuhaa: virta, maa ja data. Kytkin logiikka-analysaattorin maa- ja data-piuhaan.

image00.png

Logiikka-analysaattorilla selvisi seuraavat asiat lähetysprotokollasta:

  • Lämpötila-anturi lähettää saman datakehyksen seitsemän kertaa peräkkäin
  • Jokainen kehys alkaa 8,8 ms pituisella 0-pulssilla
  • Datan ykkösbitti lähetetään 3,9 ms pituisella 0-pulssilla
  • Datan nollabitti lähetetään 1,9 ms pituisella 0-pulssilla.

image04.png
image01.png

Seuraavaksi aloin tutkia lähetys protokollaa tarkemmin lämmittämällä ja viilentämällä lämpötila-anturia ja samanaikaisesti tekemällä muistiinpanoja kehyksen arvojen muutoksista eri lämpötiloilla.

10010 01111100 000000 1000000001 10011000
10010 01111100 000000 1001100011 10011000
10010 01111100 000000 1001100011 10011000
10010 01111100 000000 1001100011 10011000

Lähetetyistä kehyksistä selvitin, että sanoman kehysrakenne on seuraavanlainen.

image03.png

Kehys näyttäisi muodostuvan 37-bitistä. 8 ensimmäistä bittiä kertoo luultavasti laiteId:n, jolla lämpötila-anturi tunnistetaan oikean tyyppiseksi. Seuraavalla kahdeksalla bitillä erotellaan samantyyppiset lämpötila-anturit toisistaan. Lämpötila ilmoitetaan 9-bitillä. Sanomassa ei ole virheentunnistusta.

Nyt kun sanoman rakenne oli selvä, pystyin kirjoittamaan koodin, joka purki Arduinolla lämpötila-anturilta saadun datan ihmisen ymmärtämään muotoon. Koodi löytyy kokonaisuudessaan githubista. https://github.com/arttupii/SmartHome/tree/emoncms/arduino/cheapWirelessTemperatureSensor

Vastaanottomoduulinina käytin dx.com:sta löytyvää http://www.dx.com/p/diy-433mhz-wireless-receiving-module-for-arduino-green-149252#.V4E1GHV96hc rx-moduulia. Kytkin Rx-moduulin data-pinnin Arduinon 3-pinniin ja aloin saada lämpötila-arvoja lämpötila-anturilta. Kaikki oli ok tässä vaiheessa. Seuraavaksi kasvatin vastaanottimen ja lähettimen välistä etäisyyttä ja tästä sitten ongelmat alkoivatkin. Kyseinen rx-moduuli oli susi. Maksi etäisyydeksi sain vain noin metrin. Halpahan se oli :slight_smile:. Pistin tilaukseen paremman mallin moduulista, jolla saan toivottavasti kasvatettua maksimi lukuetäisyyttä. Tuloksia joskus kuukauden päästä, kohan uusi halppis rx-moduuli saapuu Kiinasta.

Hieno saavutus!
Tämmösiä on aina kiva lukea, tämmöstenki selvittelyssä tarttee lähinnä tietää mitkä työkalut sopivat hommaan.
Näistä oppii aina itekin jotain uutta, itsehän en olisi edes tienny moisia työkaluja käyttää :slight_smile:

Kyllä, ja tuossa on tehty töitä ja aikaakin kulunut varmaan no ainakin muutama päivä, kun kaikki tuo on selvitelty. Tommosiin projekteihin saa menee helposti aikaa ainakin oman kokemukseni mukaan. Hyvä että on tämä ruuvipenkki.fi, jonne voi lisäillä projektejaan helposti. Eikä ne jää vaan pöytälaatikkoon keräämään pölyä. Samalla jokunen voi niistä innostua lisää ja ehkä siitä tulee joku päivä uusi “Nokia” :slight_smile:

Voisi varmaan joku päivä lisätä omakin vastaava projekti mitä tuli kesällä tehtynä. Siinä tosin langattomuudesta huolehtii SIM908 GSM/GPS-moduli. Jota taas ohjailee PIC 18F2550 lukien samalla anturit. Joita kiinni tällä hetkellä vain 2kpl joista tietoa nettiin luonnollisesti. Ja odottelen vielä kiinasta saapuvaksi paria anturia tuohon. Joille pitäisi vielä kooditkin rakennella…