Funkcja Millis

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
Emdine
Młodszy majsterkowicz
Posty: 11
Rejestracja: 11 sie 2015, 19:29

Funkcja Millis

Post autor: Emdine » 18 sie 2015, 21:24

Hej wytłumaczy mi ktoś łopatologicznie jak dziala funkcja millis. Wiem ze zwraca liczbe milisekund ktore upłynęly od startu programu ale niestety nie potrafie sobie tego wytłumaczyc. Przeglądale kilka przykładow zastosowanie ale nic :(

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


stiven
Złota rączka
Posty: 1645
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Funkcja Millis

Post autor: stiven » 18 sie 2015, 23:39

Tak naprawdę już wiesz jak działa funkcja millis(), inaczej się tego nie wytłumaczy(bo chyba nie chodzi o to jak to się dzieje, że ta funkcja te milisekundy zwraca?). Jeśli nie rozumiesz wykorzystania millis() w przykładach, to już inna sprawa. Po prostu jest to brak doświadczenia w programowaniu. Więc ewentualnie musiałbyś dać jakiś konkretny przykład i ktoś może ci wytłumaczyć jak millis() jest wykorzystane w danym przypadku. Najczęściej wykorzystuje się millis(), kiedy chce się, żeby coś zostało wykonane po określonym czasie od jakiegoś innego zdarzenia. No i wiedząc co zwraca millis() i wykorzystując instrukcje i pętle języka C/C++ rozwiązuje się dany problem/przypadek.
Awatar użytkownika
Karl
Majsterkowicz
Posty: 64
Rejestracja: 3 gru 2014, 10:00

Re: Funkcja Millis

Post autor: Karl » 19 sie 2015, 08:59

A można używać millis do mierzenia czasu między zdarzeniami ?
np. stan wysoki uruchamia odliczanie, kolejny zwraca wartość "upłyniętych millisów"
lukasz
Majsterkowicz
Posty: 59
Rejestracja: 21 sty 2014, 21:02

Re: Funkcja Millis

Post autor: lukasz » 19 sie 2015, 09:12

Pewnie, przy pierwszym wywołaniu przypisz aktualny czas do zmiennej a w drugim kroku po prostu odejmujesz i masz czas pomiędzy dwoma zdarzeniami.

Wysłane z mojego LG-D605 przy użyciu Tapatalka
stiven
Złota rączka
Posty: 1645
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Funkcja Millis

Post autor: stiven » 19 sie 2015, 09:42

Tak, można. Ostatnio tutaj podobny program napisałem:
http://majsterkowo.pl/forum/opoznienie- ... tml#p24071

Kod: Zaznacz cały

boolean tak = 0;
unsigned long czas= millis();

void setup() {
  pinMode(7, OUTPUT);
  pinMode(1, INPUT_PULLUP);
  digitalWrite(7, LOW);
}

void loop()
{
  if(digitalRead(1)==LOW && tak == 0)
  {
    delay(50);
   tak = 1;
    czas = millis();
  }
  
  if(digitalRead(1)==HIGH)
  {
    delay(50);
    tak = 0;
  }
  
  if(tak == 1 && millis() - czas > 4000)
  {
    digitalWrite(7, HIGH);
    delay(2000);
    digitalWrite(7, LOW);
    delay(2000);
  }
  else digitalWrite(7, LOW);

}
Jeśli wciśnięcie przycisku trwa powyżej 4 sekund, to coś jest wykonywane. Ta zmienna "tak", jest tam po to, żeby odczytany czas został tylko raz, zaraz po naduszeniu przycisku (warunek w pierwszym ifie). Przy okazji dzięki też tej zmiennej ten trzeci if jest tak napisany, że przyciśnięcie może trwać dłużej, a reakcja będzie po 4 sekundach, a nie na przykład dopiero po puszczeniu przycisku. Delay(50) w pierwszym ifie jest tam dlatego, że w krótkim czasie po naduszeniu przycisku stan na wejściu kilka razy zmienia się zanim będzie ten właściwy już do końca wciśnięcia przycisku. Czyli ten delay ma za zadanie przeczekania tego momentu. Właściwie w tym drugim ifie chyba niepotrzebnie dałem też delay, ale to jest na tyle krotko, że nie będzie wpływać na działanie programu
ODPOWIEDZ

Strony partnerskie: