Freimvorkėlis visokiems davikliams registruoti

Posted: 2013-09-09 in Darbeliai
Žymos:, , ,

Raspberry Pi — daviklių tinklas | Darau, blėKą gi, pradėjau Raspberry Pi tyrinėjimus ir visokių daviklių registravimo darbelius. Išbandžiau veikiantį Dallas DS18B20 skaitmeninį temperatūros daviklį. Planuose yra ir termistoriai su analoginiu-skaitmeniniu keitikliu, skaitmeninis drėgmės matuoklis bei fotorezistorius (photocell). Tam pradėjau gamintis lengvai plečiamą ir modifikuojamą Python freimvorkėlį, su kuriuo ruošiuosi daviklių informaciją kaupti bei panaudoti informacijos vaizdavimui tinklo serveryje. Paskui dar reikės sugalvoti, kaip paišyti grafikus.

Pirmasis darbelis — kaupti duomenis. Kaupsiu, aišku, SQLite duomenų bazėje, su ja paprasčiau terliotis, nei su kokiais tekstiniais failais.

Duomenų bazės struktūra paprasta: konfigūracijos lentelė, kurioje surašyti visi sekami davikliai ir duomenų lentelė, kurion rašomos atitinkamų daviklių reikšmės ir datos. Konfigūracinėje lentelėje turi būti aprašytas daviklio tipas ir konfigūracinė eilutė, skirta daviklio nuskaitymo tvarkyklei. Tarkim, mums nelabai įdomu, ar daviklis yra Dallas, ar koks kitas: jeigu jis yra vieno laido, tai jo duomenys prieinami per kažkokį sisteminį failą. Vadinasi, šiuo atveju daviklio tipas yra „Failas“. Toliau jau konfigūracinėje eilutėje nurodomas tipas ir failo kelias. O tvarkyklė pagal šią eilutę jau pati sprendžia, kaip nuskaityti ir interpretuoti duomenis ir joje saugomas pats failo formatas. Galimi ir kiti variantai, bet šis paprasčiausias. Ateityje galbūt dar daviklių tipams bus galima sukurti atsikiras „skaitykles“, bet pradžiai užteks ir vienos tvarkyklės vieno panašaus tipo, bet skirtingiems davikliams

Dar konfigūracijoje gali būti saugomas koks nors „draugiškas“ daviklio pavadinimas, pavyzdžiui, „Kambario temperatūra“, matavimo vienetai ir šiaip kažkas. Na, daviklio aprašymas toks kažkoks.

Duomenų lentelėje tai kažko daug nereikia. Vienas „id“ laukelis surišantis įrašą su kažkuriuo sukonfigūruotu davikliu, reikšmės laukelis ir data. Į reikšmės laukelį įrašoma galutinė daviklio reikšmė. Na, tarkim, temperatūros daviklio grąžinta reikšmė įrašoma laipsniais. Davikliai paprastai grąžina reikšmę sveikais skaičiais, tarkim, 20548, kas yra 20,548 ℃. Taigi reikšmę reikia tiesiog padalinti iš tūkstančio ir tokią jau įrašyti. Nematau prasmės kažkaip įrašinėti „žalias“ reikšmes, ypač, kai užsiimsiu termistoriais, nes ten dar analoginio-skaitmeninio keitiklio reikšmės iš viso „bile kokios“.

Štai pirmosios, konfigūracinės lentelės struktūra:

CREATE TABLE sensor (
id INTEGER PRIMARY KEY,
measurement text,
connection text,
configuration text,
friendly_name text,
unit text
);

Na, čia viskas paprasta. Laukelis „id“ — unikalus daviklio numeriukas-identifikatorius. Antrasis — apibūdinantis, ką daviklis matuoja: temperatūrą, drėgmę, šviesos srautą ar dar kažką. Trečiasis, „connection“ — nusako, kaip jungiamasi prie daviklio, konkrečios tvarkyklės nuoroda. Pavyzdžiui, „File“, jeigu daviklio reikšmės saugomos kokiame nors sisteminiame faile. „Configuration“ — konkretaus daviklio duomenys, nurodymai tvarkyklei. „Friendly_name“ — apibūdinantis daviklio pavadinimas, pavyzdžiui „Temperatūra kambaryje“, „Drėgmė virtuvėje“ arba „Šviesa kamine“. Na, kad būtų aišku, kur tas daviklis nukištas. „Unit“ — daviklio matavimo vienetai. „℃“, „%“ ar kažkas tokio.

Štai mano du sukonfigūruoti davikliai pirmai pradžiai:

sqlite> select * from sensor;
1|Temperature|File|Dallas:/sys/bus/w1/devices/28-000004c4f615/w1_slave|Kambario temperatūra|℃
2|Temperature|File|RaspiProc:/sys/class/thermal/thermal_zone0/temp|Avietės temperatūra|℃

Kaip matote, aš čia nustačiau du daviklius. Vienas jų — Dallas skaitmeninis daviklis, matuojantis kambario temperatūrą. Daviklio reikšmė saugoma nurodytame faile. Antrasis — Raspberry Pi kompiuteriuko procesoriaus temperatūra. Čia šiaip sau pagalvojau, kad būtų visai smagu stebėti, kokia yra priklausomybė tarp kambario ir procesoriaus temperatūros — tiesinė ar ne. Beje, iš po pirmos nakties pastebėjau vieną šuoliuką. Kaip tik apie pirmą valandą mano Avietė daro nusiurbiamuosius darbelius (atsarginę kopiją), tai procesorius truputuką sušilo.

Dabar labai laukiu, kada turėsiu laiko prijungti analoginį-skaitmeninį keitiklį ir su termistoriais matuoti lauko temperatūrą. Ruošiuosi padaryti du daviklius: vieną apsaugotą ir šešėliuotą, o kitą — išmestą tiesiai į lauką. Įdomu bus pažiūrėti, koks skirtumas tarp kaitinimo saulėje ir šešėlyje. Aišku, vasara jau pasibaigė, bet kol kas bus gerai ir taip.

Taigi, pirmoji programėlė, kurią šiam reikalui sukūriau, nuskaito daviklių konfigūraciją ir įrašo jų reikšmes į duomenų lentelę, kuri labai paprasta:

CREATE TABLE sensor_data(
id int,
value float,
date text,
foreign key(id) references sensor(id));

Tas pats identifikatorius, siejantis įrašą su davikliu, konkreti reikšmė ir data. Tiesa, datą kol kas rašau tekstiniu formatu, bet artimiausiu metu pakeisiu į Unix laiką — jį galima saugoti, kaip sveiką skaičiuką ir duomenų bazėje smarkiai sutaupysiu vietos.

Kol kas tiek. Jeigu šitas freimvorkėlis domina, galite jo pradinę versiją, kuri skaitinėja daviklius ir jų reikšmes įrašinėja, parsisiųsti ir paveizoti: davikliai-python-20130905.

Komentarai
  1. robsas parašė:

    jei šiuos duomenis norėsi matyti per naršyklę, tai geras daiktas grafikam kurti “amCharts“ http://www.amcharts.com/ viskas ten javascriptiškai veikia. Pats naudoju, čia pvz: https://www.dropbox.com/s/4b4dxep1jhwcoad/grafikai.png
    (duomenys iš eismoinfo.lt)

    • Darau, Blė parašė:

      Dėkui už patarimą, būtinai patyrinėsiu. Kol kas žadėjau naudoti Python Math modulį, kuriame yra įvairios priemonės grafikams braižyti, bet galbūt čia bus lengvesnis variantas.

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti /  Pakeisti )

Google photo

Jūs komentuojate naudodamiesi savo Google paskyra. Atsijungti /  Pakeisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti /  Pakeisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti /  Pakeisti )

Connecting to %s

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.