Skocz do zawartości
narbej

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

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().

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

tu jest artykuł o ds3231 - wygląda na to, że to całkiem fajny, niedrogi sposób na dokładny czas - zobacz

Sam gotowy modulik można kupić za kilka złotych - zobacz

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
3 godziny temu, Elvis napisał:

oczekujesz więc 0,32 ppm

a nie przypadkiem 0,23 ppm też się uczę i chyba liczymy to tak: Xppm=(1/4320000)/10-6 - czy liczymy inaczej?

Udostępnij ten post


Link to post
Share on other sites

Jasne, miało być 0,23 ppm, czeski błąd 😉

Udostępnij ten post


Link to post
Share on other sites

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 😉

Udostępnij ten post


Link to post
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);
}

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Nie do końca rozumiem Twój program. Kiedy Twoim zdaniem ten warunek if(micros()>stoper) w pętli loop() będzie fałszywy?

Edytowano przez Belferek

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
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

Udostępnij ten post


Link to post
Share on other sites
1 minutę temu, Belferek napisał:

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

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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
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

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ść
Napisz odpowiedź...

×   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...