Z powodu braku korzystnych ustaw (stan na koniec 2014) dla producentów energii z mikroinstalacji sprzedaż do sieci jest nieopłacalna. Dlatego najlepszym rozwiązaniem jest wykorzystanie energii lokalnie niedopuszczając do 'wycieku' w sieć. Obecnie najtańszym sposobem magazynowania energii (dla gospodarstwa domowego) jest bojler, zbiorniki akumulacyjne itp.
Można rozważyć magazynowanie w akumulatorach, ale pod warunkiem zdobycia zdrowych używek. Wielokrotnie były robione obliczenia pokazujące, że koszt energii z nowych aku wynosi około 1zł/KWh.
Zadaniem strażnika mocy jest monitorowanie styku sieci dom-ZE i dynamiczne sterowanie/załączanie np. grzałek.
Chciałbym przedstawić budowę takiego urządzenia opartego na liczniku Pozyton sLAB i arduino. Całość składa się z modułów (najczęściej) gotowych do kupienia:
1. Licznik Pozyton
2. arduino uno
3. moduł RS485
4. tyrystorowy moduł sterowania grzałką. Separacja galwaniczna, MOC3021, triak BT139.
5. moduł zasilania 5V
6. płytka z kilkoma elementami do detekcji przejścia przez zero (napięcia AC)
Zmontowane urządzenie ruszyło bez kalibracji i bardzo precyzyjnie steruje mocą. Pomiar jest w jednym punkcie tuż za licznikiem ZE.
Opiszę poszczególne moduły na zasadzie od ogółu do szczegółu.
1. Wybrałem licznik Pozyton sLAB (jednofazowy) ze względu na możliwość odczytu z portu RS485.
Komunikacja odbywa się w protokole IEC1107. Na stronie pozytona jest to opisane, aż za dobrze.
Dzięki temu można odczytywać wiele wartości i tę najważniejszą czyli moc chwilowa czynna.
Odczytana wartość P() ze znakiem minus oznacza oddawanie energii do sieci.
Dodatkową zaletą tego licznika jest możliwość odczytu aktualnej daty i czasu.
Uwaga: fabryczna prędkość portu RS485 to 4800b/s 7E1, ale zdarzają się egzemplarze z ustawioną prędkością 9600b/s.
Załączam kod dla arduino, którym rozszyfrowałem protokół:
2. Nad arduino nie będę się rozwodził.
3. Kupiłem gotowy moduł. W sklepach jest duży wybór. Moduł jest z gotowymi rezystorami podciągającymi A i B.
Podłączenie do Pozytona tylko dwoma przewodami. Czasami trzeba zamienić miejscami A i B.
4. Także gotowiec. Sterowanie mocą fazowe na triaku BT139.
Może być ten: http://serwis.avt.pl/manuals/AVT440_3.pdf
ale trzeba zamienić na MOC3021. Zdarzyło się uszkodzenie triaka. Gdzieś doczytałem, że to z powodu niewłaściwych rezystorów. w obwodzie triaka.
5. Obecnie zasilam wszystko z wyprowadzeń arduino, ale plan jest
6. Detekcja zera AC przez taki układzik:
http://atnel.pl/download/ksiazka/fragmenty.pdf
strona 32. Działa bardzo dobrze.
Rezystory na wejściu trzeba dobrać tak żeby wytrzymały napięcie AC.
Można wstawić np. trzy w szeregu mniejsze, lub tak jak w powyższym przykładzie rezystor większej mocy. U mnie na wejściu są dwa rezystory szeregowo 0,5W po 32K.
Rezystor na wyjściu (pin 4) jest około 30K.
Oprogramowanie:
Impulsy z modułu detekcji przejścia przez zero AC podawane są na port IO nr 2. Na tym porcie zdefiniowana jest obsługa przerwania: void zeroCrossingInterrupt().
Dobrze jest to opisane na stronie arduino:
http://playground.arduino.cc/Main/ACPhaseControl
Arduino pobiera dane z licznika pozyton (co 1,5s) i na podstawie Pnom decyduje jaką moc oddać na grzałkę przez wyliczenie czasu po jakim wyzwala triak.
Edit: dane z licznika mogą być pobierane kilka razy na sekundę.
W programie robi to funkcja grzalka_set()
void grzalka_set()
{
OCR1A = map(grzalka, 1, GRZALA, 615, 65 );
//dla 615 żarzenie prawie niewidoczne
//dla 65 full
attachInterrupt(0, zeroCrossingInterrupt, RISING);
}
Zmienna 'grzalka' to poniekąd P(). Ta wartość zmienia się dynamicznie zależnie od poprzedniej wartości i aktualnego poboru.
GRZALA to wartość stała w tym przypadku 1406W.
Całego softu nie udostępnie ponieważ jest tam delikatnie pisząc bałagan, ale to powyżej spokojnie pozwoli za złożenie swojej wersji. Starałem się budować z gotowych modułów, żeby jak najmniej lutować.
Jestem na etapie składania wszystkiego do docelowej obudowy, więc jeśli ktoś chciałby coś zasugerować, zoptymalizować to uwagi są mile widziane.
Zapraszam też do prezentacji swoich wersji SM w tym miejscu.
errata:
w programie jest istotny błąd w części transmisji do portu szeregowego (MAX485)
tak to powinno wyglądać:
digitalWrite(SWITCH_PIN, HIGH); //transmit to slave ready (pin MAX485) RO (-->RX arduino) is high impedance when RE is high. Blokuje odbior.
delay(1);
// --> tu wysyłka do bufora portu szeregowego
while (!(UCSR0A & (1 << UDRE0))) // Wait for empty transmit buffer
UCSR0A |= 1 << TXC0; // mark transmission not complete
while (!(UCSR0A & (1 << TXC0)));
//This requires fiddling with hardware registers (and the exact ones depend on whether you are using Serial, Serial1, Serial2 and so on). The first loop waits for the hardware chip's buffer to empty, at the same time setting the "transmission not complete" flag. The second loop waits for the final byte to be clocked out by the hardware.
//http://www.gammon.com.au/forum/?id=11428
digitalWrite(SWITCH_PIN, LOW ); //DE -low --> blokada TX z arduino. RE is Low (negacja) - odbior mozliwy
//piny scalaka MAX485 RE i DE połączone razem
Można rozważyć magazynowanie w akumulatorach, ale pod warunkiem zdobycia zdrowych używek. Wielokrotnie były robione obliczenia pokazujące, że koszt energii z nowych aku wynosi około 1zł/KWh.
Zadaniem strażnika mocy jest monitorowanie styku sieci dom-ZE i dynamiczne sterowanie/załączanie np. grzałek.
Chciałbym przedstawić budowę takiego urządzenia opartego na liczniku Pozyton sLAB i arduino. Całość składa się z modułów (najczęściej) gotowych do kupienia:
1. Licznik Pozyton
2. arduino uno
3. moduł RS485
4. tyrystorowy moduł sterowania grzałką. Separacja galwaniczna, MOC3021, triak BT139.
5. moduł zasilania 5V
6. płytka z kilkoma elementami do detekcji przejścia przez zero (napięcia AC)
Zmontowane urządzenie ruszyło bez kalibracji i bardzo precyzyjnie steruje mocą. Pomiar jest w jednym punkcie tuż za licznikiem ZE.
Opiszę poszczególne moduły na zasadzie od ogółu do szczegółu.
1. Wybrałem licznik Pozyton sLAB (jednofazowy) ze względu na możliwość odczytu z portu RS485.
Komunikacja odbywa się w protokole IEC1107. Na stronie pozytona jest to opisane, aż za dobrze.
Dzięki temu można odczytywać wiele wartości i tę najważniejszą czyli moc chwilowa czynna.
Odczytana wartość P() ze znakiem minus oznacza oddawanie energii do sieci.
Dodatkową zaletą tego licznika jest możliwość odczytu aktualnej daty i czasu.
Uwaga: fabryczna prędkość portu RS485 to 4800b/s 7E1, ale zdarzają się egzemplarze z ustawioną prędkością 9600b/s.
Załączam kod dla arduino, którym rozszyfrowałem protokół:
2. Nad arduino nie będę się rozwodził.
3. Kupiłem gotowy moduł. W sklepach jest duży wybór. Moduł jest z gotowymi rezystorami podciągającymi A i B.
Podłączenie do Pozytona tylko dwoma przewodami. Czasami trzeba zamienić miejscami A i B.
4. Także gotowiec. Sterowanie mocą fazowe na triaku BT139.
Może być ten: http://serwis.avt.pl/manuals/AVT440_3.pdf
ale trzeba zamienić na MOC3021. Zdarzyło się uszkodzenie triaka. Gdzieś doczytałem, że to z powodu niewłaściwych rezystorów. w obwodzie triaka.
5. Obecnie zasilam wszystko z wyprowadzeń arduino, ale plan jest
6. Detekcja zera AC przez taki układzik:
http://atnel.pl/download/ksiazka/fragmenty.pdf
strona 32. Działa bardzo dobrze.
Rezystory na wejściu trzeba dobrać tak żeby wytrzymały napięcie AC.
Można wstawić np. trzy w szeregu mniejsze, lub tak jak w powyższym przykładzie rezystor większej mocy. U mnie na wejściu są dwa rezystory szeregowo 0,5W po 32K.
Rezystor na wyjściu (pin 4) jest około 30K.
Oprogramowanie:
Impulsy z modułu detekcji przejścia przez zero AC podawane są na port IO nr 2. Na tym porcie zdefiniowana jest obsługa przerwania: void zeroCrossingInterrupt().
Dobrze jest to opisane na stronie arduino:
http://playground.arduino.cc/Main/ACPhaseControl
Arduino pobiera dane z licznika pozyton (co 1,5s) i na podstawie Pnom decyduje jaką moc oddać na grzałkę przez wyliczenie czasu po jakim wyzwala triak.
Edit: dane z licznika mogą być pobierane kilka razy na sekundę.
W programie robi to funkcja grzalka_set()
void grzalka_set()
{
OCR1A = map(grzalka, 1, GRZALA, 615, 65 );
//dla 615 żarzenie prawie niewidoczne
//dla 65 full
attachInterrupt(0, zeroCrossingInterrupt, RISING);
}
Zmienna 'grzalka' to poniekąd P(). Ta wartość zmienia się dynamicznie zależnie od poprzedniej wartości i aktualnego poboru.
GRZALA to wartość stała w tym przypadku 1406W.
Całego softu nie udostępnie ponieważ jest tam delikatnie pisząc bałagan, ale to powyżej spokojnie pozwoli za złożenie swojej wersji. Starałem się budować z gotowych modułów, żeby jak najmniej lutować.
Jestem na etapie składania wszystkiego do docelowej obudowy, więc jeśli ktoś chciałby coś zasugerować, zoptymalizować to uwagi są mile widziane.
Zapraszam też do prezentacji swoich wersji SM w tym miejscu.
errata:
w programie jest istotny błąd w części transmisji do portu szeregowego (MAX485)
tak to powinno wyglądać:
digitalWrite(SWITCH_PIN, HIGH); //transmit to slave ready (pin MAX485) RO (-->RX arduino) is high impedance when RE is high. Blokuje odbior.
delay(1);
// --> tu wysyłka do bufora portu szeregowego
while (!(UCSR0A & (1 << UDRE0))) // Wait for empty transmit buffer
UCSR0A |= 1 << TXC0; // mark transmission not complete
while (!(UCSR0A & (1 << TXC0)));
//This requires fiddling with hardware registers (and the exact ones depend on whether you are using Serial, Serial1, Serial2 and so on). The first loop waits for the hardware chip's buffer to empty, at the same time setting the "transmission not complete" flag. The second loop waits for the final byte to be clocked out by the hardware.
//http://www.gammon.com.au/forum/?id=11428
digitalWrite(SWITCH_PIN, LOW ); //DE -low --> blokada TX z arduino. RE is Low (negacja) - odbior mozliwy
//piny scalaka MAX485 RE i DE połączone razem