Skocz do zawartości

Działanie millis i delay - rozważania o odmierzaniu czasu


narbej

Pomocna odpowiedź

time, ale teraz nie mogę znaleźć skąt ją wziąłem. Wydaje mi się, że z githuba. W każdym razie wyszukiwałem w googlach i jakoś trafiłem chyba na to [playground]: http://playground.arduino.cc/Code/dateTime

W dokumentacji opisane są wszystkie funkcje ale nie znalazłem opisu co trzeba wpisać do adjustTime().

Link do komentarza
Share on other sites

48 minut temu, narbej napisał:

nie znalazłem opisu co trzeba wpisać do adjustTime()

Opis jest - tu

Ja w swoim zegarku (na NodeMCU) utworzyłem zegar programowy na bazie os_timer synchronizowany przez RTC (DS3231), NTP i DCF-77 🙂

zegar.jpg

Cały czas nad tym pracuję.

Edytowano przez Belferek
Link do komentarza
Share on other sites

Ta bibliotek pozwala synchronizować czas z RTC, NTS, z GPS i zjeszcze kilku innymi wzorcami czasu. Ale nie chcę mieć super dokładnego czasu, porównywalnego z czasem atomowym używanym przez astronomów. Na razie mam prawie zupełnie "gołe" arduino i chciałbym ewentualnie zupełnie "ręcznie", lub ewentualnie wykorzystując taką czy inną [prostą] bibliotekę po prostu wyświetlać czas, maksymalnie do 50 dni z dokładnością powiedzmy do sekundy. Czyli 1/50 na dobe, a mam ze sto razy gorzej. Śpieszy ok 2 min na 12  godzin. Właśnie przeglądałem jakiś projekt zegarka tu na forum, gdzie do mierzenia czasu wykorzystana jest funkcja millis() i wartość 1000. Możliwe, że to tylko mój egzemplarz UNO jest taki niedokładny. Można też wziąść zamiast 1000 --> 1001, ale wtedy może być znowu za wolny [zegarek]. Wtedy jest jeszcze funkcja micros(), ale to już nie na dzisiaj 😉 

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

Z tą sekundą na 50 dni, to tylko taki mój strzał - pewnie wiecie dlaczego? Chodzi o przekręcenie licznika po 50 dniach. A sekunda, to faktycznie lekko przesadziłem. Już wczoraj czytająć opis proponowanego, faktycznie taniego układu RTC, zorientowałem się że przesadziłem, ale już było późno więc już nie dementowałem. Zastanawiam się, na ile moje wcześniejsze pomiary były rzetelne. Tym razem zrobiłem na ardunio zupełnie po swojemu i bez biblioteki stoper i puściłem równolegle ze stoperem na moim telefonie. Teraz, po 45 minutach była już różnica ok 13 sek. Biorąc pod uwagę trudność z dokłądnym zsynchronizowaniem startu, może to być +- .5 sek - tak myślę. [<-- tak, tam jest kropka, przed piątką ;-)]

 

Jakie mam oczekiwannia? Po prostu od ok 2 tygodni mam ardunio uno [klon] i chcę poznać jego możliwości. No i wydaje mi się, że możliwość w miarę dokładnego pomiaru czasu [+kalendarz] przyda mi się w późniejszych pomysłach zastosowania. No i chodzi o to żeby było taniej a nie drożej 😉

Link do komentarza
Share on other sites

Pomyślałem, że wcześniej powinienem w jakiś sposób sprawdzić stoper w moim telefonie i czy się czasami nie zacina jak jest w tle 😉 Bo zegarek w telefonie może być synchronizowany z zegarem w sieci nawet co minutę.

 

Co do kodu, to jest to wersja zupełnie testowa, bez guzików itd, ale:

/* www.learningbuz.com */ //zostawilem przyklad z Crystal_I2C
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//I2C pins declaration
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 

void setup() {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  digitalWrite(13, LOW);
  delay(500);
  //Serial.begin(9600);
  lcd.begin(16,2);//Defining 16 columns and 2 rows of lcd display
  //lcd.backlight();//To Power ON the back light
  lcd.setCursor(0,1); //Defining positon to write from first row,first column .
  lcd.print("00:00:00 dodam.??"); //You can write 16 Characters per line .
  lcd.home();
}

unsigned long currTime, stoper;
const unsigned long dod = 1000000;

void loop() {
  if (micros() > stoper){
    stoper += dod;
    lcd.print(micros());
    lcd.setCursor(0, 1);
    wyswietl(stoper/(60*60*dod));
    lcd.setCursor(3, 1);
    wyswietl(stoper/(60*dod)%60);
    lcd.setCursor(6,1);
    wyswietl(stoper/dod%60);
    lcd.setCursor(9.1);
    wyswietl(stoper/dod)
    lcd.home();
  }
}

void wyswietl(int co){
  if (co < 10)
  lcd.print("0");
  lcd.print(co);
}

Wziąłem przykład z biblioteki lcd crystal po I2C i komentarze są z tamtego przykładu. Dwa moje.

Wysyłam jeszcze raz kod:

 

/* www.learningbuz.com */
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//I2C pins declaration
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 

void setup() {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  digitalWrite(13, LOW);
  delay(500);
  //Serial.begin(9600);
  lcd.begin(16,2);//Defining 16 columns and 2 rows of lcd display
  //lcd.backlight();//To Power ON the back light
  lcd.setCursor(0,1); //Defining positon to write from first row,first column .
  lcd.print("00:00:00 dodam.??"); //You can write 16 Characters per line .
  lcd.home();
}

unsigned long currTime, stoper;
const unsigned long dod = 1000;

void loop() {
  if (millis() > stoper){
    stoper += dod;
    lcd.print(micros());
    lcd.setCursor(0, 1);
    wyswietl(stoper/(60*60*dod));
    lcd.setCursor(3, 1);
    wyswietl(stoper/(60*dod)%60);
    lcd.setCursor(6, 1);
    wyswietl(stoper/dod%60);
    //lcd.setCursor(9, 1);
    //wyswietl(stoper/dod);
    lcd.home();
  }
}

void wyswietl(int co){
  if (co < 10)
  lcd.print("0");
  lcd.print(co);
}

 

Link do komentarza
Share on other sites

(edytowany)

Niżej masz kod z millis(). Pisałem, że to wersja testowo - rozwojowa?

delay() w setup(), wstawiłem niepotrzebnie, z przyzwyczajenia.

A kiedy będzie fałszywy? Zawsze gdy stoper będzie większy od millis() [lub micros() w pierwszym kodzie].

PS

Stoper startuje od razu, po wgraniu, na razie nie ma guzika startu i stopu, czy wstrzymania, resetowania itd

Edytowano przez narbej
dopisek
Link do komentarza
Share on other sites

17 minut temu, narbej napisał:

A kiedy będzie fałszywy? Zawsze gdy stoper będzie większy od millis() [lub micros() w pierwszym kodzie].

Oj coś tu chyba nie tak. W swoim programie deklarujesz zmienną stoper, której nie inicjujesz żadną wartością - przyjmijmy, że będzie to 0.

Po włączeniu Arduino minie czas zanim sterowanie zostanie przekazane do funkcji loop() więc przy pierwszym wywołaniu :

if(millis()>stoper)

warunek jest od razu spełniony i następuje zwiększenie stoper o 1000000. Czemu to służy - nie mam pojęcia. Chyba powinieneś przemyśleć swój program.

 

Edytowano przez Belferek
Link do komentarza
Share on other sites

5 minut temu, Elvis napisał:

A czy możliwe, że nie będzie to 0?

Uważam i tak stosuję w praktyce, że deklarując zmienne warto je inicjować by uniknąć niespodzianek.

Edytowano przez Belferek
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.