Skocz do zawartości

Obliczanie kW/h


Marcin1922

Pomocna odpowiedź

Witam, mam problem z obliczaniem kW/h w moim układzie a mianowicie mam zbudowany układ pomiarowy który mierzy U,I,P . W układzie mam moduł czasu rzeczywistego ds1307 . Dane obliczane przez układ są typu double. Mam problem z ciągłym obliczaniem kwh ponieważ miałem zrobione to tak: (kod), ale po kilku godzinach pracy program się wysypuje myślę że przepełnia się sumamocyP. Czas może można by pobierać z ds1307 a nie opierać go o millis sam już nw jak to poprawić.

unsigned long czas;

unsigned long licznikzapisu;

reszta zmiennych double;

licznikzapisu = licznikzapisu + 1;

czas = millis()- 20000 ; // określanie czasu pracy układu do zapisu danych  
czasgodziny = czas / 3600000;     // przeliczenie czasu pracy na godziny 
Pprzypisane= aCzynna;         // przypisanie Pa wartości mocy czynnej
sumamocyP = sumamocyP + Pprzypisane;       // sumowanie kolejnych odczytów mocy czynnej
mocpodzielonaprzeziloscsumowania = sumamocyP/ licznikzapisu;   // suma mocy czynnej podzelone przez ilość próbkowania
KWh = mocpodzielonaprzeziloscsumowania * czasgodziny /1000;     // oblicznie KW/h 

 

Link do komentarza
Share on other sites

51 minut temu, Marcin1922 napisał:

Dane obliczane przez układ są typu double.

Rozumiem że to Arduino? No to double jest niestety tym samym co float. Ja bym raczej użył uint64_t (jeśli 32-bitowy int nie wystarczy), usunął czasogodziny (można liczyć w milisekundach lub sekundach, wtedy nie są potrzebne typy zmiennoprzecinkowe) a przeliczenie z kilowatosekund (czy jak tam to nazwiesz) na kWh dał w ostatniej linii kodu.

Link do komentarza
Share on other sites

4 minuty temu, ethanak napisał:

uint64_t

ale do mocy musi być moim zdaniem zmiennaprzecinkowa wartość ponieważ będzie się robić z czasem dość duża rozbieżność wartości zapisanej a rzeczywistyą wartością jaka powinna być . Pomiar  ma być wykonywany w długim okresie czasu np parę miesięcy . Układ to arduino tak dokładnie mega.

Link do komentarza
Share on other sites

59 minut temu, Marcin1922 napisał:

do mocy musi być moim zdaniem zmiennaprzecinkowa wartość

Niekoniecznie, może być stałoprzecinkowa (np 32.32). Może być jakiś większy integer pod warunkiem zmiany jednostki (zamiast kilowatów dajesz mikrowaty i już masz dziewięć miejsc, a wątpię aby Twoje przetworniki pracowały z taką dokładnością). Możliwości jest mnóstwo włącznie ze zmianą Arduino na coś bardziej nadającego się do trzymania włączonego urządzenia przez kilka miesięcy (np 32-bitowy licznik millis() zdąży Ci się w tym czasie parę razy przekręcić, a przykładowo w RPi Pico 64-bitowy licznik mikrosekund raczej nie ma szans da dobicie do końca zakresu).

A tak z ciekawości: dlaczego DS1307 a nie DS3231?

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Zmieniłem trochę obliczanie kWh ale coś nie funkcjonuję jak powinno , może ktoś spojrzeć co jest nie tak? 

 unsigned long hh

unsigned long h

unsigned long KWha

 unsigned long KWhaaa

 unsigned long Pa // waty pobierane w danej chwili 

double KWhaa

hh = millis()-h;
KWha=Pa/hh/36;
KWhaaa = KWha +KWhaaa;
h = millis(); 
KWhaa= KWhaaa/100000;

 

Edytowano przez Marcin1922
Link do komentarza
Share on other sites

Nie rzutujesz wyniku na double...wiec otrzymujesz tylko calosci typu 1/2/3/4 itp...a spruboj tak 

KWhaa= (double)KWhaaa/100000;

Edit...nie rozumiem tez tych obliczen...skoro masz watty to wystarczy podzielic przez 1000 i juz masz w kwh...a jesli chcesz liczyc jakies odcinki czasu to co sekunde na przyklad, dodajesz nowy wynik do starego i np. po godzinie masz calkowity pobor pradu...

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

@farmaceuta  Nadal to nie działa. W sensie mógłbyś bardziej przybliżyć jak byś to widział inaczej. W układzie jest moduł czasu rzeczywistego więc godziny minuty czy sekundy można wywoływać jak np. minuty now.minute. Chciałem oprzeć to na millis bo program potrzebuje czasami 1 a czasami 3 s by obliczyć zmienne i zapisać je na kartę. Tylko z tymi kWh mam casły czas problem 

 

Link do komentarza
Share on other sites

1 godzinę temu, Marcin1922 napisał:

Chciałem oprzeć to na millis

mając zegarek? Poza tym zmiana z float (bo double przecież nie istnieją) na typ stałoprzecinkowy to nie po prostu zmiana typu, ale zmiana sposobu liczenia.

Przy okazji - wszystko zależy od dokładności z jaką mierzysz i jaką chcesz uzyskać.

Link do komentarza
Share on other sites

1 minutę temu, Marcin1922 napisał:

Chcę, żeby było to możliwie najdokładniejsze

Możesz to jakoś bliżej określić?

Dam Ci przykład - powiedzmy że moc chwilową masz jako float w watach.
 

uint32_t sumamocy; //
uint32_t mocmw;
float mocp;	// Arduino nie ma double

...

mocmw = 1000 * mocp; // moc w miliwatach jako int
sumamocy  += mocmw;

// i tak dalej

Wszędzie w programie operujesz miliwatami, ew. zwiększając dla bezpieczeństwa typ danych na uint64_t. Dopiero przed samym wyświetleniem zmieniasz na waty.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.