Skocz do zawartości
dexter1234

Arduino jako licznik motogodzin

Pomocna odpowiedź

Witam wszystkich i oczywiście pozdrawiam ,jestem tu nowy więc za jakie kolwiek błędy przepraszam . Mam taki temat czy da się na arduino zbudować licznik motogodzin przebiegu całkowitego który nie będzie gubił pamięci po odłączeniu zasilania i przebiegu dziennego z możliwością kasowania? Jeśli tak to poproszę o jakieś wskazówki . Wszystkim pomocnym z góry dziękuje.

Udostępnij ten post


Link to post
Share on other sites

@dexter1234 Witam na forum 🙂 

Żeby nie stracić informacji o przebiegu możesz zapisać reprezentujące je dane liczbowe do pamięci nieulotnej. Albo karta SD wpięta po SPI, albo do pamięci wewnętrznej EEPROM (albo zewnętrznej również z SPI). Problem jest w ograniczonej liczbie cyklów zapisu - okolo 100tyś dla EEPROM. Czyli zapisywanie co minutę może nie być najlepszym pomysłem (zapisując coś co minutę, 2 godziny dziennie wyczerpiesz limit po 2 latach).

Lepszym pomysłem może być zapisywanie tylko wtedy kiedy będzie to konieczne. Może np. zrób układ podtrzymujący zasilanie dla Arduino - ogniwo litowe z ładowarką, w momencie wykrycia spadku napięcia na zasilaniu, pomiary zapisywane są do EEPROMU, a następnie dodatkowe zasilanie się odłącza.

 

Udostępnij ten post


Link to post
Share on other sites

tak wiem , mam podłaczony pod spi moduł zegarka z pamiecią 24c32  tylko nie ogarniam pisania programu aby czas był naliczany w momencie pojawienia sie stanu wysokiego na którymś wejsciu i w razie potrzeby skasowany po wcisnieciu jakegoś  switcha a zarazem nie gubił po wyłączeniu zasilania  . Dlatego tu moja prośba o pomoc

Udostępnij ten post


Link to post
Share on other sites
Dnia 18.02.2020 o 10:18, dexter1234 napisał:

Mam taki temat czy da się na arduino zbudować licznik motogodzin przebiegu całkowitego

Napisz coś więcej o budowanym urządzeniu, pokaż jego schemat.

 

46 minut temu, dexter1234 napisał:

tylko nie ogarniam pisania programu

Co to znaczy? Czy nie wiesz jak ma działać program, czy nie potrafisz swojego "pomysłu na program" czyli algorytmu przełożyć na kod źródłowy C/C++?

Pokaż co do tej pory zrobiłeś. Wiele osób od razu siada przed klawiaturą i próbuje pisać swoje programy. Warto jednak (sam się o tym przekonałem) czasami rozpocząć od stworzenia algorytmu programu czyli swoistego przepisu według, którego program ma działać. Taki algorytm można, a nawet trzeba sobie rozpisać, a najlepiej rozrysować. Widząc swój algorytm będziesz w stanie go przeanalizować i zoptymalizować. Kolejny krok to zapisanie swojego algorytmu w języku programowania.

Udostępnij ten post


Link to post
Share on other sites

niestety jestem zielony i dopiero się uczę wiec odpowiem że nie mam pomysłu jak się do tego zabrać 

to ma być urządzenie do maszyny przemysłowej taki mały komputerek który będzie pokazywał obroty silnika , napięcie ładowania alternatora , ciśnienie oleju silnika , temperaturę wody no i z tym nie mam problemu ale ma też być licznikiem motogodzin przebiegu całkowitego maszyny i przebiegu dziennego którego da się skasować jakimś switchem 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
1 godzinę temu, dexter1234 napisał:

mam podłaczony pod spi moduł zegarka z pamiecią 24c32

Czyli projekt układu już chyba posiadasz. Pokaż ten projekt bo na razie tylko wiemy, że masz bliżej nieznany moduł RTC z pamięcią 24c32. Tylko nie wiemy (bo tego nie pokazujesz i o tym nie piszesz) dlaczego właśnie taki moduł, jakie ma pełnić funkcje w twoim urządzeniu itd.

Nikomu nie będzie się chciało zgadywać jak zbudowane jest to urządzenie. Pokaż je i opisz. Wtedy będzie łatwiej coś doradzić. Moim zdaniem trudno mówić o programowaniu urządzenia gdy nie wiemy jak jest ono zbudowane.

Pytanie zasadnicze moim zdaniem to - czego czas pracy ma być rejestrowany przez Arduino i skąd "Arduino ma wiedzieć", że urządzenie pracuje?

Edytowano przez Belferek

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, dexter1234 napisał:

aby czas był naliczany w momencie pojawienia sie stanu wysokiego na którymś wejsciu

Czyli algorytm zapisywania czasu włączenia i wyłączenia mógłby wyglądać np. tak:

1. Pobierz stan wejścia (digitalRead())

2. Jeśli to stan LOW (wyłączone) to 7

3. Urządzenie pracuje.

4. Jeśli urządzenie włączono wcześniej to 1

5. Zapamiętaj, że urządzenie zostało włączone.

6. Zapisz czas włączenia i 1

7. Urządzenie wyłączone.

8. Jeśli wyłączono wcześniej to 1

9 Zapamiętaj, że zostało wyłączone.

10. Zapisz czas wyłączenia i 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
1 godzinę temu, dexter1234 napisał:

mam podłaczony pod spi moduł zegarka z pamiecią 24c32

Wygląda na to że masz coś takiego, co nie? RTC DS1307

1 godzinę temu, dexter1234 napisał:

aby czas był naliczany w momencie pojawienia sie stanu wysokiego na którymś wejsciu i w razie potrzeby skasowany po wcisnieciu jakegoś

Poczytaj o przerwaniach - zdarzeniach wywołanych np. wciśnięciem przycisku. W funkcji obsługi przerwania ustaw jakąś flagę (zmienną int, bool) która informuje że zliczamy czas i pobierz z zegara RTC aktualny czas, np. w sekundach ile tam sobie już uzbierał (interesuje nas różnica czasów). Możesz to zapisać do EEPROM, w sytuacji gdy padnie zasilanie to po wznowieniu, w bloku setup() odczytasz ostatnie dane z EEPROMu. Jak wciśniesz kolejny raz przycisk, sprawdzisz jaki jest stan tej flagi, odczytasz nowy czas, wyliczysz różnicę i gotowe.

Edit:

@Belferek pisaliśmy w tym samym czasie 🙂 

Edytowano przez Gieneq

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
#define URZADZENIE 2        //na tym pinie stan HIGH oznacza wlaczone urzadzenie
boolean stan_urzadzenia;    //true jesli wlaczone false jesli wylaczone

void zapiszCzas_ON()  
{
  //funkcja zapisuje czas wlaczenia np. w EEPROM
}

void zapiszCzas_OFF()
{
  //funkcja zapisuje czas wylaczenia np. w EEPROM
}
//--------------------------------------------------------------------------
void setup() 
{
 pinMode(URZADZENIE,INPUT_PULLUP);
 stan_urzadzenia=false;
}
//--------------------------------------------------------------------------
void loop() 
{
  if(digitalRead(URZADZENIE)==HIGH)   //sprawdzamy stan URZADZENIA     (1)
    {                                 //urzadzenie jest wlaczone       (3)
      if(stan_urzadzenia==false)      //urzadzenie bylo wylaczone
        {
          stan_urzadzenia=true;       //zapamietaj, ze wlaczono        (5)
          zapiszCzas_ON();            //zapisz czas wlaczenia          (6)
        }
    }
  else                                //(2)           
    {                                 //urzadzenie wylaczone (7)
      if(stan_urzadzenia==true)       //urzadzenie bylo wlaczone
        {
          stan_urzadzenia=false;      //zapamietaj, ze wylaczono       (9)
          zapiszCzas_OFF();           //zapisz czas wylaczenia         (10)
        }
    }
}

Tak mógłby wyglądać jeden z szablonów Twojego programu - nie uwzględnia przycisku i innych drobiazgów 🙂

Edytowano przez Belferek
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

zestaw arduino uno orginał , lcd 4x16  blue  ,  RTC  DS3231 . Dzisiaj po pracy przysiądę i wrzucę ten screan , zobaczymy co z tego wyjdzie . Jeszcze raz bardzo dziekuje wszystkim za zainteresowanie i pomoc, pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Witam ponownie po wgraniu  screena eprom  nalicza i zapisuje ale po ponownym uruchomieniu (czyli stanu HIGH na wej.) nie zaczyna liczyć od zapamietanego czasu tylko liczy od czasu rzeczywistego zegara no i brak funkcji resetowania licznika

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
46 minut temu, dexter1234 napisał:

ale po ponownym uruchomieniu (czyli stanu HIGH na wej.) nie zaczyna liczyć od zapamietanego czasu

Bo pokazany szablon tego nie uwzględnia. Tutaj sam popracuj nad programem i pokaż co wymyśliłeś. Może warto zapamiętać w eeprom ostatni stan_urzadzenia? Warto zastanowić się nad tym jaka maksymalna może być "przerwa" w zasilaniu by potraktować ją jako "ciągłość pracy"? Tu będziesz musiał porównać czas bieżący z RTC z ostatnio zapisanym.

Nie wiem jakiej używasz biblioteki do obsługi swojego RTC. Ja bym polecał RTC by Makuna (https://github.com/Makuna/Rtc)

Autor udostępnia obszerne WIKI na temat swojego produktu - https://github.com/Makuna/Rtc/wiki

Edytowano przez Belferek

Udostępnij ten post


Link to post
Share on other sites

czarna magia dla mnie no cóż muszę się doszkolić ale dziękuje jak na coś wpadnę dam znać

Udostępnij ten post


Link to post
Share on other sites

Tu nie ma czarnej magii - wróć do algorytmu. Nie musisz umieć programować by ustalić "przepis" (algorytm) na to jak program ma działać. Pokaż swój przepis - pomysł wtedy spróbujemy zamienić go na działający program.

Udostępnij ten post


Link to post
Share on other sites

ok 

algorytm chyba rozumiem ale co z rozpoczęciem naliczania czasu od wartości na której się zatrzymał ?

Udostępnij ten post


Link to post
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!

Gość
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...