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



Teraz jest 23 gru 2024, o 06:01


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 28 ] 
Autor Wiadomość
PostNapisane: 14 lut 2015, o 11:17 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

Witam,

Mam trochę czasu i zacząłem zabawę z czujnikiem wilgotności gleby. Niestety nie mogę dojść co robię źle. A mianowicie po włożeniu czujnika do szklanki z wodą otrzymuje "61.19Wilgotnosc:397%" czyli wilgotność wynośi 231%, what? a jak wyjmę z wody i trzymam "w powietrzu" to pokazuje " 0.00Wilgotnosc:1023%"
W którym miejscu jest błąd? Pozdrawiam

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 11:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

A co to za czujnik? Patrząc na Twój kod nie wiem dlaczego od odczytu odejmujesz 1023 i jeszcze potem wszystko dzielisz na 10.23 i w dodatku mnożysz razy minus jeden (nie powinno to -1 być w nawiasie?). Musiałbyś pokazać specyfikacje czujnika żeby dało się pomóc. Bez tego mogę strzelać, że w wyniku odejmowania dostajesz coś co nie powinno być takowe.

I może jakiś schemat podłączenia?

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 11:58 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

WoodPaker napisał(a):
A co to za czujnik? Patrząc na Twój kod nie wiem dlaczego od odczytu odejmujesz 1023 i jeszcze potem wszystko dzielisz na 10.23 i w dodatku mnożysz razy minus jeden (nie powinno to -1 być w nawiasie?). Musiałbyś pokazać specyfikacje czujnika żeby dało się pomóc. Bez tego mogę strzelać, że w wyniku odejmowania dostajesz coś co nie powinno być takowe.

I może jakiś schemat podłączenia?


http://botland.com.pl/czujniki-wilgotno ... gleby.html to jest ten czujnik. Podłączenie to jest raptem 3 kabelki. GND-GND, VCC-5V, A0-A5. A działanie jest dlatego takiego, że dostawałem wartości 1024=0% a 0=100%. Możliwe, że źle jest zrobione działanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 13:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Czyli po prostu ADC. Skoro max jest 1024 to jakim cudem wyszło Ci ponad 100%? Nie znam arduino ale czy używasz liczby ze znakiem? Bo może tu jest problem? Jak dla mnie winieneś odejmować od 1023 wynik pomiaru bez mnożenia przez -1. Zobacz
Dla 0% będziesz miał 1023-1023 czyli zero. Dla ok 10% będzie 1023-921=102 czyli 10%
Itd

------------------------ [ Dodano po: umyciu zębów ]

I pamiętaj nie 1024, a 1023 bo 10bit to 1024 ale od 0 do 1023 ( w sumie 1024 liczby)

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 14:34 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

WoodPaker napisał(a):
Czyli po prostu ADC. Skoro max jest 1024 to jakim cudem wyszło Ci ponad 100%? Nie znam arduino ale czy używasz liczby ze znakiem? Bo może tu jest problem? Jak dla mnie winieneś odejmować od 1023 wynik pomiaru bez mnożenia przez -1. Zobacz
Dla 0% będziesz miał 1023-1023 czyli zero. Dla ok 10% będzie 1023-921=102 czyli 10%
Itd

------------------------ [ Dodano po: umyciu zębów ]

I pamiętaj nie 1024, a 1023 bo 10bit to 1024 ale od 0 do 1023 ( w sumie 1024 liczby)


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


Jest jeszcze gorzej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 15:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Cytuj:
Jest jeszcze gorzej

Dlaczego tak sądzisz
przecież masz linową zależność pomiaru z czujnika
jak byś zrobił dokładnie tak jak radzi kolega @WoodPaker
miałbyś wartości dodatnie i z tego tylko wyliczyć procenty .

Nie twierdzę że to jest wiarygodny (zgodny z rzeczywistym) pomiar wilgotności ale na pewno liniowy
zależny od wilgotności wokół czujnika



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 16:31 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

czyli

o% wilgotności to będzie 1023
100% wilgotności to będzie 0

Tak to mam rozumieć? jeśli dobrze myślę, to czy jest możliwość zamiany wartości poprzez jakieś działanie, gdy jest 100% - 1023, a 0%-0?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 19:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Dokładnie jeśli wynik chcesz mieć w % to
musisz się dowiedzieć jaki procent liczby 1023 jest zmienna "odczyt"
czyli :
((1023-odczyt)*100) / 1023

Mam nadzieję że niczego nie pokręciłem :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 20:00 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

Dane z pomiaru 0Wilgotnosc:1023%
0Wilgotnosc:1023%
0Wilgotnosc:1023%
0Wilgotnosc:1023%
3800Wilgotnosc:985%
3600Wilgotnosc:987%
3400Wilgotnosc:989%
3500Wilgotnosc:988%
3600Wilgotnosc:987%
3800Wilgotnosc:985%
200Wilgotnosc:1021%
3800Wilgotnosc:985%
3900Wilgotnosc:984%
0Wilgotnosc:1023%
0Wilgotnosc:1023%
0Wilgotnosc:1023%



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 20:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

OK, może zacznijmy od tego jaką kolega bartek70 ma rozdzielczość ADC?
Druga rzecz. Żadnego dzielnika nie trzeba gdyż, ponieważ, albowiem (wiem co mówię bo mam ten sam układ) ten układ jeśli podłączymy pod zasilanie procka sam sobie jest sterem i okrętem i żadnego dzielnika nie potrzebuje.
Po trzecie, trzeba pamiętać (co już było wspominane), że niestety ale trzeba kalibrować. Inaczej będzie pokazywać w piasku do którego będziemy nalewać herbaty, a inaczej w ziemi z OBI podlewanej wodą destylowaną.
Po czwarte w III klasie szkoły podstawowej uczą, że np 30 procent z liczby 23 to jest 0,3*23, a co za tym idzie można łatwo przekształcić tak aby odpowiedzieć na pytani "ile procent liczby 23 stanowi 16?".
Otóż (16/23)*100 choć biorąc priorytety wykonywania nawias nie jest potrzebny.
Czyli jeżeli kolega ma 10bit ADC to żeby mieć procent zgodnie z tym wszystkim co na górze (Jakby kolega się wczytał w mój post dokładnie nie trzeba by tłumaczyć -na szczęście Zaba wytłumaczył) to należy zrobić tak ((1023-ADC)/1023)*100 ale jak wiadomo diabeł tkwi w szczegółach. Jaki diabeł? Oczywiście jak na diabła przystało wielki, złośliwy chochlik. Wszyscy używający ośmiobitowców wiedzą jakim problemem jest dzielenie typu float... No ale to już było tłumaczone tysiące razy i w dodatku nasz forumoutrzymywacz musi zarobić na utrzymanie forum bo takie jest prawo ekonomii więc bez tłumaczenia odsyłam do Niebieskiej Książki ( http://atnel.pl/mikrokontrolery-avr-jezyk-c.html ) gdzie jest to wytłumaczone.


Autor postu otrzymał pochwałę

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 21:16 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

WoodPaker napisał(a):
OK, może zacznijmy od tego jaką kolega bartek70 ma rozdzielczość ADC?
Druga rzecz. Żadnego dzielnika nie trzeba gdyż, ponieważ, albowiem (wiem co mówię bo mam ten sam układ) ten układ jeśli podłączymy pod zasilanie procka sam sobie jest sterem i okrętem i żadnego dzielnika nie potrzebuje.
Po trzecie, trzeba pamiętać (co już było wspominane), że niestety ale trzeba kalibrować. Inaczej będzie pokazywać w piasku do którego będziemy nalewać herbaty, a inaczej w ziemi z OBI podlewanej wodą destylowaną.
Po czwarte w III klasie szkoły podstawowej uczą, że np 30 procent z liczby 23 to jest 0,3*23, a co za tym idzie można łatwo przekształcić tak aby odpowiedzieć na pytani "ile procent liczby 23 stanowi 16?".
Otóż (16/23)*100 choć biorąc priorytety wykonywania nawias nie jest potrzebny.
Czyli jeżeli kolega ma 10bit ADC to żeby mieć procent zgodnie z tym wszystkim co na górze (Jakby kolega się wczytał w mój post dokładnie nie trzeba by tłumaczyć -na szczęście Zaba wytłumaczył) to należy zrobić tak ((1023-ADC)/1023)*100 ale jak wiadomo diabeł tkwi w szczegółach. Jaki diabeł? Oczywiście jak na diabła przystało wielki, złośliwy chochlik. Wszyscy używający ośmiobitowców wiedzą jakim problemem jest dzielenie typu float... No ale to już było tłumaczone tysiące razy i w dodatku nasz forumoutrzymywacz musi zarobić na utrzymanie forum bo takie jest prawo ekonomii więc bez tłumaczenia odsyłam do Niebieskiej Książki ( http://atnel.pl/mikrokontrolery-avr-jezyk-c.html ) gdzie jest to wytłumaczone.


Czyli mam szukać diabła i przy okazji zamówić książkę do nauki :idea: ((1023-ADC)/1023)*100

------------------------ [ Dodano po: kilkunastu sekundach ]

Dziękuje za okazaną pomoc i cierpliwość ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 21:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Diabłem jest działanie na liczbach zmiennoprzecinkowych. Łatwiej działa się na liczbach całkowitych. Ale o tym jak pisałem już było na forum i to też w kontekście ADC (jakbym pamiętał gdzie to dałbym linki ale może ktoś, coś?), a na pewno jest także w BB.

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 21:38 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

czyli powinno byc ((1023-1024/1023)*100?Arduino ma 10-bitowy ADC (1024).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 21:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Nie, wg tego co piszesz w programie to raczej ((1023-odczyt)/1023)*100. W tym wypadku nawiasy są ważne bo 1023-2 /100 to nie to samo co (1023-3)/100. :) Najpierw dzielenie potem odejmowanie. Priorytety w matematyce w C także działają.


Autor postu otrzymał pochwałę

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 22:31 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

Obrazek

Nadal coś jest źle :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 22:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Pewnie dlatego, że działasz na liczbach całkowitych.

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 22:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Może zmień na taką postać
((1023-odczyt)*100) / 1023
lub
(((100*(1023-odczyt)) /1023) * 100) / 100
wiem że matematycznie to masło maślane,
chodzi mi o to aby wynik dzielenia całkowitego nie był mniejszy niż zero bo wtedy tracisz część ułamkową
i mnożenie przez 100 da zero



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 23:23 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

ani jedna ani druga opcja :/ Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2015, o 23:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Na zrzucie z ekranu widać jak w wywołaniu funkcji
Serial.print ((1023-odczyt)*100 / 1023 ;
masz na końcu średnik a nie widać nawiasu zamykającego.
Nie znam się na Arduino ale chyba tam średnika nie powinno być



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2015, o 00:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

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

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


Czyli na konsole wysyłane masz wynik działania cośtam bez dzielenia na 1023 :)
Winno być
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 2 minutach ]

i poczytaj jeszcze to http://mirekk36.blogspot.com/2012/08/av ... u-int.html
http://atnel.pl/domyslna-promocja-do-typu-int.html

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2015, o 12:52 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2015, o 13:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

a nie lepiej po prostu to obliczyć w innej zmiennej? Nawet niech będzie to float

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



Albo z promocją na unsigned int

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

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2015, o 15:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Możesz też wyświetlać orientacyjny poziom wilgotności
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2015, o 17:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

I pochwal się czy zadziałało bo czekam z zapartym. sto...tchem

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2015, o 19:08 
Offline
Użytkownik

Dołączył(a): 19 sie 2014
Posty: 32
Pomógł: 0

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


rezultat
Obrazek

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


rezultat Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2015, o 21:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Prawdopodobnie wszystko się miesza przez niejawne rzutowanie do typu int
w tym wyrażeniu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


żeby uzyskać działania na liczbach float
nie wiem czy to zadziała ale możesz sprawdzić



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lut 2015, o 23:18 
Offline
Nowy

Dołączył(a): 23 sie 2012
Posty: 6
Pomógł: 0

WoodPaker napisał(a):
ech...
Właśnie coś zobaczyłem
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


Czyli na konsole wysyłane masz wynik działania cośtam bez dzielenia na 1023 :)
Winno być
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




Cofnijmy się trochę. Jeśli w następnym poście po powyższych poprawkach WoodPakera są nowe wyniki to zaczęło wtedy działać, przynajmniej dla obliczeń nie przekraczających zakresu typu int.
Kolega wysyła w mylącej kolejności wyniki na port szeregowy. Najpierw jest wynik obliczeń, później słowo "Wilgotność:' i pomiar z ADC.
W arduino uno liczby int są dwu bajtowe czyli od -32768 do 32767. I na tym typie są prowadzone obliczenia w powyższym przykładzie.
Weźmy linijkę:
-5Wilgotnosc:425
(1023-425)*100/1023 = 598*100/1023 = -5735/1023 = -5

Zresztą wszystko działało już w pierwszym poście. Wynik "61.19Wilgotnosc:397%" należy czytać 61,19% wilgotności, odczyt ADC=397.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lut 2015, o 00:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Też to widziałem i wysłałem PW do kolegi. Myślałem, że pochwali się wynikami ale... Chyba zapomniał

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



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: 28 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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