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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.