Rejestrowanie wskazań liczników wody, gazu i prądu – opis trzech sposobów zliczania impulsów

Rejestrowanie wskazań liczników wody, gazu i prądu – opis trzech sposobów zliczania impulsów

Czołem!
Zmartwiony coraz większymi rachunkami za wodę, gaz i prąd postanowiłem przyjrzeć się bliżej temu, skąd u nas w domu bierze się aż tak duże zużycie – głównie wody.

Duże zużycie gazu w sezonie grzewczym da się zrozumieć. Bardzo duże zużycie prądu przy farmie ośmiu drukarek 3D w domu też było do przewidzenia, ale zużycie wody na poziomie ~25m3/mc bardzo mocno zaczęło nas zastanawiać. Szczególnie, że w tym samym okresie w zeszłym roku zużycie było dwukrotnie niższe!

Długo nie myśląc postanowiłem oczujnikować wszystkie trzy liczniki w domu (woda, gaz i prąd) i zbierać z nich dane, które później mógłbym przeanalizować.

W domu mam dokładnie takie liczniki i dla każdego z nich musiałem wykombinować inny sposób odczytu danych ;)

Licznik wody Flodis

Do odczytów impulsów z wodomierza wykorzystałem to, że na wskazówce znajduje się mała blaszka. Wystarczyło nad okienkiem umieścić czujnik indukcyjny, aby otrzymywać impulsy przy każdym pełnym obrocie wskazówki.

Wodomierz Flodis z czujnikiem impulsów

Na Thingiverse znalazłem nawet gotowy model uchwytu czujnika do tego wodomierza: https://www.thingiverse.com/thing:4146391. Model nie jest może idealny, ale spełnia swoje zadanie, więc nie bawiłem się już w modelowanie swojego uchwytu.

Jeżeli chodzi o czujnik, to użyłem czujnika indukcyjnego IB060NM61VB3. Dlaczego akurat ten czujnik? Bo miałem taki pod ręką :) Jakiś czas temu (dłuższy czas temu) dostałem kilka takich w prezencie od jednego z Was – od Marcina z firmy DEIRING. Do tej pory leżały w szufladzie, aż życie samo podsunęło idealne zastosowanie dla takiego czujnika. Dzięki MrLewerence!

W tym konkretnym projekcie ten czujnik ma jedną maleńką wadę – pracuje na napięciu >10V (i takie napięcie również podaje po wykryciu impulsu), a dla ESP8266, którego używam do wysyłania danych na serwer po WiFi, zalecanym napięciem jest 3,3V (przy 5V też daje radę). Chcąc całkowicie odizolować czujnik od ESP podłączyłem go za pośrednictwem transoptora. Jeżeli w swoim projekcie wykorzystacie czujnik pracujący na niższym napięciu, będziecie mieli trochę łatwiej ;)

Schemat podłączenia wodomierza Flodis do ESP8266

Jak widzicie, nie użyłem tutaj gołej płytki ESP8266, lecz modułu WEMOS D1. Jest to nic innego, jak ESP z wygodnym programatorem USB, więc można ją programować równie łatwo co zwykłe Arduino, bez potrzeby używania zewnętrznych programatorów.

Cały układ zasiliłem napięciem 12V oraz dodałem małą przetwornicę STEP-DOWN, która obniża napięcie do zasilania płytki D1.

Licznik gazu ACTARIS GALLUS 2000

Z gazomierzem sprawa była dużo prostsza, ponieważ posiada dedykowane gniazdo do podpięcia czujnika, w którym okresowo pojawia się pole magnetyczne. Wystarczyło więc zrobić szybki projekt mocowania i do odczytów impulsów wykorzystać najzwyklejszy kontaktron o wartości 3,3 zł.

Wszystkie moje modele znajdziecie do pobrania na końcu artykułu.

Gazomierz ACTARIS GALLUS 2000 z czujnikiem

W przypadku gazomierza schemat podłączenia jest jeszcze prostszy:

Schemat podłączenia gazomierza do ESP8266

Tutaj do zasilania można już użyć dowolnej ładowarki USB 5V.

Licznik prądu PAFAL TYP C52

Powoli wymieniamy całą instalację elektryczną w domu na nową, ale jako główny licznik prądu nadal wisi to analogowe cudo techniki wyprodukowane niemal 30 lat temu ;) Póki nie przepniemy całej instalacji pod nową skrzynkę, musiałem wykombinować sposób na odczyt zużycia z tego staruszka.

Początkowo rozważałem zagonienie do roboty Raspberry Pi z kamerą i oprogramowania OCR. Na Forbocie znalazłem nawet gotowca, którego wystarczyło wcielić w życie, ale cały ten projekt wydawał mi się strzelaniem z armaty do muchy.

W naszej majsterkowej grupie na fejsie Maciek podsunął pomysł, żeby zastosować transoptor odbiciowy (czujnik odległości IR). I był to strzał w dziesiątkę!

Po przeszukaniu szufladek z elektroniką znalazłem kupiony przed laty gotowy czujnik TCRT5000.

Jak widzicie, są to po prostu dwie diody – jedna świeci światłem podczerwonym, a za pomocą drugiej diody (diody odbiorczej / fotodiody / fototranzystora) możemy sprawdzić ile światła odbija się i wraca. Dzięki temu, że na talerzu obracającym się w liczniku prądu znajduje się namalowane czarne pole (które odbija dużo mniej światła). bez problemu można odczytywać z niego impulsy za pomocą takiego czujnika (lub po prostu dwóch diod IR – nadawczej i odbiorczej).

Do zamocowania czujnika wymodelowałem proste mocowanie, które dodatkowo ogranicza dopływ światła z zewnątrz do diody odbiorczej:

Czujnik impulsów do licznika prądu PAFAL TYP C52

I tutaj pojawia się ważna kwestia – tego typu patent można zastosować tylko wtedy, gdy licznik znajduje się w jakiejś zaciemnionej szafce. Jeżeli licznik znajduje się gdzieś na wierzchu, trzeba by zakleić całą szybę czarną taśmą, aby światło słoneczne (lub z oświetlenia pokoju) nie zakłócało pomiarów.

Początkowo próbowałem podpinać diodę odbiorczą pod wejście analogowe w ESP8266 i poprzez analizę odczytów wyłapywać obrót talerza, ale przy takim rozwiązaniu nie mógłbym wykorzystać przerwań do zliczania impulsów. Gdyby impuls wpadł akurat w trakcie wysyłania danych na serwer, to mógłby nie zostać zliczony.

Poszedłem zatem inną drogą – za pomocą dodatkowego potencjometru podpiętego pod diodę odbiorczą ustawiłem całość tak, żeby po podpięciu pod wejście cyfrowe otrzymywać od razu zero lub jedynkę logiczną.

Schemat podłączenia licznika prądu do ESP8266

Tutak także zasiliłem płytkę ze zwykłej ładowarki USB.

Program do wysyłania danych na serwer

Poniżej przedstawiam program dla licznika prądu.

Tak, wiem – te moje kody to czysta amatorszczyzna grubymi nićmi szyta. Napisałem to tak, jak umiałem i jestem pewny, że dałoby się to napisać lepiej. Najważniejsze jednak, że całość działa bez zarzutu.

W pozostałych licznikach wszystko wygląda analogicznie.

I krótkie wyjaśnienie najważniejszych części programu:

Dioda LED sygnalizująca zaliczenie impulsu jest podpięta do GPIO5 (jest to pin D1 w ESP8266). Z kolei pod GPIO2 jest podpięta dioda odbiorcza z czujnika wyłapującego impulsy.

Tutaj jest zdefiniowane, jak często ESP ma wysyłać dane na serwer (w moim przypadku co minutę).

To jest funkcja obsługująca przerwanie wywoływane przy wykryciu impulsu. Jest tutaj po prostu dodawane +1 do zmiennej impulsyPrad.

Jak pewnie zauważyliście, ESP nie tylko zlicza kolejne impulsy, ale również cały czas aktualizuje sobie w pamięci aktualny stan licznika. Tzn po uruchomieniu trzeba go ustawić, a później ESP już sam go pilnuje ;)

W przypadków licznika wody i gazu sprawa jest prosta, bo w tych licznikach jest prosty przelicznik impulsów:

  • wodomierz: jeden impuls to 0,0001 m3 wody,
  • gazomierz: jeden impuls to 0,001 m3 gazu.

W liczniku prądu mam 120 impulsów na 1 kWh (120 obr./kWh). Żeby nie babrać się z kosmicznymi ułamkami przy aktualizowaniu stanu licznika po każdym impulsie, aktualizuję jego stan co trzy impulsy dodając do wskazania 25.

Dlaczego 25 a nie 0,025? Z tego samego powodu, który podałem wyżej – żeby uniknąć w ESP operowania na ułamkach. We wszystkich ESP stany liczników przechowuję w postaci liczb całkowitych i dopiero na serwerze dzielę je sobie przez /1000 lub /100 uzyskując docelowe wskazanie licznika.

Przerwanie jest zdefiniowane w linii:

Ok, lećmy dalej :)

Te dwa kawałki kodu odpowiadają za ustawianie aktualnego stanu czujnika po włączeniu ESP. Wystarczy wysłać do ESP proste zapytanie, aby ustawić aktualny stan licznika:

Stan licznika zostanie zapisany w pamięci ESP i będzie na bieżąco aktualizowany i wysyłany na serwer.

I to jest ostatnia ważna część programu. Odpowiada ona za cykliczne wysyłanie danych na serwer. Informacja o ilości impulsów zliczonych od czasu ostatniej wysyłki oraz o stanie licznika jest wysyłana na serwer w prostym zapytaniu GET:

Po stronie serwera pozostaje już tylko odebrać zapytanie i zapisać dane w bazie.

Bazy danych

Na potrzeby swoich liczników zrobiłem w bazie danych dwie tabele:

  • impulsy – co minutę trafia do niej rekord z informacją o ilości impulsów wody, gazu i prądu oraz ich koszcie,
  • stany – w tej tabeli co minutę zapisywane są aktualne stany liczników.

Kody do utworzenia tabel:

Skoro bazy danych są już gotowe, możemy przejść do zapisywania w nich danych.

Zapisywanie danych w bazie MySQL

Na początku tworzymy dwa pliki:

mysql.php – w tym pliku zapisujemy dane do łączenia z bazą danych:

ceny.php – tutaj zapisałem sobie aktualne ceny wody, gazu i prądu:

Na koniec pozostało już tylko utworzyć plik dodaj_prad.php, który będzie zapisywał dane wysyłane przez ESP (dla pozostałych liczników robimy analogicznie).

Uwaga – tego kodu, to już nawet amatorszczyzną nazwać nie można. Mam tego świadomość, więc możecie się za bardzo nie nabijać z tego kodu w komentarzach ;) Początkowo wyglądał nawet ładnie, czysto i przejrzyście, ale cały czas coś tam w nim grzebię, dodaję i poprawiam, więc mogło się wkraść trochę chaosu.

Działanie skryptu jest proste – przy wywołaniu zapytania GET z ESP8266 skrypt sprawdza, czy w danej minucie został już utworzony rekord z danymi czy nie. Jeżeli go nie ma, to go tworzy zapisując w bazie odczyty z danego licznika.
Jeżeli natomiast rekord już jest, bo np. kilka sekund wcześniej w bazie zapisały się odczyty z wodomierza, to dany rekord jest aktualizowany i są do niego dodawane odczyty z kolejnego licznika (w tym przypadku z licznika prądu).

I to wszystko – system już zbiera i zapisuje wszystkie dane.

Pliki STL do pobrania

Wykresy, wykresiki…

Na koniec została do zrobienia jeszcze warstwa wizualna. I to będzie materiał na kiedyś, bo tutaj jeszcze dużo zostało mi do zrobienia.

Zalążek warstwy wizualnej zacząłem już budować z pomocą biblioteki Chart.js, ale jest to dopiero wierzchołek góry lodowej tego, co chcę zrobić, więc na razie nie będę poruszał tego tematu :)

Na razie wygląda to tak:

Po kolei mamy tutaj:

  • wykres zużycia mediów z ostatnich dwóch godzin,
  • wykres zużycia z danego dnia,
  • wykres zużycia z poprzedniego dnia,
  • wykres zużycia z danego miesiąca (system działa dopiero kilka dni, więc jeszcze jest tam mało danych),
  • roczne zestawienie wysokości rachunków z rozdzieleniem na poszczególne media.

Na pewno chcę zrobić jeszcze różnego rodzaju tabele z informacjami o wzroście zużycia względem poprzedniego okresu, prognozowanych wysokościach rachunków, itp. Ale to będę już sobie powoli dłubał i dopieszczał, a za jakiś czas podzielę się z Wami wszystkimi kodami.

I na dzisiaj to by było tyle. Mam nadzieję, że projekt się Wam przyda – jeżeli nie w całości, to może chociaż zaczerpniecie z niego jakieś rozwiązania.

Jeżeli macie jakieś uwagi lub komentarze, to piszcie śmiało!

Pozdrawiam!
Łukasz

Ocena: 5/5 (głosów: 4)

Podobne posty

50 komentarzy do “Rejestrowanie wskazań liczników wody, gazu i prądu – opis trzech sposobów zliczania impulsów

Odpowiedz

anuluj

Masz uwagi?