logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak ustawić interwał zapisu danych w Arduino UNO logger?

outside wear 19 Mar 2019 18:52 876 8
  • #1 17853733
    outside wear
    Poziom 12  
    Posty: 112
    Ocena: 6
    Cześć.

    Mam mały problem z loggerem. Wszystko zrobione zgodnie z tą stroną Link. Odczyt jest prawidłowy, tylko chciałbym to robić co 1 sekundę lub np 10 sekund- i co taki czas zapisywać dane na karcie, a nie kilkadziesiąt razy na sekundę. Komenda delay(x-czas) niestety nie rozwiązuję problemu. Czytałem również o komendzie mills ale nie umiem sobie z tym poradzić. Jeśli ktoś byłby wstanie pomóc/ naprowadzić będę wdzięczny.

    Jeżeli pomyliłem dział proszę moderatora o przeniesienie, są to moje początki z arduino.

    Pozdrawiam
  • #2 17853748
    krzysiek_krm
    Poziom 40  
    Posty: 4612
    Pomógł: 716
    Ocena: 598
    Możesz dokonać twórczej modyfikacji przykładu "blink without delay".
  • #3 17853899
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 229
    Dzięki funkcji millis() i sprawdzaniu warunku if program przestaje być liniowym wykonywaniem polecenia po poleceniu, z if sprawdzasz czy upłynął odpowiednio długi odcinek czasu od poprzedniego wykonania jakiegoś kodu i wykonujesz tę część programu tylko wtedy jeśli tak. millis() jest licznikiem ms od uruchomienia programu. Zapisujesz sobie stan tego licznika w jednym miejscu programu, a w innym sprawdzasz czy od poprzedniego zapisu upłynęło 1000, jak tak to znaczy upłynęła sekunda i możesz zmienić np. stan led na przeciwny. Potem od razu ostatni stan przepisujesz do poprzedniego i tak w kółko, znowu pętla sobie biega ile umie, a zdarzenia dzieją się co 1000, co 1000000ms. Tak działa ten blinkWithoutDelay. Można też zamiast zliczać 1000 x 1000 ms zliczyć sobie 1000s, co 1000ms zwiększając tylko zmienną s, albo co 10ms, potem co 100 takich 1s, co 60 minutę, co 60h, teraz te zmienne pochodne z warunku millis można używać tak samo, np:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Pomogłem? Kup mi kawę.
  • #4 17854064
    outside wear
    Poziom 12  
    Posty: 112
    Ocena: 6
    No dobrze... a jak to wrzucić w mój program? Mogę po prostu z setup i loop skopiować to do siebie? Będzie jakiś rezultat?
  • #5 17854251
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 229
    Nie będzie żadnego rezultatu, ta funkcja jest tylko przykładem. To co zrobisz ze zmiennymi, które są w niej generowane zależy od Ciebie i jak umiesz zrozumieć takie działanie programu. Na przykład ja sobie w jednym punkcie loop sprawdzam czy jest NOWA sekunda "if(fsekundy)", co występuje dokładnie raz co sekundę i zmieniam stan led na przeciwny. Taki przykład z Arduino chyba znasz w odpowiedniku z delay? W innym miejscu programu sprawdzam czy jest nowa sekunda i ich zliczona ilość jest podzielna przez 15 bez reszty: "(fsekundy&&sekundy%15==0) " i drukuję coś na serial co 15s.
    A pętla w tym czasie kręci się w kółko tysiące razy/s, niezależnie czy coś robi czy nie.
    Pomogłem? Kup mi kawę.
  • #6 17855136
    krzysiek_krm
    Poziom 40  
    Posty: 4612
    Pomógł: 716
    Ocena: 598
    Przyjrzyj się przykładowi
    https://www.arduino.cc/en/tutorial/BlinkWithoutDelay
    który nawiasem mówiąc jest w przykładach Arduino IDE.
    W tym przykładzie akcja polega na miganiu diodą.
    Zamiast tego możesz umieścić wszystkie instrukcje z Twojej funkcji "loop", zamiast wykonywać się w każdym "obiegu" loop (czyli bardzo szybko), będą się wykonywały po upływie czasu "interval", który możesz sobie zmieniać modyfikując tę stałą w programie.
  • #7 17855335
    LChucki
    Poziom 31  
    Posty: 1940
    Pomógł: 104
    Ocena: 379
    outside wear napisał:
    tylko chciałbym to robić co 1 sekundę lub np 10 sekund- i co taki czas zapisywać dane na karcie

    Długo ta karta nie pożyje.
  • #8 17855678
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 229
    Żywotność kart SD to inny temat, jak masz jakieś stare karty z telefonów (czasami nowe przychodziły z kartą 256-512MB i od razu lądowały w szufladzie, a w ich miejsce leciała 4GB), to jest to dobre miejsce na wykorzystanie. Padanie kart w dataloggerach Arduino (czy podobnie w Raspberry) to częsty temat na forach, także nie przywiązuj się do swojej. Jak jesteś w zasięgu WIFI to łatwiej dane wysyłać na darmowy serwer online, a jak nie to zapisywać w pamięci FRAM, ostatecznie w zewnętrznej flash z własną kontrolą ilości zapisów poszczególnych komórek pamięci.
    Pomogłem? Kup mi kawę.
  • #9 17855743
    LChucki
    Poziom 31  
    Posty: 1940
    Pomógł: 104
    Ocena: 379
    kaczakat napisał:
    a jak nie to zapisywać w pamięci FRAM, ostatecznie w zewnętrznej flash z własną kontrolą ilości zapisów poszczególnych komórek pamięci.

    FRAM, rozwiązanie proste ale drogie. Taniej dać kilkadziesięt czy kilkaset większą FLASH i stosowny system plików do niej. Dane zapisuje się do FLASH a co jakiś czas, np co godzinę kopiuje na SD. Temat nie jest banalny i zrobienie tego dobrze to nie taka prosta sprawa i nie zrobi się tgo w dzień czy dwa, raczej w dwa tygodnie albo miesiąc.
    Aby działało to dobrze, penie to:
    - Zapis do NVRAM lub FLASH gdy uzbiera się danych wielkości sektora FLASH, kopia do FLASH.
    - FLASH z odpowiednim systemem plików kopiowanie na SD, gdy zapis ok, ustawienie znacznika w FLASH, o backupie danych.
    To ta łatwiejsza część, trudniejsza, to w razie utraty danych na karcie SD próba odzyskania ile się da z FLASH. Na FLASH dałbym podwójny backup, więc też odpowiednie procedury odzyskiwania i logi z informacjami o tym czy i jak często dane były odzyskiwane i z jakim skutkiem. Jak podwójny backup w FLASH (o NvRAM czy FRAM już nie wspominam) to i na SD.
    Zanim jednak zacznie się zrealizować taki projekt, należy zastanowić się ile danych będzie zapisywanych i z jakiego okresu chcemy w razie czego odzyskać dane. To pozwoli wybrać odpowiednie pojemności pamicii NvRAM/FRAM i FLASH.

    Prawda, że proste?

Podsumowanie tematu

✨ Użytkownik ma problem z ustawieniem interwału zapisu danych w loggerze opartym na Arduino UNO, chcąc zapisywać dane co 1 lub 10 sekund zamiast kilkudziesięciu razy na sekundę. Odpowiedzi sugerują wykorzystanie funkcji millis() do monitorowania czasu, co pozwala na asynchroniczne wykonywanie kodu. Użytkownicy podkreślają, że zamiast używać delay(), lepiej jest implementować logikę opartą na warunkach czasowych, co pozwala na bardziej elastyczne zarządzanie zapisami. Dodatkowo, poruszono kwestie dotyczące żywotności kart SD oraz alternatywnych metod przechowywania danych, takich jak FRAM czy zewnętrzna pamięć FLASH.
Wygenerowane przez model językowy.
REKLAMA