Spisu treści:

Arduino Wykreślanie daty/czasu/rejestrowanie za pomocą Millis() i PfodApp: 11 kroków
Arduino Wykreślanie daty/czasu/rejestrowanie za pomocą Millis() i PfodApp: 11 kroków

Wideo: Arduino Wykreślanie daty/czasu/rejestrowanie za pomocą Millis() i PfodApp: 11 kroków

Wideo: Arduino Wykreślanie daty/czasu/rejestrowanie za pomocą Millis() i PfodApp: 11 kroków
Wideo: High Density 2022 2024, Listopad
Anonim
Arduino Wykreślanie daty/czasu/rejestrowanie za pomocą Millis() i PfodApp
Arduino Wykreślanie daty/czasu/rejestrowanie za pomocą Millis() i PfodApp

Nie jest wymagane programowanie Arduino lub Android. Obsługiwane są również moduły RTC i GPS. Automatyczna korekta stref czasowych, dryfu RTC i brakujących sekund przestępnych GPS

Wstęp

Ten samouczek pokazuje, jak używać znaczników czasu Arduino millis() do wykreślania danych z datą i godziną na telefonie komórkowym z systemem Android za pomocą pfodApp.

Nie wymaga programowania Arduino lub Androida. pfodApp rejestruje również wystarczającą ilość danych, dzięki czemu można później odtworzyć wykresy daty/czasu w arkuszu kalkulacyjnym.

NIE jest potrzebny moduł RTC ani GPS, jednak jeśli twój projekt Arduino ma moduł RTC (zegar czasu rzeczywistego) lub moduł GPS, można ich również użyć. W takich przypadkach wykresy pfodApp automatycznie skorygują strefę czasową, dryf RTC i brakujące sekundy przestępne GPS. Do tych poprawek nie jest wymagany żaden specjalny kod Arduino. Jak zawsze w przypadku pfodApp, otrzymane dane są rejestrowane dokładnie tak, jak są, bez korekty, jednak plik dziennika zawiera również informacje wystarczające do samodzielnego zastosowania tych poprawek podczas pobierania dzienników na komputer. Zobacz poniżej przykłady tego przetwarzania końcowego.

Obsługiwana jest szeroka gama formatowania czasu i daty w osi X, z których wszystkie są całkowicie kontrolowane przez krótkie ciągi tekstowe w szkicu Arduino. Nie jest wymagane programowanie na Androida.

pfodApp połączy się przez WiFi, Bluetooth Classic, BLE i SMS. Darmowy pfodDesigner generuje kompletne szkice Arduino do wykreślania/rejestrowania daty/czasu w celu połączenia z szeroką gamą płyt. Nie jest wymagane programowanie Arduino.

Ta instrukcja użyje Adafruit Feather52 jako przykładowej płyty Arduino, która łączy się przez BLE.

Ta instrukcja obejmuje trzy przypadki: 1) Twój projekt z mikroprocesorem ma tylko milisekundowe znaczniki czasu – milis() 2) Twój projekt z mikroprocesorem ma zegar czasu rzeczywistego (RTC) – pfodApp automatycznie koryguje dryft. 3) Twój projekt mikroprocesorowy ma moduł GPS – pfodApp automatycznie koryguje sekundy przestępne w momencie ich wystąpienia (obecnie 18 sekund na 2018 rok).

Krok 1: Korzystanie z milisekundowych znaczników czasu Arduino, Millis()

Korzystanie z milisekund jako daty i godziny składa się z dwóch części. Jedna służy do wykreślania danych względem czasu, który upłynął lub daty/czasu, a druga część to ponowne tworzenie daty i godziny na podstawie zarejestrowanych milisekundowych znaczników czasu nieprzetworzonych danych. pfodApp nie modyfikuje surowych danych otrzymanych z pfodDevice (Arduino micro). Po prostu rejestruje dokładnie otrzymane bajty.

Najpierw użyj darmowego pfodDesigner, aby wygenerować szkic Arduino dla swojego mikro, który wyśle milisekundy i pomiary danych do pfodApp w celu wykreślenia/rejestrowania. Ten przykład tworzy menu dla tablicy Adafruit Feather 52 BLE, które brzmi A0. Samouczek dotyczący Adafruit Feather nRF52 LE - Custom Controls z pfodApp przechodzi przez kroki pfodDesigner, aby utworzyć menu dla Feather nRF52, które zawiera przycisk Chart, więc sprawdź to, aby uzyskać więcej szczegółów. W tym samouczku dodamy tylko przycisk wykresu i użyjemy nowych opcji formatu osi X, aby wykreślić odczyty A0 z upływającym czasem i datą/czasem.

Pierwsza część tego samouczka obejmie korzystanie z bezpłatnego pfodDesigner, aby utworzyć przykładowy wykres daty/godziny na telefonie komórkowym z systemem Android. Gdy jesteś zadowolony z wyświetlacza, możesz wygenerować szkic Arduino, który odtworzy go po połączeniu z pfodApp. Nie jest wymagane programowanie Androida, a ponieważ pfodDesigner generuje kompletne szkice Arduino dla szerokiej gamy płyt Arduino, nie jest wymagane również programowanie Arduino.

Krok 2: Dodawanie wykresu do menu

Dodawanie wykresu do menu
Dodawanie wykresu do menu
Dodawanie wykresu do menu
Dodawanie wykresu do menu
Dodawanie wykresu do menu
Dodawanie wykresu do menu
Dodawanie wykresu do menu
Dodawanie wykresu do menu

Pobierz aplikację pfodDesigner z Google Play, otwórz ją i kliknij „Rozpocznij nowe menu”

Kliknij przycisk „Target Serial”, a następnie przycisk „Bluetooth Low Energy”, aby wyświetlić listę około 11 płyt BLE (przewiń w dół, aby zobaczyć inne opcje). Wybierz na Adafruit Bluefruit Feather52.

Wróć do menu Edycja i kliknij „Monit o edycję” i ustaw odpowiedni monit dla tego menu, np. „Feather52” i pogrubienie tekstu oraz rozmiar +7. Kolor tła został pozostawiony jako „domyślny” biały

Wróć i kliknij „Dodaj pozycję menu”, przewiń w dół i wybierz „Przycisk wykresu”, co spowoduje otwarcie ekranu edycji przycisku wykresu. Tutaj możesz wprowadzić dowolne zmiany w wyglądzie przycisku. W tym przypadku tekst przycisku został zmieniony na „Date/Time chart of A0”, a inne wartości domyślne pozostały bez zmian.

Daje to przycisk w menu, który otworzy ekran wykresu.

Krok 3: Edycja źródła wykresu i etykiet

Edycja źródła wykresu i etykiet
Edycja źródła wykresu i etykiet
Edycja źródła wykresu i etykiet
Edycja źródła wykresu i etykiet
Edycja źródła wykresu i etykiet
Edycja źródła wykresu i etykiet
Edycja źródła wykresu i etykiet
Edycja źródła wykresu i etykiet

Kliknij przycisk „Wykres daty/godziny A0”, aby otworzyć ekran edycji wykresów, na którym można uzyskać dostęp do etykiety wykresu, formatu osi X, interwału danych wykresu i (przewijając w dół) samych ustawień wykresu. Edytuj etykietę wykresu na coś odpowiedniego, np. „V A0”.

Przewiń w dół i dla Wykresów 2 i 3 otwórz Edytuj wykres i kliknij Ukryj wykres, aby usunąć je z wyświetlania wykresu.

Następnie kliknij „Edit Plot 1” i ustaw etykietę wykresu (np. A0), jednostki yAxis (np. Volts), wyświetl maks. 3,6 V i podłącz do pinu I/O A0.

Przewiń w górę i kliknij „Podgląd wykresu”, aby uzyskać najnowsze 0 przykładowych punktów danych, w odstępach co 1 s, wykreślone w stosunku do upływającego czasu w minutach: sekundach.

Dla wszystkich wykresów czasu, który upłynął, początkowe jednostki zerowe nie są wyświetlane, więc na tym wykresie tylko czasy > 1 min są pokazywane w minutach wiodących.

Krok 4: Wybór formatu daty/godziny

Wybór formatu daty/godziny
Wybór formatu daty/godziny
Wybór formatu daty/godziny
Wybór formatu daty/godziny
Wybór formatu daty/godziny
Wybór formatu daty/godziny

Dla wykresów upływu czasu jednostka wiodąca stale rośnie w miarę upływu czasu. Aby zobaczyć przykład, wróć do ekranu „Edycja wykresów” i zwiększ interwał danych wykresu do 15 minut (na dole tego ekranu)

Następnie kliknij Podgląd wykresu, aby wyświetlić te same dane próbki, ale teraz z 15-minutowymi przerwami między próbkami. Jak widać, część minutowa mm:ss po prostu rośnie.

Teraz wróć i kliknij przycisk osi X, aby wyświetlić mały wybór wszystkich możliwych formatów danych/czasu osi X (przewiń w dół, aby zobaczyć więcej)

Powyżej znajduje się wybór podglądów wykresów przy użyciu różnych formatów osi X.

Przedstawione tutaj wykresy daty/godziny znajdują się w „lokalnej” strefie czasowej. Istnieją również opcje formatowania do wykreślania daty/czasu w UTC. Pełen zestaw możliwych opcji formatu daty/czasu znajduje się w pfodSpecification.pfd.

Krok 5: Wygeneruj i przetestuj szkic Arduino

Wygeneruj i przetestuj szkic Arduino
Wygeneruj i przetestuj szkic Arduino
Wygeneruj i przetestuj szkic Arduino
Wygeneruj i przetestuj szkic Arduino

Gdy jesteś zadowolony z formatu wykresu i interwału danych, możesz przejść do ekranu „Menu edycji_1” i przewinąć w dół i „Generuj kod” dla wybranej tablicy docelowej. Oto przykładowy szkic dla Adafruit Feather52 przy użyciu 1-sekundowych interwałów danych i formatu czasu upływu mm:ss, pfodFeather52_timeplot.ino

Powyżej znajduje się wykres A0 z Feather52

Zmiana formatu na Weekday hr:mins:sec (~E HH:mm:ss) i ponowne wygenerowanie kodu (pfodFeather52_dateplot.ino) daje wykres podobny do drugiego powyżej.

Możesz edytować format osi X bezpośrednio w szkicu Arduino, jak opisano dalej.

Krok 6: Jak PfodApp wykreśla datę/godzinę z Millis()?

Gdy pfodApp się łączy, zapamiętuje swój czas „lokalny” i UTC i żąda bieżących znaczników czasu danych wykresu pfodDevice (płyty Arduino). Korzystając z tych informacji, pfodApp może następnie wykreślić milisekundowe znaczniki czasu jako czas, który upłynął, tj. Konwertując milisekundy na godz.

W szkicu wygenerowanym przez Arduino (np. pfodFeather52_dateplot.ino) znajdują się trzy małe fragmenty kodu obsługujące stronę Arduino wykresów.

Sekcja kodu loop(), która obsługuje żądanie {@} bieżącego czasu pfodApp

// obsłuż {@} request } else if('@'==cmd) { // pfodApp zażądał 'bieżącego' czasu plot_mSOffset = millis(); // przechwyć bieżące milisy jako offset znaczniki czasu rawdata parser.print(F("{@`0}")); // zwróć `0 jako 'bieżące' nieprzetworzone dane w milisekundach

Mógłbyś po prostu zwrócić bieżącą wartość millis(), ale millis() zamienia się z powrotem do 0 co 49,7 dni, co spowodowałoby przeskok wykresu do tyłu. Zamiast tego kod zapamiętuje bieżącą wartość milis() podczas żądania {@} i zwraca {@`0}, tj. bieżący znacznik czasu milisekundy równy zero. Następnie, wysyłając surowe punkty, z których korzysta szkic

plot_1_var = analogRead(A0); // odczyt danych wejściowych do wykresu // plot_2_var plot Ukryty, więc nie ma tu przypisanych danych // plot_3_var wykres Ukryty, więc nie ma tu przypisanych danych // wyślij dane do wykresu w formacie CSV parser.print(millis()-plot_mSOffset);// czas w milisekundach ….

tak, aby znacznik czasu milisekundy wysłany z danymi zaczynał się od 0 i wzrastał do 49,7 dni. Jeśli pozostaniesz w stałym kontakcie przez 49,7 dni, zobaczysz, że wykres cofa się o ~ 50 dni. Rozłączanie i ponowne łączenie raz na 49,7 dni pozwala tego uniknąć.

Trzecią częścią wykresu daty/godziny jest komunikat o wykresie.

} else if('A'==cmd) { // użytkownik nacisnął -- 'Date/Time wykres A0' // w głównym menu Menu_1 // return ploting msg. parser.print(F("{=A0 Wolty~E GG:mm:ss|data|A0~~~Wolty||}"));

Gdy użytkownik naciśnie przycisk „Wykres daty/godziny A0”, pfodApp wysyła polecenie {A} do pfodDevice, a pfodDevice odpowiada komunikatem wykresu, {=…{=A0 Volts~E HH:mm:ss|data |A0~~~Volts||}który zawiera format osi X E HH:mm:ss

Dopuszczalne są tutaj formaty Java SimpleDateFormat. pfodApp Data Logging and Plotting oraz pfodSpecification.pdf zawierają więcej szczegółów na temat komunikatu o wykresie.

Krok 7: Odtworzenie wykresów daty/godziny na komputerze

Odtwarzanie wykresów daty/godziny na komputerze
Odtwarzanie wykresów daty/godziny na komputerze
Odtwarzanie wykresów daty/godziny na komputerze
Odtwarzanie wykresów daty/godziny na komputerze
Odtwarzanie wykresów daty/godziny na komputerze
Odtwarzanie wykresów daty/godziny na komputerze

Domyślnie pfodApp rejestruje wszystkie przychodzące nieprzetworzone dane w pliku dziennika na telefonie komórkowym, chyba że wyłączyłeś to rejestrowanie na ekranie edycji połączenia, zobacz pfodAppForAndroidGettingStarted.pdf

Gdy edytujesz pfodApp, wyświetla się krótki komunikat z lokalizacją i nazwą pliku dziennika, np. /pfodAppRawData/pfod_bluefruit52.txt Ten plik jest w formacie CSV, rozdzielany przecinkami i po przesłaniu go na komputer (zobacz opcje transferu w pliku pfodAppForAndroidGettingStarted.pdf), możesz go otworzyć w arkuszu kalkulacyjnym, aby wykreślić dane.

Oto kilka pierwszych linijek pliku dziennika.

// pfodApp V3.0.360, czas lokalny, UTC, mS na dzień, aktualny czas pfod bluefruit52 (mS), aktualny czas pfod bluefruit52, // połączono 20.04.2019 11:32:50.238, 20.04.2019 01:32:50.238, 86400000, 0, 366, 0.25,, 1366, 0.29,, 2366, 0.31,, 3366, 0.33,, 4366, 0.33,, Powyżej możesz zobaczyć czas „lokalny” i UTC, w którym pfodApp połączył się z Feather52 oraz aktualny czas w mS, który Feather52 zgłosił w odpowiedzi {@..}. Ostatnia kolumna jest pusta, ponieważ nie ma zegara czasu rzeczywistego ani GPS, a zatem urządzenie Feather52 nie zgłosiło aktualnego czasu w formacie rrrr/MM/dd.

Aby wykreślić dane w funkcji czasu, który upłynął, odejmij bieżący czas (mS) od znacznika czasu milisekundy, a następnie podziel przez wartość mS na dzień. Oto arkusz kalkulacyjny z dodaną formułą i wykreślonym wynikiem. Poniższy arkusz kalkulacyjny (pfod_bluefruit52.xls) to arkusz kalkulacyjny OpenOffice zapisany w formacie Excel.

W OpenOffice wykres jest wykresem punktowym, a oś X wykresu została sformatowana w formacie GG:MM:SS Uwaga: formaty daty/godziny w arkuszu kalkulacyjnym NIE są takie same, jak formaty wykresów używane przez pfodApp. Na przykład w pfodApp, MM to miesiące, a mm to minuty.

Aby wykreślić datę i godzinę, wystarczy dodać czas połączenia do czasu w arkuszu kalkulacyjnym i powtórzyć wykres. (pfod_bluefruit52_date.xls)

Uwaga: czas lokalny i UTC zostały zaimportowane jako tekst w moim arkuszu kalkulacyjnym, więc przed użyciem ich w formule musiałem usunąć początkowe „”.

Krok 8: Jak uniknąć limitu 49,7 dni Millis() i dlaczego nie powinieneś?

Jak wspomniano powyżej w Jak pfodApp wykreśla datę/godzinę z millis()?, jeśli pozostaniesz w ciągłym połączeniu przez ponad 49,7 dni, milisekundowe znaczniki czasu zostaną zwinięte z powrotem do zera. Kilka linijek kodu może tego uniknąć, ale nie jest to zalecane.

Po pierwsze, jak uniknąć owinięcia. Dodaj kolejną zmienną unsigned int, aby śledzić, ile razy sygnatury czasowe zawijają się i drukuj łączny wynik w postaci HEX.

uint_t mSwrapCount = 0;uint32_t lastTimeStamp = 0;

… wykres_1_zmienna = analogRead(A0); // odczyt danych wejściowych do wykresu // wykres_2_var wykres Ukryty, aby nie przypisywać tutaj danych // wykres_3_var wykres Ukryty, aby nie przypisywać tutaj danych // wyślij dane wykresu w formacie CSV uint32_t timeStamp = millis()-plot_mSOffset; if (timeStamp < lastTimeStamp) { // znacznik czasu zawinięty z powrotem do 0 mSwrapCount++; // dodaj jeden do zliczania } lastTimeStamp = timeStamp; parser.print("0x"); parser.print(msWrapCount, HEX); parser.print(timeStamp, HEX);// czas w milisekundach w HEX ….

Po zwróceniu odpowiedzi {@… wyczyść również mSwrapCount.

// obsłuż {@} request } else if('@'==cmd) { // pfodApp zażądał 'bieżącego' czasu plot_mSOffset = millis(); // przechwyć bieżące milisy jako offset znaczniki czasu rawdata mSwrapCount = 0; // wyczyść licznik zawinięć. parser.print(F("{@`0}")); // zwróć `0 jako 'bieżące' nieprzetworzone dane w milisekundach

Sygnatury czasowe będą teraz podawać „prawidłową” wartość przez następne 40.7dni * 65536 ~= 7308 lat.

pfodApp automatycznie skonwertuje znaczniki czasu szesnastkowego do wykreślenia i zarejestruje je dokładnie tak, jak odebrano, tj. w szesnastkowym. W arkuszu kalkulacyjnym (OpenOffice) użyj tej formuły do konwersji ciągu szesnastkowego w A2 na mS (gdzie A1 to dowolna pusta komórka) =HEX2DEC(REPLACE(A2;1;2;A1))

Dlaczego nie chcesz tego robić

Jak pokazano powyżej, łatwo jest przedłużyć znaczniki czasu mS na okres dłuższy niż 50 dni. Jednak prawdopodobnie nie chcesz tego robić, ponieważ stają się one coraz bardziej niedokładne. Typowy kryształ 16Mhz używany do tworzenia millis() powoduje, że mikro ma dokładność ~50ppm (części na milion). Oznacza to, że po 49,7 dni znacznik czasu milisekundy może zostać usunięty o 3 ½ minuty, co ignoruje wpływ temperatury na dokładność kryształu.

W przypadku krótkich okresów połączenia ta niedokładność nie stanowi problemu, ponieważ odpowiedź {@.. ponownie synchronizuje znacznik czasu milisekundy z datą/godziną telefonu komórkowego przy każdym ponownym połączeniu. Jeśli jednak chcesz pozostać w kontakcie przez długi czas (dni) i stale rejestrować dane, powinieneś użyć czegoś dokładniejszego niż wbudowana funkcja millis(), na przykład modułu RTC lub GPS.

Krok 9: Korzystanie z zegara czasu rzeczywistego (RTC)

Korzystanie z zegara czasu rzeczywistego (RTC)
Korzystanie z zegara czasu rzeczywistego (RTC)
Korzystanie z zegara czasu rzeczywistego (RTC)
Korzystanie z zegara czasu rzeczywistego (RTC)

Dostępnych jest wiele modułów RTC, jednym z dokładniejszych jest DS3231 m.in. Moduł DS3231 firmy Adafruit. Podana dokładność wynosi +/-2ppm w zakresie od 0 do 40C. tj. ~+/-5 s/miesiąc.

Jeśli chcesz wykreślić dane, które mają znaczniki czasu/daty, np. 2019/04/19 20:4:34, to trzeba zmodyfikować odpowiedź {@, aby zwracała aktualną datę/godzinę, np. {@`0~2019/4/19 3:33:5}. Oto kilka przykładowych zmian w kodzie do zastosowania w szkicu wygenerowanym przez pfodDesigner w celu użycia modułu RTC, zakładając, że używasz biblioteki RTClib i dodałeś kod inicjujący moduł RTC.

// obsłuż {@} request } else if('@'==cmd) { // pfodApp zażądał 'bieżącego' czasu plot_mSOffset = millis(); // przechwyć bieżące milisekundy jako przesunięcie znaczników czasu rawdata parser.print(F("{@`0"}); // zwróć `0 jako 'bieżące' nieprzetworzone dane milisekund parser.print('~'); // początek ciągu znaków data/czas DateTime now = rtc.now() sendDateTime(&now);// wyślij rrrr/M/d/ H:m:s do parser.print, przekaż adres & jako arg. parser.print('}'); // koniec {@odpowiedzi, np. {@`0~2019/4/19 3:33:5}….

// wyślij datę i godzinę do parsera printvoid sendDateTime(DateTime* dt) { parser.print(dt->year(), DEC); parser.print('/'); parser.print(dt->miesiąc(), DEC); parser.print('/'); parser.print(dt->day(), DEC); parser.print(' '); parser.print(dt->godzina(), DEC); parser.print(':'); parser.print(dt->minuta(), DEC); parser.print(':'); parser.print(dt->druga(), DEC); }

void sendData() { if (plotDataTimer.isFinished()) { plotDataTimer.repeat(); // zrestartuj zegar danych wykresu, bez dryfu // przypisz wartości do zmiennych wykresu ze zmiennych pętli lub odczytaj dane wejściowe ADC plot_1_var = analogRead(A0); // odczyt danych wejściowych do wykresu // wykres_2_var wykres Ukryty, więc nie ma tu przypisanych danych // wykres_3_zmienna wykres Ukryty, więc nie ma tu przypisanych danych // wyślij dane wykresu w formacie CSV DateTime now = rtc.now(); sendDateTime(&now); // wyślij rrrr/M/d/ H:m:s do parser.print, przekaż adres & jako arg. parser.print(', '); parser.print(((float)(plot_1_var - plot_1_varMin)) * plot_1_scaling + plot_1_varDisplayMin); parser.print(', '); // Wykres 2 jest ukryty. Brak wysłanych danych. parser.print(', '); // Wykres 3 jest ukryty. Brak wysłanych danych. parser.println(); // koniec rekordu danych CSV } }

Część odpowiedzi {@2019/4/19 3:33:5 informuje pfodApp o tym, co pfodDevice uważa za bieżącą datę i godzinę. Twój szkic może następnie wysłać dane ze znacznikami czasu yMd Hms, a pfodApp wykreśli je jako czas, który upłynął od czasu połączenia LUB jako datę i godzinę, w zależności od określonego formatu osi X.

Podczas wykreślania względem daty i czasu, procedura wykresu pfodApp koryguje wszelkie „dryfty” w RTC, porównując zgłoszony aktualny czas pfodDevice z aktualnym czasem telefonu komórkowego. Ta korekta obsługuje również ustawienie RTC na inną strefę czasową niż lokalna strefa czasowa telefonu komórkowego. znaczniki czasu millis() nadal działają tak, jak w punkcie Korzystanie z milisekundowych znaczników czasu Arduino, krok 5 powyżej.

Oto przykładowy arkusz kalkulacyjny z temperaturami pokojowymi w okresie 8 dni, Office_Temp.xls Kiedy plik dziennika został zaimportowany, pierwsza kolumna została oznaczona jako YMD, aby przekonwertować tekst na datę/godzinę. Nadal musisz usunąć początkowe wpisy czasu lokalnego, UTC i Office Temp, aby arkusz kalkulacyjny zinterpretował je jako daty i godziny.

Aby uzyskać ten sam wykres, który pokazuje pfodApp, musisz obliczyć „Poprawioną datę/godzinę”. W tym przypadku czas RTC jest o 2 sekundy niższy od czasu lokalnego telefonu komórkowego, więc do każdego czasu RTC dodawany jest znacznik czasu (czas lokalny – aktualny czas Office Temp), aby uzyskać prawdziwy czas lokalny.

Dla wykresów czasu, który upłynął, utwórz nową kolumnę zawierającą znacznik czasu (daty/czasu – aktualny czas czasu biurowego) i użyj go jako osi X na wykresie (Office_TempElapsed.xls) Właściwie w tym przypadku pfodApp tworzy ładniejsze wykresy czasu, który upłynął w dniach godz:min:sek.

Krok 10: Korzystanie z modułu GPS

Korzystanie z modułu GPS jest podobne do korzystania z modułu RTC, z wyjątkiem tego, że moduły GPS mają dostępne milisekundy, lata zaczynają się od 2000 roku, a czas nie zawiera sekund przestępnych UTC (patrz https://tycho.usno.navy.mil/leapsec.html) Data i godzina GPS jest obecnie 18 sekund przed czasem UTC, według stanu na styczeń 2018 r.

Biblioteka Adafruit GPS dla Adafruit Ultimate GPS, w przeciwieństwie do RTClib, nie dodaje przesunięcia 2000 lat do lat GPS, więc należy je dodać, gdy wysyłasz datę i znacznik czasu. Również chociaż biblioteka GPS dostarcza milisekundy, które mają bardzo dobrą długoterminową dokładność, nie są one zbyt precyzyjne. Aktualizacje czasu GPS są wykonywane tylko raz na 100 ms, a następnie występuje dodatkowe opóźnienie odbierania danych szeregowych przy powolnym 9600 bodach i kolejne opóźnienie w ich analizowaniu. Wszystko to zwiększa precyzję co do milisekund podczas oznaczania znacznikami czasu odczytów danych.

Oto kilka przykładowych zmian w kodzie do zastosowania w szkicu wygenerowanym przez pfodDesigner w celu użycia modułu GPS, zakładając, że używasz biblioteki GPS Adafruit i dodałeś kod do odbierania i analizowania wiadomości w obiekcie GPS.

// obsłuż {@} request } else if('@'==cmd) { // pfodApp zażądał 'bieżącego' czasu plot_mSOffset = millis(); // przechwyć bieżące milisekundy jako przesunięcie znaczników czasu rawdata parser.print(F("{@`0"}); // zwróć `0 jako 'bieżące' nieprzetworzone dane milisekund parser.print('~'); // początek ciągu znaków data/godzina sendDateTime(&GPS); // wyślij rrrr/M/d/ H:m:s do parser.print, podaj adres & jako arg. parser.print('}'); // koniec odpowiedzi {@ np. {@`0~2019/4/19 3:33:5}….

// wyślij datę i godzinę do parsera printvoid sendDateTime(Adafruit_GPS* gps) { parser.print(F("20"); // 20..year parser.print(gps->year, DEC); parser.print('/ '); parser.print(gps->month, DEC); parser.print('/'); parser.print(gps->day, DEC); parser.print(' '); parser.print(gps- >hour, DEC); parser.print(':'); parser.print(gps->minute, DEC); parser.print(':'); parser.print(gps->second, DEC); // parser.print('.'); jeśli wysyłasz milisekundy // jeśli chcesz wysłać mS musisz uzupełnić wartość gps->milisekundy zerami wiodącymi // np. 3 należy uzupełnić do 003 }

void sendData() { if (plotDataTimer.isFinished()) { plotDataTimer.repeat(); // zrestartuj zegar danych wykresu, bez dryfu // przypisz wartości do zmiennych wykresu ze zmiennych pętli lub odczytaj dane wejściowe ADC plot_1_var = analogRead(A0); // odczyt danych wejściowych do wykresu // wykres_2_var wykres Ukryty, aby nie przypisywać tutaj danych // wykres_3_zmienna wykres Ukryty, aby nie przypisywać tutaj danych // wyślij dane wykresu w formacie CSV sendDateTime(&GPS); // wyślij rrrr/M/d/ H:m:s do parser.print, przekaż adres & jako arg. parser.print(', '); parser.print(((float)(plot_1_var - plot_1_varMin)) * plot_1_scaling + plot_1_varDisplayMin); parser.print(', '); // Wykres 2 jest ukryty. Brak wysłanych danych. parser.print(', '); // Wykres 3 jest ukryty. Brak wysłanych danych. parser.println(); // koniec rekordu danych CSV } }

Podczas kreślenia w odniesieniu do daty i czasu, pfodApp automatycznie koryguje o sekundy przestępne. Według stanu na styczeń 2018 r. czas GPS jest o 18 sekund przed czasem UTC. pfodApp koryguje to, porównując datę/godzinę zwróconą przez GPS przy połączeniu za pośrednictwem odpowiedzi {@ z datą i godziną UTC telefonu komórkowego. Tworzenie wykresów w arkuszu kalkulacyjnym z pliku dziennika pfodApp przebiega tak samo, jak w przypadku modułów RTC powyżej. Dodanie (czas lokalny – aktualny czas Office Temp) do znaczników czasu GPS koryguje sekundy przestępne.

znaczniki czasu millis() nadal działają tak, jak w punkcie Korzystanie z milisekundowych znaczników czasu Arduino, krok 5 powyżej.

Krok 11: Wniosek

Korzystanie z pfodApp na telefonie z systemem Android umożliwia wykreślanie danych względem daty i czasu lub upływającego czasu, używając tylko funkcji millis() Arduino. Korzystając z pliku dziennika pfodApp, możesz odtworzyć te wykresy daty/czasu w arkuszu kalkulacyjnym. Jeśli Twój projekt Arduino ma moduł RTC, możesz rejestrować i wykreślać datę oraz znaczniki czasu RTC, automatycznie korygując „dryf” RTC. Jeśli projekt Arduino ma moduł GPS, możesz rejestrować i wykreślać jego bardzo dokładne znaczniki czasu, a pfodApp automatycznie skoryguje brakujące sekundy przestępne GPS.

We wszystkich przypadkach surowe dane z twojego projektu Arduino są rejestrowane dokładnie tak, jak zostały otrzymane, bez korekty. Jednak plik dziennika pfodApp zawiera dodatkowe dane, które umożliwiają odtworzenie tych poprawek w arkuszu kalkulacyjnym z pobranego pliku dziennika.

Nie jest wymagane kodowanie Androida. Wszystkie formaty wykresów są określone przez małe ciągi tekstowe w szkicu Arduino. Darmowy pfodDesigner generuje kompletne logowanie danych Arduino i szkice kreślące dla szerokiej gamy płyt Arduino łączących się przez WiFi, klasyczny Bluetooth, BLE i SMS

Zalecana: