Skocz do zawartości

Licznik czasu pracy urządzenia


Pomocna odpowiedź

Napisano

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);
}

!

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

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ść 🙄

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

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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...