Marcin1922 Napisano Lipiec 1, 2021 Udostępnij Napisano Lipiec 1, 2021 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 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 1, 2021 Udostępnij Lipiec 1, 2021 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. Cytuj Link do komentarza Share on other sites More sharing options...
Marcin1922 Lipiec 1, 2021 Autor tematu Udostępnij Lipiec 1, 2021 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. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 1, 2021 Udostępnij Lipiec 1, 2021 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? 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Marcin1922 Lipiec 1, 2021 Autor tematu Udostępnij Lipiec 1, 2021 2 godziny temu, ethanak napisał: dlaczego DS1307 a nie DS3231? Taki miałem pod ręką. Szczerze mówiąc nawet nie wiem jaka jest różnica między nimi. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 1, 2021 Udostępnij Lipiec 1, 2021 Precyzja - tylko tyle. Cytuj Link do komentarza Share on other sites More sharing options...
Marcin1922 Lipiec 1, 2021 Autor tematu Udostępnij Lipiec 1, 2021 13 minut temu, ethanak napisał: Precyzja Duża jest między nimi różnica w gubieniu poprawnego casu ? Cytuj Link do komentarza Share on other sites More sharing options...
Marcin1922 Styczeń 26, 2022 Autor tematu Udostępnij Styczeń 26, 2022 (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 Styczeń 26, 2022 przez Marcin1922 Cytuj Link do komentarza Share on other sites More sharing options...
Marcin1922 Styczeń 26, 2022 Autor tematu Udostępnij Styczeń 26, 2022 @ethanak Co o tym sądzisz ? Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Styczeń 26, 2022 Udostępnij Styczeń 26, 2022 (edytowany) 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 Styczeń 26, 2022 przez farmaceuta Cytuj Link do komentarza Share on other sites More sharing options...
Marcin1922 Styczeń 27, 2022 Autor tematu Udostępnij Styczeń 27, 2022 @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 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 27, 2022 Udostępnij Styczeń 27, 2022 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ć. Cytuj Link do komentarza Share on other sites More sharing options...
Marcin1922 Styczeń 27, 2022 Autor tematu Udostępnij Styczeń 27, 2022 @ethanak Czyli jak to najlepiej rozwiązać bo sam już nw. Chcę, żeby było to możliwie najdokładniejsze ale bez większych komplikacji. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 27, 2022 Udostępnij Styczeń 27, 2022 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. Cytuj Link do komentarza Share on other sites More sharing options...
Marcin1922 Styczeń 27, 2022 Autor tematu Udostępnij Styczeń 27, 2022 @ethanak I teraz sumujesz tylko moc a nie ma obliczanie w czasie rzeczywistym ile kWh zostało pobranych i aktualizowanie jak to się dzieję na liczniku energii elektrycznej Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!