Na początek witam bo to mój pierwszy wpis na majsterkowo.pl. Zachęcony na Google Plus postanowiłem zamieścić swój ostatni projekt czyli rejestrator napięcia, prądu, mocy (czynnej, biernej i pozornej) oraz współczynnika mocy. Pomiar jest dokonywany co ok. 2 sekundy (można to sobie skonfigurować), wyniki wyświetlane są na wyświetlaczu ciekłokrystalicznym Robot LCD i zapisywane na karcie microSD (w której gniazdo wyposażony jest wyświetlacz). OK, koniec ściemniania – do rzeczy. Lista potrzebnych podzespołów:
- Arduino (ja użyłem Mega2560),
- Robot LCD,
- cęgi Dietza SCT-013-030 (0-30A),
- transformator 230/5V,
- moduł tinyRTC,
- 4x470k,
- 1x20k,
- 1x100k,
- 2xkondensator (kilka mikrofaradów/20V),
- kable,
- obudowa,
- gniazdo mały jack (do podłączenia cęg Dietza).
Schematy: To schematy układów kondycjonujących napięcie i prąd (dzielniki napięcia, dodanie składowej stałej). To jest schemat montażowy. Mam nadzieję, że widać co ma iść do którego pinu. Tak to wygląda po zmontowaniu i włożeniu do obudowy. Płytki drukowane robione metodą chałupniczą (lakier do paznokci i wytrawiacz). Tak wygląda to na wyświetlaczu. A to kawałek wykresu z gnuplota (moc czynna). Wykorzystałem bibliotekę Emonlib (openenergymonitor.org), zresztą schematy układów kondycjonujących prąd i napięcie też są stamtąd (jedynie inne wartości rezystorów dla mojego transformatora dobrałem). Szkic Arduino (myślę, że opisałem wszystko w miarę dokładnie w komentarzach).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
#include "EmonLib.h" // Biblioteka obliczajaca parametry sieci #include <TFT.h> // Obsluga ekranu LCD #include <SPI.h> // Obsluga SPI (Serial Peripheral Interface) - uzywana przez ekran LCD #include <Wire.h> // Obsluga RTC (polaczenie) #include "RTClib.h" // Obsluga RTC (zegar) #include <SD.h> // Obsluga karty SD EnergyMonitor emon1; // Instancja Emonlib RTC_DS1307 RTC; const int chipSelect = 4; // pin do ktorego podlaczony jest sygnal CS-SD //definicja pinow dla LCD #define cs 10 #define dc 9 #define rst 8 TFT TFTscreen = TFT(cs, dc, rst); char Irmsprintout[6]; char Vrmsprintout[6]; char Czynnaprintout[6]; char Pozornaprintout[6]; char Cosfiprintout[6]; void setup() { Wire.begin(); RTC.begin(); //Inicjalizacja zegara RTC if (! RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); //Jesli zegar RTC jest zatrzymany (np. po wymianie baterii) //to synchronizuj zegar z zegarem komputera. } Serial.begin(9600); // Transmisja po wirtualnym porcie szeregowym (USB) Serial.print("Uruchamianie obslugi karty SD..."); pinMode(10,OUTPUT); if (!SD.begin(chipSelect)) { Serial.println("Nie udalo się uruchomic karty SD. BLAD!"); return; } Serial.println("Obsluga karty SD uruchomiona."); TFTscreen.begin(); // Inicjalizacja ekranu LCD TFTscreen.background(0, 0, 0); // Kolor tla TFTscreen.stroke(255,255,255); // Kolor napisow TFTscreen.setTextSize(2); // Rozmiar czcionki TFTscreen.text("I = \n",0,0); TFTscreen.text("A \n",130,0); TFTscreen.text("U = \n",0,20); TFTscreen.text("V \n",130,20); TFTscreen.text("P = \n",0,40); TFTscreen.text("W \n",130,40); TFTscreen.text("S = \n",0,60); TFTscreen.text("VA \n",130,60); TFTscreen.setTextSize(1); TFTscreen.text("cos fi \n",0,85); TFTscreen.setTextSize(2); TFTscreen.text("= \n",48,80); TFTscreen.setTextSize(1); TFTscreen.text("Tomasz Stafinski \n",35,120); TFTscreen.setTextSize(2); emon1.voltage(2, 272.00, 3); // Napiecie: pin wejsciowy, kalibracja, kalibracja przesuniecia fazowego emon1.current(1, 35); // Prad: pin wejsciowy, kalibracja. } void loop() { emon1.calcVI(50,2000); // Oblicza wszystkie wielkosci (ilosc okresow do obliczenia wartosci, timeout) double Irms = emon1.Irms; // Wartosc skuteczna pradu z obiektu emon1 String Irmss = String(Irms); // Wartosc skuteczna zamieniona na zmienna lancuchowa double Vrms = emon1.Vrms; // Wartosc skuteczna napiecia String Vrmss = String(Vrms); double Czynna = emon1.realPower; // Moc czynna String Czynnas = String(Czynna); double Pozorna = emon1.apparentPower; // Moc pozorna String Pozornas = String(Pozorna); double Cosfi = emon1.powerFactor; // Wspolczynnik mocy String Cosfis = String(Cosfi); Irmss.toCharArray(Irmsprintout,6); // Zamiana zmiennej lancuchowej na tablice znakow Vrmss.toCharArray(Vrmsprintout,6); Czynnas.toCharArray(Czynnaprintout,6); Pozornas.toCharArray(Pozornaprintout,6); Cosfis.toCharArray(Cosfiprintout,6); TFTscreen.stroke(255,255,255); TFTscreen.text(Irmsprintout, 60, 0); TFTscreen.text(Vrmsprintout, 60, 20); TFTscreen.text(Czynnaprintout, 60, 40); TFTscreen.text(Pozornaprintout, 60, 60); TFTscreen.text(Cosfiprintout, 60, 80); delay(1000); TFTscreen.stroke(0,0,0); TFTscreen.text(Irmsprintout, 60, 0); TFTscreen.text(Vrmsprintout, 60, 20); TFTscreen.text(Czynnaprintout, 60, 40); TFTscreen.text(Pozornaprintout, 60, 60); TFTscreen.text(Cosfiprintout, 60, 80); //emon1.serialprint(); // Print out all variables DateTime now = RTC.now(); unsigned long czasunix = now.unixtime();//ilosc sekund od 01.01.1970 00:00:00 (UNIX epoch) String daneNaKarte =""; //deklaracja napisu ktory zostanie wyslany na karte SD jako 1 linia if (now.day() < 10){ daneNaKarte += "0"; //Jesli dzien jest liczba jednocyfrowa dodaj poprzedzajace 0 } daneNaKarte += now.day(); daneNaKarte += "-"; if (now.month() < 10){ daneNaKarte += "0"; } daneNaKarte += now.month(); daneNaKarte += "-"; daneNaKarte += now.year(); daneNaKarte += ","; if (now.hour() < 10){ daneNaKarte += "0"; } daneNaKarte += now.hour(); daneNaKarte += ":"; if (now.minute() < 10){ daneNaKarte += "0"; } daneNaKarte += now.minute(); daneNaKarte += ":"; if (now.second() < 10){ daneNaKarte += "0"; } daneNaKarte += now.second(); daneNaKarte += ","; daneNaKarte += Irmss; daneNaKarte += ","; daneNaKarte += Vrmss; daneNaKarte += ","; daneNaKarte += Czynnas; daneNaKarte += ","; daneNaKarte += Pozornas; daneNaKarte += ","; daneNaKarte += Cosfis; File dataFile = SD.open("dane.txt", FILE_WRITE); //otwarcie pliku dane.txt do zapisu if (dataFile) { dataFile.println(daneNaKarte); //dopisanie linii z wynikami dataFile.close(); //zamkniecie pliku Serial.println(daneNaKarte); //wyslanie kopii danych na wirt. port szeregowy } else { Serial.println("Blad otwarcia pliku dane.txt"); //blad jesli nie dalo sie pisac do pliku } } |
To by było na tyle. Chcę do tego dodać jeszcze bibliotekę FFT i policzyć THD, rozbudować o dodatkowe dwie fazy i tyle. Miłego korzystania :)
PS. Jeszcze kilka słów komentarza: dane na karcie są zapisane w formacie CSV – bardzo łatwo się je importuje do LibreOffice czy Excela, gnuplot też świetnie sobie z nimi daje radę. Zachęcam do używania tego ostatniego bo jedynie on poradził sobie u mnie z taką ilością rekordów. Excel i LO wysiadły. Jeśli ktoś koniecznie chce z nich korzystać to bezpieczniej ustawić próbkowanie rzadziej, żeby ilość pomiarów była mniejsza. I jeszcze słówko o kalibracji: w kodzie łatwo znaleźć kalibrację prądu i napięcia z przesunięciem fazowym. Najlepiej to zrobić mając dokładny miernik prądu i napięcia oraz czysto rezystancyjne obciążenie. Ustawiamy współczynniki kalibrujące aby wszystko grało, czyli cos fi ma być wtedy równy 1, napięcie i prąd zgodne ze wskazaniami mierników wzorcowych. Rozdzielczość pomiarowa: 10-bitowe przetworniki w Arduino dają w moim przypadku rozdzielczość ok. 0.5V i 30mA. Urządzenie jest mało dokładne dla małych prądów (powiedzmy poniżej 0.5A) ze względu na nieliniowość charakterystyki magnesowania rdzenia cęg dietza. Trzeba też zwrócić uwagę na dokładne ich zapięcie na przewodzie bo jeśli będą źle zatrzaśnięte to błąd może wynieść nawet kilkadziesiąt procent.
Użycie Arduino to nie DIY
Jak najbardziej DIY. Arduino, to tylko płytka, którą trzeba z głową podłączyć i zaprogramować.
Ja w swoich projektach wykorzystam przekształcone paperduino (przynajmniej mam taki plan) i wtedy nikt się nie będzie czepiał ;))
a co miał scalaki z krzemu sobie w domu odlać?
tak samo jak używanie młotka i piły kupionych w sklepie?
Pisanie takich głupot to nie DIY
Bo jakbym sobie to wydłubał w assemblerze to by było DIY? Ja po prostu używam wygodniejszego młotka. ;)
Bo Ty tak powiedziałeś ?
Twoja argumentacja jest przytłaczająca ;)
Ode mnie 5/5 – pomysł, realizacja programowo-sprzętowa, obudowa i nawet działa: czyli wszystko co tygrysy potrzebują. Drobna uwaga ode mnie: moje podejście jest takie, że najpierw robię prototyp na Arduino, a wersję finalną buduje na gołym kontrolerze. Oczywiście wymaga to więcej nakładu sił i środków (projekt płytki, lutowanie itp), ale IMHO warto. Po prostu szkoda używanie całego Arduino256 i robienia projektu docelowego na kabelkach :-)
Najpierw muszę to doprowadzić do końca bo nie wiem czy do wyliczenia THD z zadowalającą szybkością (dla 3 faz) wystarczy 2560 czy będę musiał zaprząc jakieś Raspberry. Seryjna produkcja toto nie będzie, potrzebny mi jeden egzemplarz do realizacji paru zleceń. Chodzi mi co prawda po głowie jeszcze kilka pomysłów na wykorzystanie układu (na przykład zabezpieczenie przed awarią na linii i wyłączenie w przypadku faz jednoimiennych, obniżenia, braku lub zawyżonego napięcia).
O ile mi wiadomo wersja Atmegi nie ma większego znaczenia, mają taki sam zegar i mniej lub więcej I/O. Nie znam bibliotek to wyliczania THD, ale wydaje mi się (podkreślam: wydaje) że powinno dać radę. Zobacz czy aby zapisy na kartę SD nie zwalniają układu.
Przy tej częstotliwości zapisu na pewno nieco zwalniają. Samo obliczenie wartości skutecznych i mocy też nieco zajmuje (wylicza to z wartości chwilowych). Przy liczeniu THD o moc obliczeniową się nie boję (zawsze można robić pomiar rzadziej), boję się o ilość pamięci (szkic już teraz zajmuje 32kB a to tylko trochę dodawania i mnożenia).
Wydaje mi się że taka Atmega na pewno da radę, tylko trzeba napisać kod tak żeby zapis na SD nie był blokujący to jedno i robią na gołym kontrolerze pozbywa się otoczki Arduino (kod będzie mniejszy i szybszy) oraz możemy taktować mikroprocesor np. 20Mhz do nawet 24Mhz, większość AVR spokojnie daje radę tyle polecieć.
Ech, zdaje się, że trzeba sobie będzie przypomnieć czyste C.
Polecam książkę Mirosława Kardaś od Atnela, szczególnie rozdział 8.4 Wstęp do systemów czasu rzeczywistego w tym konkretny problemie na pewno się przyda.
To jeszcze nie na moją głowę ^_^
Właśnie przed chwilą dotarły moje cęgi. zamówiłem je chwilę po tym, jak zobaczyłem na G+ Twój status z informacją o tym projekcie ;)
Mam małą prośbę – mógłbyś nieco szerzej opisać te układy kondycjonujące? Jaka jest ich rola, jak działają, dlaczego są potrzebne?
No to na przykładzie napięcia – na wejście analogowe Arduino możesz podać sygnał 0-5V (jednokierunkowy), mierzyć chcesz powiedzmy 250V wartości skutecznej czyli amplituda to jeszcze * pierwiastek z 2 (trzeba jeszcze wziąć pewien zapas – nawet jeśli mierzysz napięcie fazowe to przy dużej asymetrii obciążenia lub opalonym przewodzie neutralnym napięcie może skoczyć do wartości napięcia międzyfazowego). Po zastosowaniu transformatora 230/5V masz na wyjściu wartość skuteczną ok. 5V czyli amplitudę nieco ponad 7V. Jeśli sygnał ma być jednokierunkowy to trzeba jeszcze dodać składową stałą (5V z arduino). Musisz dać dzielnik napięcia, żeby podwójna amplituda nie przekroczyła 5V. Dokładność tego układu jest nieistotna, istotne jest żeby nie przekroczyć 5V wartości chwilowej na wejściu arduino. To samo z prądem. Układ jest w zasadzie liniowy dlatego jakichś dokładnych obliczeń robić nie trzeba – wszystko skoryguje kalibracja (z przesunięciem fazowym włącznie).
A, kupiłeś niebieskie cęgi czyli na wyjściu masz sygnał napięciowy (nie musisz bawić się w dobór rezystora obciążającego – jest już wbudowany).
Też myślałem nad tym ale trochę na innej zasadzie, wszystkie obecnie liczniki elektroniczne mają albo wyjście impulsowe albo nawet diodę gdzie jest 1000 impulsów na 1KW, myślałem nad przesłaniem tego bezprzewodowo jednak jestem zielony jak chodzi o pisanie kodu.
Witam serdecznie, szukam kogoś(najchętniej z Wrocławia i okolic), kto pomoże mi w zbudowaniu takiego rejestratora. Wymagania i oczekiwania proszę najchętniej przesłać na emial. Byłoby mi miło gdyby również wyjaśnić mi kilka kwestii podczas montażu takie rejestratora jak również jak podłączyć ten rejestrator do sieci elektrycznej.
zerżnięte z
http://openenergymonitor.org/emon/buildingblocks/measuring-voltage-with-an-acac-power-adapter
hej jenot odezwij się do mnie mam dla ciebie ciekawy projekt do wykonania ze stałymi zleceniami
Przydalby sie rejestrator 3-fazowy… ktos cos? :)
Witam a ja potrzebuje własnie coś podobnego na parametry multimetra tzn woltomierz miernik amperomierz gorzej u mnie z programowaniem z podlączeniem elektroniki dam rade ktoś mi napisze program
Witam, pytanie mam następujące. Czy do projektu wystarczy ATMEGA328P jak w UNO ?
Udało się zrobić układ dla 3 faz ?
Trafo nawet nieobciążone pobiera prąd jałowy, który powoduje pewne przesunięcie fazowe po stronie wtórnej.
Zostało to uwzględnione?