Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 18 kwi 2025, o 05:22


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 3 wrz 2020, o 17:38 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2012
    Posty: 712
    Lokalizacja: Opole
    Pomógł: 23

    Witam

    Postanawiam przenieść swój kod napisany w Arduino bezpośrednio na C i mam pewnie problem z zastąpieniem funkcji map czyli kalibracji względem dwóch punktów max i min.
    W zapisie matematycznym funkcja wygląda następująco:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Postanowiłem ją zaadaptować na swoje potrzeby już w Eclispe ale jakoś z marnym skutkiem, gdyż w wyniku działania funkcji mam cały czas 0.

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Gdzie może leżeć błąd? Zdaje sobie sprawę że wynikiem takiej funkcji może być liczba po przecinku ale śmiało mogę ją uciąć do pełnych wartości. Dodam ze w tym przykładzie jest to pomiar wilgotności gleby a wartości max i min dobrane są testowo po badaniach w szklance wodzy i wartości w powietrzu gdzie dla obecności w wodzie mamy 360 a w powietrzu 820



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2020, o 19:18 
    Offline
    Nowy

    Dołączył(a): 31 maja 2018
    Posty: 17
    Pomógł: 1

    Wilu88 napisał(a):
    wynik_adc - ADC_calibration_min

    Tu będzie błąd 0-820 = 64715

    Tak samo tu
    Wilu88 napisał(a):
    ADC_calibration_max - ADC_calibration_min


    360-820= 65105

    czyli w skrócie

    64715*100= (nie wiem dokładnie ile bo zostanie przekroczone kilka kronie uint16_t) w przybliżeniu mi wychodzi 63905

    wiec 63905/65105 = 0,98itd... czyli dla uint16_t będzie =0

    Jak byś zauważył on korzysta z log 32bit wiec będą ujemne liczby a ty unsigned int 16bit wiec masz tylko dodatnie liczby i jeszcze mniejsza zmienna



    Ostatnio edytowano 3 wrz 2020, o 19:29 przez daro0606, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2020, o 19:23 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    Wilu88 napisał(a):
    uint16_t ADC_calibration_min = 820;
    uint16_t ADC_calibration_max = 360;


    może odwrotnie wartości ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2020, o 19:28 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2012
    Posty: 712
    Lokalizacja: Opole
    Pomógł: 23

    Daro69 napisał(a):
    Wilu88 napisał(a):
    uint16_t ADC_calibration_min = 820;
    uint16_t ADC_calibration_max = 360;


    może odwrotnie wartości ?


    tak to brzmi ale wartości są OK po prostu max jest wtedy gdy jest woda a bez wody jest min i ten czujnik zwraca takie napięcia.

    ------------------------ [ Dodano po: 4 minutach ]

    daro0606 napisał(a):
    Wilu88 napisał(a):
    wynik_adc - ADC_calibration_min

    Tu będzie błąd 0-820 = 64715

    Tak samo tu
    Wilu88 napisał(a):
    ADC_calibration_max - ADC_calibration_min


    360-820= 65105

    czyli w skrócie

    64715*100= (nie wiem dokładnie ile bo zostanie przekroczone kilka kronie uint16_t) w przybliżeniu mi wychodzi 63905

    wiec 63905/65105 = 0,98itd... czyli dla uint16_t będzie =0

    Jak byś zauważył on korzysta z log 32bit wiec będą ujemne liczby a ty unsigned int 16bit wiec masz tylko dodatnie liczby i jeszcze mniejsza zmienna


    Nie wiem czy o to Ci chodziło ale zamiana zmiennej ADC_gleba na int16_t oraz rzutowanie do int16_t nic nie daje dalej mam wynik 0 przy wynik_adc=730



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2020, o 20:31 
    Offline
    Nowy

    Dołączył(a): 31 maja 2018
    Posty: 17
    Pomógł: 1

    Zmień wszystkie typy danych na int32_t to może zrozumiesz...

    to wtedy będzie tak przy wynik_adc-730

    730-820= -90
    -90 *100 = -9000

    360-820 = -460

    -9000 / -460 = 1 czyli ADC_gleba powinna być 1 chyba że zaokragli do 2


    Autor postu otrzymał pochwałę


    Ostatnio edytowano 3 wrz 2020, o 20:54 przez daro0606, łącznie edytowano 3 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 wrz 2020, o 20:38 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2012
    Posty: 712
    Lokalizacja: Opole
    Pomógł: 23

    daro0606 napisał(a):
    Zmień wszystkie typy danych na int32_t to może zrozumiesz...


    Rozumiem że nie masz na myśli również zmiennych? Bo tam nie widzę sensu zmiany.

    Jeszcze teraz patrze czy to nie jest problemem, bo wynik wyrzucam do uartu za pomocą mirkowej funkcji uart_putlong tyle że ona za parametr przyjmuje uint32_t.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO