sobota 8. března 2014

Člunkový srážkoměr

Tak po menší pauze si připojíme k raspberry další periferii. Jelikož nám v meteo datech chybí srážkoměr, jednoduše ho připojíme.

Využijeme k tomu opět osvědčený čítač PCF8583. K Raspymu můžeme připojit maximálně dva čítače. Pokud přivedem na nohu č. 3 GND nebo VCC měníme I2C adresu z 050 na 051

Takhle vypadá check i2c sběrnice pokud jsou připojeny oba čítače.

root@raspberrypi:~# i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Vidíme oba čítače na adrese 50 a 51. Padesátku využívá intenzimetr a my použijeme 51.
Tady je schéma zapojení.

 Optický oddělovač použijeme z důvodu delšího vedení (na střechu) aby nám případně nějaká indukce neodpálila čítač i s raspym.  Jinak je zapojení velice jednoduché.


Teď si ukážeme jak zobrazit data z čítače.


#!/usr/bin/python
# -*- encoding: utf-8 -*-

import smbus
import time


bus = smbus.SMBus(1)    # novejsi verze Raspberry Pi (512MB)


# status registr obvodu pcf8583 nastavit na "EVENT COUNTER"
bus.write_byte_data(0x51,0x00,0x20)

while True:
  # nulovani registru s nacitanymi impulzy v obvodu PCF8583
  bus.write_byte_data(0x51,0x01,0x00) # vynulovat LSB
  bus.write_byte_data(0x51,0x02,0x00) # vynulovat prostredni bajt
  bus.write_byte_data(0x51,0x03,0x00) # vynulovat MSB

  time.sleep(60)  # pockat jednu minutu, behem ktere si bude citac sam pocitat impulzy


  # zjisteni poctu impulzu v citaci a prevod do desitkove soustavy
  counter =  bus.read_i2c_block_data(0x51,0x00)
  rad1 = (counter[1] & 0x0F)             # rad jednotek
  rad10 = (counter[1] & 0xF0) >> 4       # rad desitek
  rad100 = (counter[2] & 0x0F)           # rad stovek
  rad1000 = (counter[2] & 0xF0) >> 4     # rad tisicu
  rad10000 = (counter[3] & 0x0F)         # rad desetitisicu
  rad100000 = (counter[3] & 0xF0) >> 4   # rad stotisicu

    count = (rad100000 * 100000) + (rad10000 * 10000) + (rad1000 * 1000) + (rad100 * 100) + (rad10 * 10) + rad1
  print "Pocet impulzu v pocitadle = " , count

  cas = time.strftime("%H:%M ", time.localtime())
  soubor_RAM = file("/cesta/dest.txt",'w')   # k souboru v pameti se budou porad pridavat dalsi radky s daty (append)
  soubor_RAM.write(cas + str(count) + '\r\n') # zapsani datumu casu a poctu impulzu do souboru v RAMdisku
  soubor_RAM.close()
tento obsah uložte např. do "dest.py", jednoduše ho pak zavoláme python dest.py a už běží

myslim, že je to velice jasné k pochopení jak to pracuje, pokud budete mít čítač na pozici 050 změňtr všechy 0x51 na 0x50. Tento skript stačí pustit po startu systému a už pracuje sám. Stačí pak přes webserver (např. lighttpd) zobrazovat data, to už nechám na každém z vás.

Ještě fotodokumentace






Jak pracuje člunkový srážkoměr ? toto praktické video to osvětlí. Vodovod simuluje déšť :)