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).
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.
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.
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.
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 . Pistin tilaukseen paremman mallin moduulista, jolla saan toivottavasti kasvatettua maksimi lukuetäisyyttä. Tuloksia joskus kuukauden päästä, kohan uusi halppis rx-moduuli saapuu Kiinasta.