Aktywne Wpisy
Kagernak +431
Wizyta Dudy i Tuska w Waszyngtonie, ja to olewałem bo uważałem, że to tylko kurtuazyjna wizyta lub po prostu Amerykanie chcą nas pouczyć, tak też widziałem w różnych przewidywaniach co to będzie. Parę minut temu patrzę sobie co tam nudnego powiedzieli.
A tu Biden...
JEB 2 MILIARDY POŻYCZKI! MAMY TEŻ PRAWIE 100 SZTUK HELIKOPTERÓW NA SPRZEDAŻ! CO? MAŁO? A MACIE JESZCZE 1700 RAKIET Z CZEGO KILKASET O TAKIM ZASIĘGU, ŻE OSTRZELAĆ SOBIE
A tu Biden...
JEB 2 MILIARDY POŻYCZKI! MAMY TEŻ PRAWIE 100 SZTUK HELIKOPTERÓW NA SPRZEDAŻ! CO? MAŁO? A MACIE JESZCZE 1700 RAKIET Z CZEGO KILKASET O TAKIM ZASIĘGU, ŻE OSTRZELAĆ SOBIE
polock +216
Komputerek liczy spalanie, prędkość, ilość przejechanych kilometrów i takie tam. Wyniki są całkiem dokładne np. ilość przejechanych kilometrów. Problem jest z wyświetlaniem prędkość czy spalania.
Chodzi o to, że, np. jadąc ze stałą prędkością 60km/h, arduino pokazuje mi te 60km/h ale co chwilę to się zmienia i pokazuje nagle 63km/h później przez chwilę znowu 60km/h i nagle 63km/h.
Wiem że problem leży w metodzie obliczania prędkości.
Arduiino zlicza ilość impulsów w ciągu sekundy i z tego oblicza prędkość, a że w sekundzie zmieści się 100 impulsów a raz 101 więc stąd te zmiany w wyświetlanej prędkości.
Zna ktoś jakiś sposób aby te obliczenia były bardziej dokładne, czy chociaż żeby na wyświetlaczu wyglądało to przyzwoicie?
Próbowałem moving average ale zmiany nadal występowały tylko były wolniejsze.
Tu jest oryginalny kod jak i projekt:
https://www.instructables.com/id/How-to-Build-a-Bi-Fuel-LPG-Unleaded-Trip-Computer-/
#arduino #sterowniki #forbot #matematyka #zainteresowania #diy #samochody #majsterkowanie #programista15k #programowanie #elektronika #pomocy #codeschool #naukaprogramowania
Komentarz usunięty przez autora
Jeśli problemem jest nierówne próbkowanie to powinno pomóc. Jeśli problemem jest błąd pomiaru to musisz kombinować z ruchomą średnią (pobaw się parametrami).
I tak - ruchoma średnia zawsze zwiększa czas reakcji wyświetlacza na pomiar, więc przy przyśpieszaniu czy
Każdy impuls wywołuje przerwanie, arduino go zapisuje dodaje do reszty. Co sekundę występuje ( TIMER1 overflow interrupt) które wywołuje funkcję która oblicza prędkość:
void instantSpeed()
{
speed = (vsspulsedistance * vss_pulses * 3600);
}
Ilość impulsów w ciągu sekundy razy współczynnik, razy 3600.
Cały kod na pastebin:
https://pastebin.com/UZZCgPJS
Problem wynika z tego, że ilość pulsów nie mieści się równo w sekundzie. Np masz pulsy co 0.4 sekundy jedziesz ze stałą prędkością, i dostajesz:
distance() //t=0.4
distance() //t=0.8
instantSpeed() //t=1.0 pulsów 2
distance() //t=1.2
distance() //t=1.6
distance() //t=2.0
instantSpeed() //t=2.0 pulsów 3
distance() //t=2.4
distance() //t=2.8
instantSpeed() //t=3.0 pulsów
Czas i impulsy muszą być liczone cały czas, czy mogą być
Zobacz sobie jeszcze Mpguino, bardzo podobny projekt tylko znacznie bardziej zaawansowany, kod napisany bez żadnych bibliotek, nie miałem żadnych szans
W skrócie zmieniłem:
- dodałem zmienną
last_speed_calculation_time
- dodałem ustawianie jej w setup()
- wywaliłem wywoływanie instantSpeed z obsługi przerwania timera sekundowego
- przeniosłem zerowanie vccpulses do instantSpeed()
- dodałem sprawdzanie czasu w distance(), wywoływanie instantSpeed() i uaktualnianie
last_speed_calculation_time
jak minęła sekunda- dodałem wyliczanie dt (różnicy czasu między ostatnim wywołaniem instantSpeed i aktualnym) wewnątrz distance()
- dodałem
last_speed_calculation_time
było dawniej niż np 2 albo 1.5 sekundy temu - to trzeba ustawić speed na 0.wystarczy dodać
unsigned long time = millis();
unsigned long dt = time - last_speed_calculation_time;
if (dt > 2000) { //brak impulsow przez 2s oznacza ze stoimy
speed = 0;
last_speed_calculation_time
.Prawdopodobnie błąd objawi się tym, że po 50 dniach ciągle włączonego arduino
Wszystko niby działa, dostaje wynik, tylko z jakiegoś powodu on się cały czas zmienia. Wydaje mi się że sytuacja jest analogiczna do tej z prędkością, jedyna różnica w tym że tutaj jest obliczany czas otwarcia wtryskiwacza w ciągu sekundy zamiast dodawania impulsów.
Ze zużyciem paliwa może sprawa tak wygląda, że w każdej sekundzie jest inne? Najlepiej byłoby logować gdzieś dane i policzyć ręcznie żeby sprawdzić czy dobrze wychodzi i jaki jest problem.
https://github.com/Liberator24/TRIP-COMPUTER/blob/master/Bi-TripCo_Metric_Celcius_MEGA_V3.6.ino