Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Pomiar temperatury i wyliczenie średniej

alluser 12 Kwi 2017 10:54 648 6
  • #1 12 Kwi 2017 10:54
    alluser
    Poziom 10  

    Witam,
    Mam zegarek z czujnikiem temperatury DS18b20 i czujnik co 1 sekundę wpisuje do zmiennej "temp" informacje o temperaturze. Wszystko działa temperatura się wyświetla, jest ok.
    Nie potrafię zrobić temperatury średniej z 24h czyli z całej doby. Oraz temperatury maksymalnej i minimalnej.
    Chciałbym to wyświetlać w postaci danych: temperatura max, temperatura min, temperatura średnia /na dobę.
    Dziękuję i proszę o pomoc.
    Pozdrawiam.

    0 6
  • Pomocny post
    #2 12 Kwi 2017 12:25
    krzysiek_krm
    Poziom 34  

    Witam,
    zależy jaki efekt chcesz uzyskać.
    Jeżeli chcesz mieć średnią temperaturę "za ostatnie 24 godziny" musisz co sekundę dysponować historią pomiarów z ostatnich 24 godzin. Musisz użyć "bufora kroczącego" o pojemności 24 x 3600 próbek, trochę dużo. Co sekundę, po wykonaniu każdego pomiaru, aktualizujesz bufor i przeprowadzasz obliczenie aktualnej wartości średniej oraz wyszukanie aktualnego maksimum i minimum. Potrzebne jest niestety dużo pamięci, na ten kroczący bufor.
    Jeżeli chcesz mierzyć w kwantach: pierwsza doba, druga doba, itd, musisz zastosować trzy zmienne: suma, maksimum i minimum. Na początku każdej doby wykonujesz pomiar "inicjujący", podstawiasz jego wartość do wszystkich trzech zmiennych. Następnie wykonujesz 24 x 3600 minus jeden (ten inicjujący) pomiarów. Wartość każdego pomiaru dodajesz do zmiennej "suma" a zakres badasz według zasady: jeżeli aktualny większy od maksimum to on staje się maksimum (podstawiasz jego wartość do zmiennej "maksimum"), jeżeli aktualny mniejszy od minimum to on staje się minimum (podstawiasz jego wartość do zmiennej "minimum"). Po wykonaniu wszystkich pomiarów liczysz wartość średnią dzieląc wartość ze zmiennej "suma" przez liczbę pomiarów (24 x 3600) a wartości maksimum i minimum już masz gotowe. Kopiujesz do innych zmiennych, wyświetlasz, czy co tam potrzeba.
    Zmienna "suma" musi być w stanie "utrzymać" wartość będącą sumą wartości wszystkich 24 x 3600 pomiarów, musi być w stanie reprezentować dostatecznie duże liczby.

    Pozdrawiam

    0
  • Pomocny post
    #3 12 Kwi 2017 12:40
    kindlar
    Poziom 38  

    Na maksymalną i minimalną daj dodatkowe zmienne min, max z warunkiem: jeśli aktualna większa niż maksymalna max=akt , jeśli aktualna jest mniejsza niż minimalna min=akt. Średnia może być obliczona na podstawie kilku pomiarów. Do kolejnych komórek pamięci zapisz wartości i na koniec wyciągnij z nich średnią.

    0
  • #4 12 Kwi 2017 12:47
    alluser
    Poziom 10  

    Dziękuję za odpowiedź. Maksymalna i minimalna już rozumiem. Natomiast średnia powiedzmy zapisuje co równą godzinę do tablicy o rozmiarze 24 i te wyniki porównuje z minimalną i maksymalną? potem je podzielę to wyjdzie mi średnia? Tak będzie dobrze?
    Pozdrawiam.

    0
  • Pomocny post
    #5 12 Kwi 2017 13:02
    kindlar
    Poziom 38  

    średnia = suma wartości z pomiarów/24

    0
  • Pomocny post
    #6 12 Kwi 2017 13:24
    krzysiek_krm
    Poziom 34  

    alluser napisał:
    Dziękuję za odpowiedź. Maksymalna i minimalna już rozumiem. Natomiast średnia powiedzmy zapisuje co równą godzinę do tablicy o rozmiarze 24 i te wyniki porównuje z minimalną i maksymalną? potem je podzielę to wyjdzie mi średnia? Tak będzie dobrze?
    Pozdrawiam.

    Myślę, że najłatwiej będzie następująco.

    Deklarujesz tablicę o rozmiarze 24.
    Na początku (podczas inicjacji na przykład) wykonujesz jeden pomiar i wypełniasz nim wszystkie 24 komórki tablicy. W ten sposób unikniesz problemów ze zmienną długością bufora w czasie pierwszych 24 godzin działania, po godzinie bufor miałby długość 2, po dwóch 3, itd. Ustawiasz zmienną trzymającą aktualny indeks tablicy na drugą komórkę.
    Kręcisz się w nieskończonej pętli.
    - czekasz godzinę
    - wykonujesz pomiar
    - zapisujesz jego wartość do komórki o indeksie ze wspomnianej zmiennej
    - zwiększasz o 1 wartość zmiennej
    - jeżeli wyszło 25, podstawiasz do zmiennej 1 (żeby "zawinąć" bufor).
    - robisz analizę pomiarów
    koniec pętli.
    Analiza pomiarów.
    Sumujesz wartości wszystkich komórek i dzielisz przez 24, to jest wartość średnia.
    Podstawiasz za minimum i maksimum wartość pierwszej komórki. Przeczesujesz tablicę w poszukiwaniu ewentualnego innego maksimum i minimum.
    To wszystko.
    Wartości minimum i maksimum będą aktualne (co godzinę), wartość średnia może być nieco zaburzona przez pierwsze 24 godziny działania (ze względu na 24 - krotny zapis pierwszej wartości). Jeżeli tak nie może być musisz przez pierwsze 24 godziny działania "wydłużać" bufor i zakończyć jego "wydłużanie" na wartości 24, W pętli musi być dodatkowa zmienna trzymająca aktualną długość bufora (od 1 do 24), po osiągnięciu wartości 24, zmienna pozostaje na wartości 24.
    Musisz uwzględnić, rzecz jasna, że indeksy tablic zaczynają się (zazwyczaj) od zera.

    Pozdrawiam

    0
  • #7 12 Kwi 2017 14:08
    alluser
    Poziom 10  

    Dziękuję za odpowiedź. Oki rozumiem co koledzy pisali i myślę że dam radę.
    Jeszcze mam pytanie:
    Załóżmy że nastąpił zanik prądu miedzy godzina 15:30 a godzina 17:30 (nie mam podtrzymania bateryjnego poza zegarem) wiec będzie brakować dwóch pomiarów w tym przypadku.
    Pomyślałem że może zrobić tak. Jeżeli do tablicy wpada wynik temperatury to gdzieś się odwołuje i zapisuję się w zmiennej "pomiarok" = 1 jeżeli nie to "pomiarok" = 0 i potem na podstawie zmiennej "pomiarok" pobieram tylko tyle danych z tablicy ile mam poprawnych pomiarów i potem sumuje i dzielę przez wszystkie poprawne dane z tablicy - czyli tyle ile było jedynek w "pomiarok" (zmienna uint32_t) to ciąg jedynek i zer i zera są pomijane. Nie wiem czy dobrze to zrobię i nie obciążę pamięci procka atmega128 jeżeli dam za dużo tych danych.
    I jeszcze problem bo musiałbym jakoś chyba indeksować tablice żeby temperaturę nie wpisywał po kolei do tablicy tylko do odpowiedniego rejestru w odpowiedniej godzinie.
    Tak jakby wskazywać że godzina -
    1:00 zapis do tablicy o adresie &1 , pomiarok=1
    2:00 zapis do tablicy o adresie &2 , pomiarok=1
    3:00 zapis do tablicy o adresie &3 , pomiarok=1
    4:00 brak prądu nic się nie zapisuję
    5:00 brak prądu nic się nie zapisuje
    powrót zasilania
    w tablicy komórki o adresie &4 i &5 maja 0 oraz "pomiarok" =0 przyjmuję 0
    6:00 zapis do tablicy o adresie &6
    itd..
    tablica się zeruję po 0:00 czyli jakaś funkcja wpisuje same 0 raz na dobę.
    Oczywiście zakładając że dane przechowuję w pamięci nieulotnej. I nie trącę danych już zapisanych w wyniku braku zasilania.
    Przepraszam może trochę poszedłem za daleko czy może jest to możliwe bo tutaj trochę zaczynam komplikować a sam nie bardzo wiem jak to ugryźć.
    Dziękuję i Pozdrawiam,

    0