Skocz do zawartości

Licznik czasu pracy urządzenia


ballic

Pomocna odpowiedź

Cześć jestem tutaj nowy mam na imię Dawid i mam problem z kodem główne założenia projektu są proste

gdy wyzwolę wejście (przycisk) jest liczony czas za pomocą millis który w późniejszej części kodu będę zamieniał na s, m, g, d, po prostu chce wiedzieć ile czasu dane urządzenie pracuje. Mój problem polega na tym że po uzyskaniu 5s (tyle wynosi u mnie minuta) czas s nie resetuje sie i nie liczy znowu od 0 proszę o pomoc bo już włosy z głowy wyrywam od kilku dni 🙂

pod poniżej

#include <EEPROM.h>
unsigned long  start; 
unsigned long  finished;
unsigned long elapsed;
int przycisk = 3;
int s=0;
int m=0;
int g=0;
int d=0;
int sek=0;




void setup()
{
Serial.begin(9600);
pinMode(przycisk, INPUT);
digitalWrite(przycisk, HIGH);

}
void loop(){



if (digitalRead(przycisk)==HIGH)
{
 start = millis();
Serial.print("HIGH -> LOW: ");
}


else { 
finished = millis();
elapsed = (finished/1000) - (start/1000);
Serial.print("LOW -> HIGH: ");
Serial.print(s);
Serial.println("sekund");
}

s=elapsed;
delay(58);


if(s==5){
 s=0;
 m++;
 }


Serial.print("sekundy  ");
Serial.println(s);
Serial.print("minuty  ");
Serial.println(m);
Serial.print("elapsed  ");
delay(1000);
}

!

Link do komentarza
Share on other sites

Pętla loop wykonuje się cały czas, a kod, który masz w obu gałęziach polecenia "if" wykonuje się za każdym obrotem tej pętli — jedna lub druga gałąź, w zależności od tego czy przycisk jest wciśnięty czy nie. Wydaje mi się, że pisząc ten program założyłeś, że polecenia wewnątrz if wykonają się tylko raz przy zmianie z wciśniętego na na zwolniony i vice versa, ale tak nie jest.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

rozumiem cię w 50 % jednak nie widze rozwiązania mam wyciąć wszystko z void loop i wkleić np do void pomiar ?

ps jestem świeżakiem w programowaniu dlatego niektóre rzeczy ciężko mi zrozumieć prosze o wyrozumiałość 🙄

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

Przykładowo:

Przycisk jest wciśnięty - czyli pin w stanie LOW.

Przycisk został wciśnięty - pin poprzednio był w stanie HIGH, teraz jest w LOW.

Musisz zapamiętać stan przycisku, i przy następnym obrocie pętli porównać go z bieżącym. Bierzesz pod uwagę wyłącznie zmiany stanu.

  • Lubię! 1
Link do komentarza
Share on other sites

Funkcja millis() pozwala na zliczenie do około 50 dni. Wg tego programu nic się nie wydarzy ze zmiennymi sekundy, minuty, godziny, dni bo program tylko sprawdza czy odliczanie się skończyło, a nie czy np. minęła 1s. W przykładach Arduino jest blinkwithoutdelay, wg tego przykładu można sobie odpalić zliczanie sekund zamiast/oprócz migania LED, nigdy nie pisz też że jak 5s to ma się coś wydarzyć, bo co jak akurat siedziałeś na jakimś delayu/długiej funkcji - przegapiłeś, może spóźniłeś się o 1ms i już nie minie sekunda?Dlatego też w tamtym przykładzie jest dla tiku sekundy if(czasteraz-czaspoprzedni>=1000) ojejminęłasekunda;

Logika powinna wyglądać tak:

uint8_t flaga1,flaga2; 
uint32_t czasStart,czasStop,sekundy;
const int przycisk=A0;

void setup() {

Serial.begin(9600);
pinMode(przycisk,INPUT_PULLUP);

}

void loop() {

if(!digitalRead(przycisk)) flaga1=1; //sprawdzenie stanu przycisku, jeśli 0 wcisniety, uwaga - flaga1 ustawiam na 1
else flaga1=0;


//jesli przycisk jest wcisniety i poprzednio nie byl to rozpoczynamy zliczanie sekund
if(flaga1 && !flaga2)
czasStart=millis();

//jesli przycisk nie jest wcisniety i poprzednio   byl to konczymy zliczanie zliczanie 
if(!flaga1 && flaga2)
{
czasStop=millis();
sekundy=(czasStop-czasStart)/1000;
Serial.print("Przycisk byl wcisniety przez: "); 
Serial.print(sekundy); 
Serial.println("s" ); 
}

//aktualny stan przycisku przypisujemy do wartosci poprzedniego stanu
flaga2=flaga1;

}

Natomiast konstrukcja taka to bida, jeśli wystarczy zliczanie sekund to korzystając z tych warunków odpalasz to jak w miganiu led bez delay, sprawdzasz czy wciśnięty, jeśli wcześniej nie był to zerujesz liczniki i rozpoczynasz zliczanie, dopóki wciśnięty dalej zliczasz piki s, po 60 zerujesz s zwiększasz minuty itd. Odpalanie/zerowanie powinno być opóźnione o czas drgania styków - przy włączeniu i wyłączeniu przycisku. Każdy delay zakłóci poprawność zliczania czasu, jeśli akurat wciskasz klawisz na delay(1000) to procek nic o tym nie wie dopóki ta funkcja trwa.

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.