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/pythontento obsah uložte např. do "dest.py", jednoduše ho pak zavoláme python dest.py a už běží
# -*- 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()
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éšť :)