Radijo bangomis valdomos rozetės

Prieš metus nusipirkau Maximoj dvi radio bangomis valdomas rozetes. Priežastis buvo paprasta kaip du centai - tingėjosi nuolat prieiti ir įkišti/ištraukti kištuką į rozetę nuo girliandos. Viskas veikė nuostabiai - bangos galėdavo praeiti netgi gelžbetoninę sieną be jokių problemų.

Bandydamas suderinti darbą ir sportą, nutariau dieną pradėti nuo 5 valandos ryto. Rankiniame laikrodyje esantis vibracinis žadintuvas suveikdavo tik kartais, nes dėl laisvesnio rankos suveržimo nakčiai tiesiog nejusdavau vibracijos. Sugalvojau į tai įtraukti šviečiančią girliandą, pamaniau, jog tai pakankamai geras ir švelnus būdas atsibusti nei garsinis telefono žadintuvas. Taip prasidėjo investigavimas…

Pirmiausia ištyrinėjau distancinį pultelį - ant jo buvo parašyta, kad jis valdo rozetes 433Mhz radijo bangų depazone. Tada googlinau ar įmanoma Arduino pagalba pasidaryti siųstuvą ir gavėją. Suradus teigiamą atsakymą, pasinėriau į siųstuvo sniffinimo galimybes. Internetuose egzistuoja ne vienas ir ne du projektai kaip valdyti rozetes, taigi drąsiai užsisakiau iš lietuviškos parduotuvės siųstuvą ir gavėją. Kaina tokio rinkinio iki 3€, iš Kinijos galima atsisiųsti per pus pigiau. Arduino snifferio kodas labai paprastas:

#include <RCSwitch.h>

RCSwitch receiver = RCSwitch();

void setup() {
    Serial.begin(9600);
    receiver.enableReceive(0);
}

void loop() {
    if (receiver.available()) {

        int value = receiver.getReceivedValue();

        if (value == 0) {
            Serial.print("unknown encoding");
        } else {
            Serial.print("received: ");
            Serial.print( receiver.getReceivedValue() );
            Serial.print(" | ");
            Serial.print( receiver.getReceivedBitlength() );
            Serial.print("bit ");
            Serial.print(" | ");
            Serial.print("delay: ");
            Serial.print(receiver.getReceivedDelay() );
            Serial.print(" | ");
            Serial.print("protocol: ");
            Serial.println( receiver.getReceivedProtocol() );
        }

        receiver.resetAvailable();
    }
}

Gavėjo data laidą reikia pajungti ant Arduino UNO antro skaitmeninio PIN’o. Detalesnį pajungimo diagramą pateikia rc-switch bibliotekos kūrėjai čia. Nuspaudus bet kurį distanciniame pultelyje esantį mygtuką Serial Monitor turėtų parodyti siunčiamą reikšmę rozetėms skaičiaus pavidalu. Šias reikšmes panaudosim vėliau.

Tiksliam veikimui pagal laiką Arduino reikėtų RTC modulio. Paskaičiavus kaštus ir apsvarsčius plėtimo galimybes atsisakiau viską lipdyti ant Arduino, o vietoj jo panaudoti Raspberry Pi Zero. Priežastys būtų kelios:

Pats startas su Raspberry Pi Zero yra pakankamai brangus, man išėjo viskas apie 30€ perkant iš lietuviškos parduotuvės kartu su miniHDMI to HDMI adapteriu ir OTG kabeliuku. Dar reikia atminties kortelės, kokybiško micro USB kabelio ir kokybiško srovės konverterio iš 220V į 5V, tačiau šias detales jau turėjau iš senesnių laikų. Kokybė čia pasireiškia gebėjimu praleisti daugiau nei 1.5A stiprio srovę. Atminties kortelė negali turėti blogų sektorių, kitaip veikimo metu matysis EXT4 failų sistemos klaidos.

Norint paruošti operacinę sistemą RPi Zero, reikia atsiųsti “Raspbian Stretch Lite” atvaizdą iš oficialaus puslapio. Paruošimo instrukcijų neaprašysiu, nes jos skiriasi priklausomai nuo OS ir jų yra pilnas internetas. Pereiname prie etapo, kai jau viską esame prijungę, Rasbian OS užsikrovęs ir jau esame prisijungę kaip pi vartotojas. Vykdome šias komandas:

# naudodamieji šia komanda sukonfigūruojame WIFI, įjungiame SSH, pasikeičiame Hostname (jei norima jungiantis per SSH naudoti adresą <hostname>.local vietoj IP adreso), laiko zoną ir lokalę:
$ sudo raspi-config

# atnaujiname sistemą:
$ sudo apt-get update
$ sudo apt-get upgrade

# instaliuojame Git:
$ sudo apt install -y git-core

# įrašome Pyenv ir pasirenkame modernią Python versiją:
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
$ sudo apt install -y libbz2-dev libreadline-dev libssl-dev libsqlite3-dev
$ pyenv install 3.6.7
$ pyenv global 3.6.7

# įrašome Pipsi:
$ curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | python
$ source ~/.bashrc
$ pip install --upgrade virtualenv

# įrašome rpi-rf:
$ pipsi install rpi-rf

Jei viskas susisuko be klaidų, galime pajungti siųstuvą. Pajungimo instrukciją pateikia patys autoriai čia. Pagal ją data laiduką reikia jungti prie PIN 11 (kitaip sakant GPIO 17). Viską pajungus galime išbandyti siųsti anksčiau gautas reikšmes iš snifferio komanda rpi-rf_send <skaičius>. Pilnai automatizacijai dabar tereikia sukurti įrašus cron’e.