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



Teraz jest 23 mar 2026, o 08:34


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
 Tytuł: DHT22 - problem
PostNapisane: 27 gru 2015, o 17:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

Witam!
Mam problem z jednorazowym odczytem temperatury i wilgotności z czujnika DHT22. Korzystam z ogólniedostępnej biblioteki Davide Gironi, 2012, źródło: http://code.google.com/p/davidegironi/d ... dht_03.zip
Program przykładowy zamieszczony wraz z kodem bibliotek działa dobrze i odczytuje w pętli dane z czujnika.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Chciałbym jednak, aby dane odczytane były tylko jednorazowo gdy spełniony jest pewien warunek np. if(wywolanie==50) odczyt. Jak korzystać z funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Proszę o pomoc
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 17:52 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

No ale co Ci się dzieje?
Bo skoro działa w pętli głównej to dlaczego ma nie działać jednorazowe wywołanie?

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 18:19 
Offline
Użytkownik

Dołączył(a): 05 kwi 2014
Posty: 339
Pomógł: 10

hej
to zrób tak:

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


Jeśli ta funkcja działa, to dostaniesz to co chcesz.

Ale proponuje zrobić coś jeszcze, dodaj jeden bit, który będzie ustawiany na starcie tej funkcji, aby nie byli sytuacji, ze Twoje "wywołanie" będzie w ciągu kilku sekund cały czas wywoływało dht_gettemperature.


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


DTHbit == 1 ustawiaj gdzieś przed ta zależnością (wywolanie==50).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 21:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

wchpikus napisał(a):
Ale proponuje zrobić coś jeszcze, dodaj jeden bit, który będzie ustawiany na starcie tej funkcji, aby nie byli sytuacji, ze Twoje "wywołanie" będzie w ciągu kilku sekund cały czas wywoływało dht_gettemperature.

Bardzo dziękuję za porady. Ta powyżej jest szczególnie cenna bo rozwiązała mój "nierozwiązywalny" problem z "maszyną stanów".

Co do czujnika DHT22 nadal mam problem z jednorazowym odczytem w "maszynie stanów". Co zrobiłem. Program poniżej prawidłowo podaje temperaturę i wilgotność przy starcie (listing 1), ale już jego implementacja w "maszynie stanów" daje wynik "error" (UART) i 0, 0 na LCD oraz powoduje "rozjechanie się" programu (listing 2) O czym zapomniałem?

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

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

DHTBit == 1 na starcie.

------------------------ [ Dodano po: 45 minutach ]

Doczytałem, że cały proces komunikacji z czujnikiem trwa powyżej 2s http://www.tinkerduck.com/dht22-sensor-fun/ Moje wywołania powtarzają się co 1 sekundę, więc to za mało na pomiar (wystarczy na odczyt). Przeniosłem więc funkcję pomiaru do main, przed pętlę while(1) co dało prawidłowy odczyt z czujnika po spełnieniu warunku if(wywolanie == 53), ale niestety jednorazowy. Pomiar musi się powtarzać co 2 sekundy w jakiejś części programu. Czy macie szanowni Koledzy jakiś pomysł?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2015, o 07:26 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

A co jeszcze masz w projekcie?
Jak ma być program nieblokujący:
Jeżeli masz jakiś RTC to w każdym przerwaniu (co sekundę)
zwiększasz flagę i sprawdzasz czy jest == 2 jeśli tak wywołujesz pomiar
i zerujesz flagę.
Jeśli RTC brak to tworzysz timer programowy.

Jak ma być program blokujący i nic więcej nie robi to...
wystarczy zwykły paskudny delay_ms (Ale tego lepiej nie robić)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2015, o 07:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

MirkoT napisał(a):
A co jeszcze masz w projekcie?
Jak ma być program nieblokujący:
Jeżeli masz jakiś RTC to w każdym przerwaniu (co sekundę)
zwiększasz flagę i sprawdzasz czy jest == 2 jeśli tak wywołujesz pomiar
i zerujesz flagę.
Jeśli RTC brak to tworzysz timer programowy.

Dziękuję. Projekt nieblokujący zegara GPS oparty jest na eventach, a i Timery programowe działają. Chodzi mi głównie o lokalizację pomiaru w programie. Gdzie umieścić ten warunek z flagą (flaga == 2). Czy warunek ten należy sprawdzać w pętli while!(1)?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2015, o 07:48 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Pokazałeś tylko kawałek kodu.
Możesz umieścić w dowolnym miejscu
Np. w pętli while(1)
Albo możesz w pętli while(1) umieścić event
pomiar_wilgotnosci()
a w nim sprawdzać czy flaga spełnia warunek pomiaru
czyli od ostatniego pomiaru minęły 2 sek.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2015, o 08:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

MirkoT napisał(a):
Albo możesz w pętli while(1) umieścić event
pomiar_wilgotnosci()

Mam w pętli while(1) RTC_EVENT:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Rozumiem, że mogę zrobić tak. Ustalam w RTC_EVENT zmienną lokalną dht2. Po sprawdzeniu sprzętowej flagi INT0 zmienna dht jest zwiększana o jeden. Wstawiam też warunek: if(dht==2) {pomiar}. Czy pomiar ma wyglądać tak:
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: 28 gru 2015, o 08:21 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Tak, ale w ten sposób miałbyś pomiar "ciągły" co 2 sekundy. A tego nie chcesz
Dlatego trzeba sprawdzić 2 warunki
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

w zależności z jakim interwałem spodziewasz się pomiarów musisz tak dobrać
zmienna dht żeby się nie "przekręciła" w najmniej odpowiednim momencie ;-)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2015, o 08:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

MirkoT napisał(a):
Tak, ale w ten sposób miałbyś pomiar "ciągły" co 2 sekundy. A tego nie chcesz
Dlatego trzeba sprawdzić 2 warunki
Składnia: [ Pobierz ] [ Ukryj ]
język c
if(wywolanie == 53 && dht >=2 ) {
   pomiar;
   dht = 0;
}
GeSHi

w zależności z jakim interwałem spodziewasz się pomiarów musisz tak dobrać
zmienna dht żeby się nie "przekręciła" w najmniej odpowiednim momencie


Funkcję pomiar chciałbym umieścić w ciele RTC_EVENT i niech mierzy co 2s. W warunku: if(wywolanie == 53) chciałbym tylko wyświetlić wartość temperatury i wilgotności bez dokonywania pomiaru. (wywolanie == 53) powtarza się w cyklu minutowym. <50 pokazuje czas, gdy 50 - temp1, gdy 52 - temp2, gdy 53 - wilgotność, gdy 59 - wywolanie =0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2015, o 08:52 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

No to jak najbardziej powinno działać.
Jedyne co, to ewentualnie będziesz miał pomiar wilgotności
wykonany 2 sek temu. Ale to chyba nie problem? ;-)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2015, o 09:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

Cytuj:
No to jak najbardziej powinno działać.
Jedyne co, to ewentualnie będziesz miał pomiar wilgotności
wykonany 2 sek temu. Ale to chyba nie problem?

Dzięki. Jak tylko przetestuję (niebawem) dam znać :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2015, o 11:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

Poczyniłem nieznaczny postęp. Rozbudowałem RTC_EVENT w pliku mk_pcf8583.c o odczyt danych z DHT22 co 3 sekundy. Niestety nie wiem jak "zapakować" odczytane dane np. do zmiennej i przekazać do programu głównego celem wyświetlenia. Co wpisać w miejsce pytajników?
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: 28 gru 2015, o 12:13 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Nie analizowałem całego kodu, ale...
rozumiem, że
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

pod wskaźnikami temperature i humidity zwraca to co odczytała z czujnika.
Natomiast jeśli "coś pójdzie źle" jej wynikiem jest -1
Więc tak na prawdę tam gdzie masz pytajniki nic nie musisz robić.
Tylko dobrze by było, żeby "gdzieś" sobie zapamiętać czy ostatni pomiar zakończył
się sukcesem, żeby nie wyświetlać bzdur.

_________________
Jestem początkujący i moje porady mogą być błędne



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

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

w sumie to niczego nie musisz tam wpisywać, wystarczy jeśli zadeklarujesz zmienne temperature i humidity jako globalne, ale jeśli koniecznie chcesz, to możesz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i wyświetlać zmienne: global_temperature i global_humidity.

Pozdrawiam, QuadMan.

P.S. Kolega MirkoT był szybszy :-).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 gru 2015, o 13:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 450
Pomógł: 3

Bardzo dziękuję za pomoc. Odczyt działa, ale przy okazji program się rozjeżdża - przypadkowe synchronizacje zegara, zaburzenia wyświetlania. Co zrobiłem:
W pliku mk_pcf8583.c zmodyfikowałem RTC_EVENT:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W liku mk_pcf8583 udostepniłem zmienne jako extern.
Odczyt danych w programie głównym:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Usunięcie powyższych zmian przywraca integralność działania programu. Droga na pewno dobra i logiczna, ale coś z warunkiem musi być nie tak. Proszę pochylcie się jeszcze nad tym.

Przyjrzałem się bliżej. Nie odświeża danych.

P.S. Po podgrzaniu lampką czujnika zmienia się jednak temperatura i wilgotność. Nie zauważyłem tego z powodu braku miejsc po przecinku i dużej bezwładność pomiaru. Tak więc wydaje się, że działa dobrze. W jaki sposób pokazać miejsca po przecinku dla temperatury z tego czujnika (w celach obserwacyjnych) ;)

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

Dziękuję jeszcze raz Wszystkim i pozdrawiam



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO