Inteligentny dom – mierzenie zużycia prądu

Niedawno wśród moich sąsiadów zapanowała moda na zmianę taryfy elektrycznej ze standardowej płaskiej (za zużycie prądu płaci się zawsze tyle samo) na dwustrefową „ekonomiczną” (prąd jest tańszy niż w standardowej taryfie w godzinach 13-15 i 21-7 ale jednocześnie droższy od standardowej w pozostałych godzinach). Zastanawiając się nad strukturą zużycia prądu w naszym domu, nie miałem przekonania czy jesteśmy w stanie tak rozłożyć prace urządzeń, żeby przyniosło nam to wymierne korzyści. Z prostych wyliczeń wyszło mi że jeśli powyżej 75% zużycia prądu przypadnie na droższą taryfę to taka zmiana nie będzie się opłacać. W praktyce, dobrze żeby zużycie w tych droższych godzinach było mniejsze niż 70%. Żeby upewnić się co do naszego sposobu zużycia prądu, postanowiłem mierzyć nie tylko jego zużycie, ale jeszcze rozłożenie tego zużycia w czasie.

Istnieją gotowe systemy inteligentnego domu, które wśród swoich elementów posiadają liczniki energii z wyjściem na magistralę komunikacyjną (różnych typów w zależności od systemu). Kłopot w tym że są to dość kosztowne liczniki (ceny zaczynają się powyżej 300 złotych) a do nich potrzeba jeszcze czegoś co nam ten stan licznika odczyta i najlepiej – zapisze na serwer. Dużo tańszym rozwiązaniem jest licznik który ma wyjście impulsowe – w zależności od rodzaju podaje np. 1000 impulsów na kWh (spotkałem też takie które podają 400 impulsów a ten który ostatecznie kupiłem podaje 800 impulsów). Tego typu liczniki są do kupienia już za około 100 zł – porównując więc z droższym rozwiązaniem, zostaje nam sporo pieniędzy na zakup elektroniki. Ja do zliczania impulsów i wysyłania wyników na serwer wykorzystałem Arduino Uno z dołożonym Ethernet Shield (obok zdjęcie z etapu prototypowania na płytce stykowej).

Ponieważ mikrokontroler okresowo będzie zajęty np. wysyłaniem danych na serwer, postanowiłem do samego zliczania użyć prostego licznika binarnego. Licznik ten podłączyłem do kolejnego układu – PCF8574 czyli 8 portów cyfrowych dostępnych dla Arduino po łączu I2C (dzięki temu zaoszczędziłem na cyfrowych wyjściach które potrzebne były do komunikacji z Ethernet Shield). Pomysł wydawał się dobry – impulsy będą zliczane na liczniku, Arduino odczyta ich stan wtedy kiedy będzie mógł, doda do tego co już wcześniej miał w pamięci a następnie wyzeruje licznik. Proste. Kłopot w tym że licznik podaje impulsy na złączu typu „otwarty kolektor” (jeden kabel podpinamy do masy, drugi do pinu sygnałowego licznika binarnego), a podaje je w taki sposób że narastająca logiczna jedynka a następnie opadający sygnał do zera bardzo długo pływa w zakresie wartości nieustalonych. W praktyce licznik binarny naliczał czasem trzy, czasem nawet osiem impulsów na każdy impuls w rzeczywistości podany z licznika.

Z pomocą przyszło mi bardzo proste rozwiązanie – pozbyłem się zarówno licznika binarnego jak i dodatkowego modułu wejść cyfrowych. Zamiast tego sygnał z licznika podpiąłem bezpośrednio do pinu 0 (zero) w Arduino i napisałem funkcję która reagowała na przerwanie – na zmianę stanu na tym wejściu. Tego typu funkcja jest wywoływana zawsze kiedy stan wejścia ulegnie zmianie (deklarujemy czy interesuje nas zmiana na na stan wysoki, na stan niski czy dowolna). Funkcja ta jest wywoływana niezależnie od tego co innego kontroler w danym momencie robi. Moja funkcja była bardzo prosta – dodawała jeden impuls do globalnego licznika oraz ustawiała czas zliczenia ostatniego impulsu. Jeśli kolejny impuls pojawił się w mniej niż 100 milisekund od poprzedniego – nie był zliczany. W ten prosty sposób pozbyłem się wszystkich nadmiarowych impulsów, a jednocześnie zachowałem bardzo prostą konstrukcję programu. Ważne jest żeby funkcja obsługująca przerwanie wykonywała się w jak najkrótszym czasie – nie będzie wtedy wpływała negatywnie na funkcje komunikacyjne (wysyłanie danych na serwer). Gotową „kanapkę” z Arduino, Ethernet Shield i mojej płytki z elementami dodatkowymi można obejrzeć obok.

Zachęcony poprawnym działaniem układu, dołożyłem do oprogramowania obsługę fotorezystora (można dzięki temu badać stosunek zużycia prądu do nasłonecznienia) oraz termistora LM35 który w praktyce sprawdza temperaturę przy regulatorze napięcia (zauważyłem że układ dość mocno się grzeje kiedy pozostaje w zamkniętej obudowie). Wszystkie dane są wysyłane na serwer co kilka minut, a po każdej udanej komunikacji wewnętrzny licznik impulsów jest kasowany. Dzięki temu układ jest niewrażliwy na braki dostępu do internetu (suma impulsów od ostatniej poprawnej komunikacji wyśle się kiedy połączenie wróci) i może być dowolnie resetowany (przy resecie traci się co najwyżej te impulsy które nie zdążyły się wysłać na serwer od ostatniej komunikacji). Oczywiście – mój prosty układ nie pozwala na odczyt aktualnego stanu licznika, ale nie to było moim celem. Aktualny stan licznika można zliczyć po stronie serwera – sumując po prostu odebrane impulsy w bazie danych i dodając trochę na rzecz tego co zginęło przy resetach. Mam za to dość dokładny wzór zużycia prądu w ciągu doby.

Konkluzje? Wygląda na to, że możemy pokusić się o zmianę taryfy. Duża część naszego zużycia prądu wynika z naturalnego rytmu naszego życia i na te zakresy nie mamy zbytniego wpływu (nie wszystkie przyzwyczajenia da się łatwo zmienić a też nie zamierzamy walczyć z samymi sobą w celu oszczędzenia kilku procent). Jest też spora część zużycia które jest równo rozłożone w ciągu doby (lodówka, rekuperator, pompy pieca, zasilanie ruterów i innych drobnych układów elektronicznych) – ponieważ każde zużycie poniżej 70% w strefie droższej jest już opłacalne, to tego typu „płaskie” zużycie jest wręcz bardzo opłacalne (owszem, lodówka trochę mniej zużywa prądu w nocy niż w dzień, ale już pozostałe urządzenia – niemal dokładnie tyle samo w obu taryfach). To na co mamy najwięszy wpływ – praca pralki i zmywarki – może być przez nas sterowana na tyle na ile będziemy umieli sami się pilnować. Na szczęście nie jest to warunek konieczny – wygląda na to że i bez takie rygorystycznej kontroli możemy na zmianie taryfy zaoszczędzić. A jeśli dodatkowo uda nam się trochę zmienić strukturę naszego zużycia prądu – wyjdzie nam to tylko na dobre :)

Ostatnio przygotowałem sobie dwa mikrokontrolery Atmega328 z wgranym bootloaderem i zamierzam odzyskać płytkę Arduino Uno – zamiast niej podepnę Ethernet Shield bezpośrednio do zaprogramowanego układu. Wstępny projekt można zobaczyć na rysunku powyżej – poza dodanymi diodami sygnalizacyjnymi, jest podobnie jak poprzednio obsługa licznika przez przerwania, obsługa fotorezystora, ale już termistor został zastąpiony przez 1Wire – dzięki temu będę mógł oprócz kontroli temperatury układu, wysyłać na serwer także informację o temperaturach na kotle w kotłowni (gdzie układ pracuje).

Może Ci się również spodoba

7 komentarzy

  1. Marek napisał(a):

    fajny projekt, też się przymierzam do czegoś podobnego tyle, że z wykorzystaniem modułu enc28j60. W czym robiłeś froncik na serwerze? processing?

    • dulare napisał(a):

      Sam processing po stronie serwera to klasyczne PHP + MySQL. Do robienia wykresów użyłem gotowego API od Google :)

  2. krzyk napisał(a):

    Tez sie zastanawiam nad mierzeniem zużycia energii elektrycznej, póki co widzałem jedynie rozwiązania z fototranzystorem zamontowanym na diodzie w skrzynce elektrycznej (taka co daje impulsy co iles kWh).

    Jakiegu licznika ty użyłeś?

    • dulare napisał(a):

      Licznik kupiłem na Allegro. Nie pamiętam w tym momencie dokładnego modelu, a podawanie linku do aukcji nie bardzo ma sens – bo już wygasła. Mój model jest podobny do ORNO OR-03Y. Szukaj elektronicznego licznika z wyjściem podającym impulsy – w większości są to rozwiązania typu otwarty kolektor.

  3. Kuba napisał(a):

    Witam,

    przygotowuję na własne potrzeby podobny projekt. Jednakże nie mogę uzyskać tak ciekawego wykresu jak Pan ma(wspomina Pan o google api). Nie proszę o gotowe rozwiązanie ale o wskazówkę, link do stronki z template-em, który Pan wykorzystał. Ja wysyłam dane z Arduino poprzez HEAD do CSV i to jest obrabiane, lecz jesli api bedzie wymagac MySql to oczywiscie przerobie.

    Z gory dziekuje

    Pozdrawiam,

    Kuba

    • dulare napisał(a):

      W swoich rozwiązaniach używam zarówno jQuery Flot jak i Google Chart API. Zrzut mojej strony z wykorzystaniem obu tych technik jest tutaj: licznik.zip – skrtypty są pisane „na kolanie” więc nie wyglądają specjalnie profesjonalnie, ale działają.