Raspberry Pi Meteostanice - Sense Hat

Nejrychlejší a nejjednodušší způsob jak Raspberry Pi upravit na meteostanici, je připojit k ní rozšiřující modul Sense Hat. Jedná se o doplněk vyvinutý přímo výrobcem Raspberry Pi. Původním účelem tohoto modulu byla mise pojmenovaná Astro Pi, při níž byly dvě „maliny“ vyneseny do vesmíru astronautem Timem Peakem. Jak tedy využít tento doplněk pro měření teploty, tlaku a vlhkosti?

Doplněk Sense Hat je možné připojit přímo na GPIO piny na Raspberry Pi a celá sestava pasuje do oficiální krabičky. Je to tedy také hezké kompaktní řešení. Sense Hat také počítá s připojením kamerového modulu a je v něm tedy připraven průchod pro kabel kamery.

Raspberry with sense hat


Když tedy máme Raspberry Pi se Sense Hatem pěkně zkompletováno v krabičce, můžeme začít s programováním.

Nejprve musíme nainstalovat knihovnu sense-hat.
sudo apt-get update
sudo apt-get install sense-hat
sudo reboot

Jakmile máme knihovnu úspěšně nainstalovanou tak můžeme začít programovat.
Do Python programu musíme nejprve naimportovat potřebné knihovny.
from sense-hat import SenseHat
Vytvoříme objekt typu SenseHat.
sense = SenseHat()
Tento objekt poskytuje několik metod, které budeme potřebovat.

th = sense.get_temperature_from_humidity() Metodou get_temperature_from_humidity() se načítá teplota s využitím vlhkostního čidla. Obě dvě čidla, jak vlhkostní, tak tlakové, umějí měřit teplotu. Je tedy možné si vybrat mezi více metodami, které měří a vrací údaj o teplotě.

tp = sense.get_temperature_from_pressure() Metoda get_temperature_from_pressure() vrací údaj o aktuální teplotě z tlakového čidla.

t = sense.get_temperature() Metoda get_temperature() vrací teplotu. Je to jen překrytí metody get_temperature_from_humidity() a výsledky těchto metod jsou tedy stejné.

h = sense.get_humidity() Touto metodou Sense Hatu je možné načíst údaj o aktuální vlhkosti z vlhkostního čidla.

p = sense.get_pressure() Metoda get_pressure() je poslední z metod, které můžeme využít pro meteostanici a načítá se s ní atmosferický tlak.

Pokud máme načtené všechny údaje, můžeme je uložit do databáze nebo zobrazit na displayi, který je na Sense Hat integrován.
Celý program tedy bude vypadat takto.
from sense_hat import SenseHat

sense = SenseHat()

while True:
  sense.clear()

  t = sense.get_temperature()
  tp = sense.get_temperature_from_pressure()
  th = sense.get_temperature_from_humidity()
  p = sense.get_pressure()
  h = sense.get_humidity()

  msg = "Temperature = %s, TempPressure = %s, TempHumidity = %s, Pressure = %s, Humidity = %s" % (t,tp,th,p,h)

  sense.show_message(msg, scroll_speed=0.05)

Tento prográmek bude cyklicky zobrazovat na displayi Sense Hat všechny údaje o teplotách, tlaku a vlhkosti.

Korekce naměřených hodnot.

Ovšem má to jeden drobný problém. Hodnoty ze Sense Hat jsou ovlivňovány teplotou procesoru Raspberry Pi. Je několik možností jak tento problém vyřešit.
První je připojení Sense Hatu k Raspberry pomocí „kšandy“. Tím se Sense Hat dostane dál od procesoru produkujícího teplo a naměřené údaje budou přesnější. Ovšem již celá meteostanice bude výrazně nevzhlednější a bude zabírat více místa.

Druhou možností je tedy změřit tuto teplotu a výsledky podle ní zkorigovat. Také vlhkost musíme podle teploty zkorigovat. Jedná se totiž o relativní vlhkost vzduchu, která je vztažena na teplotu. A pokud je teplota chybně, tak je chybná i hodnota vlhkosti.
Prográmek po zohlednění teploty CPU bude vypadat takto.
import os
from sense_hat import SenseHat

def get_cpu_temperature():
  res = os.popen('vcgencmd measure_temp').readline()
  return(res.replace("temp=","").replace("'C\n",""))

sense = SenseHat()

while True:
  sense.clear()

# temperature must be corrected
# https://www.raspberrypi.org/forums/viewtopic.php?f=104&t=111457
  t = sense.get_temperature()
  cpu = get_cpu_temperature()
  cpu_int = int(float(cpu))
  tc = t - ((cpu_int - t)/ 1.5)

  tp = sense.get_temperature_from_pressure()
  th = sense.get_temperature_from_humidity()
  p = sense.get_pressure()

# humidity must be corrected
  h = sense.get_humidity()
  hc = h * (2.5 - 0.029 * tc)

  msg = "Temperature = %s, TempPressure = %s, TempHumidity = %s, Pressure = %s, Humidity = %s" % (tc,tp,th,p,hc)

  sense.show_message(msg, scroll_speed=0.05)

Po těchto korekcích již Sense Hat měří celkem obstojně a naměřeným hodnotám se dá věřit. Zajímalo by mě ale, jakým způsobem toto bylo řešeno při Astro Pi misi.

Logování v PostgreSQL

Nejprve do tabulky weather v databázi doplníme potřebné sloupce.
alter table weather add column sense_hat_temperature numeric(19,6);
alter table weather add column sense_hat_temperature_pressure numeric(19,6);
alter table weather add column sense_hat_temperature_humidity numeric(19,6);
alter table weather add column sense_hat_pressure numeric(19,6);
alter table weather add column sense_hat_humidity numeric(19,6);
alter table weather add column sense_hat_cputemp numeric(19,6);

Pro zaznamenání naměřených hodnot do databáze PostgreSQL doporučuji použít Python knihovnu psycopg2.
sudo apt-get install python3-psycopg2
S úspěšně nainstalovanou knihovnou můžeme doplnit do scriptu metodu log_data().
import psycopg2

log_data(t, tp, th, p, h, dt, cput):
  try:
    conn = psycopg2.connect("host='ip_adresa_serveru' dbname='db_nazev' user='db_user' password='db_password'")
    cur = conn.cursor()
    cur.execute("insert into weather(sense_hat_temperature, sense_hat_temperature_pressure, sense_hat_temperature_humidity, sense_hat_pressure, sense_hat_humidity, sense_hat_cputemp, date_time) values(%s, %s, %s, %s, %s, %s, %s)", (t, tp, th, p, h, cput, dt))
    conn.commit()
    cur.close()
    conn.close()
  except psycopg2.OperationalError:
    print("Network Unreachable.")

Místo ip_adresa_serveru doplňte reálnou IP adresu databázového serveru, db_nazev je název databáze ve které se nachází tabulka weather. db_user a db_password jsou jméno a heslo uživatele, pod kterým chcete zápis provádět.

Pro zalogování naměřených hodnot je pak ještě nutné do nekonečného while cyklu doplnit volání této funkce.
log_data(tc, tp, th, p, h, cpu, cas)
Kompletní ukázkový program ke stažení.

Specifikace přesnosti senzorů:
Barometr: rozsah 260 – 1260 hPa, přesnost ~0.1 hPa
Vlhkostní senzor: v rozsahu teplot 15-40°C ~0.5°C, ~4.5% v rozsahu 20-80%rH
Teplotní senzor: v rozsahu teplot 0-65°C je přesnost ~2°C.

Zdroje:
https://www.raspberrypi.org/learning/astro-pi-guide/
https://www.raspberrypi.org/forums/viewtopic.php?f=104&t=111457

Raspberry Pi, Meteostanice

-
Kája z Norska
Kája z Norska

Jsem programátor, horolezec a tak trochu FlexiBee fanatik :-).
Na CharlieBlogu sepisuji své nápady a poznatky už od roku 2006.