Witam '######################## DHT-22 Humidity & Temperature Sensor#################### ' DHT-22 ' ' |-----o-- Vcc ' | | ' | - ' | 10k ' | - ' | | ' |-----o-- Data ~~~ PC0 (?C) ' | ' |-------- NC ' | ' |-------- GND ' ' Timings: Bit = 0 ~ 28 ?s / Bit = 1 ~ 70 ?s ' Min_time = 28 ?s < TCNT0 Value (ticks) < 70 ?s (in ticks) ' every time > Min_time >>> Bit = 1 ' every time < Min_time >>> Bit = 0 ' ' Min_time ~ 20 (ticks) for 3.6864 MHz ' ' ~ ticks for Bit = 0: 26 ?s * $crystal (in MHz) / Prescale = 460800*0,000026=11,96 dla mojej częstotliwoąsi ==26 ' ~ ticks for Bit = 1: 70 ?s * $crystal (in MHz) / Prescale = 460800*0,000070=32,25 dla mojej częstotliwości ==70 ' zmieniłem Min_time z 20 na 48 ' '######################## DHT-22 Humidity & Temperature Sensor#################### $regfile = "m8def.dat" '$crystal = 3686400 $crystal = 8000000 'taktowanie '$baud = 115200 'Liczba określająca szybkość pracy łącza RS 232 w bitach na sekundę (bod) 'stała określająca rozmiar wybranego stosu '$hwstack = 64 '$swstack = 64 '$framesize = 64 '##################################### Config Pind.1 = Input Config Timer0 = Timer , Prescale = 8 Config Lcd = 16 * 2 'konfiguracja typu wyświetlacza 'LCD Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2 'konfiguracja linii 'mikrokontrolera, do których 'dołączono wyświetlacz 'LCD '##################################### 'Const Min_time = 20 Const Min_time = 48 'this has to be changed according to your frequency settings in $crystal Dim Count As Byte Dim Signaltime(43) As Byte Dim Humidityw As Word Dim Temperaturew As Word Dim Humsens_chksum As Byte Dim Humiditys As String * 16 Dim Temperatures As String * 16 '##################################### Declare Sub Read_timings Declare Sub Humtemp_values Declare Function Compare_chksum(byval Hsens_humidity As Word , Byval Hsens_temperature As Word , Byval Hsens_chksum As Byte) As Byte '##################################### Main loop Do Call Humtemp_values ' If Compare_chksum(humidityw , Temperaturew , Humsens_chksum) = 1 Then Humiditys = Str(humidityw) Temperatures = Str(temperaturew) Cls Lcd "wilg: " ; Format(humiditys , "0.0") ; " %" Lowerline Lcd "Temp: " ; Format(temperatures , "0.0") ; " deg" Waitms 100 'Else ' Lcd "Read Error" 'End If Loop End '############################################################# Read timings ' measure time (in ticks) for signal = high (Start / Stop TIMER0) ' 1st two measurements do not contain sensor values Sub Read_timings Wait 3 Count = 1 Config Pind.1 = Output : Portc.0 = 0 ' request data Waitms 20 ' wait 20 ms Config Pind.1 = Input ' wait for data, receive data While Count < 43 'collect 42 timings / signals Bitwait Pind.1 , Set 'signal goes high > start timer Start Timer0 Bitwait Pind.1 , Reset 'signal goes low > stop timer Stop Timer0 Signaltime(count) = Tcnt0 'store number of ticks per signal in Signaltime byte Tcnt0 = 0 Incr Count Wend End Sub '############################################################# Humidity and temperature values ' transform timings into bits (40 timings > 40 Bits) ' every time (in ticks) > Min_time >>> Bit = 1 ' every time (in ticks) < Min_time >>> Bit = 0 ' first word contains humidity ' second word contains temperature ' last byte contains checksum Sub Humtemp_values Local X As Byte Humidityw = 0 Temperaturew = 0 Humsens_chksum = 0 Call Read_timings For Count = 3 To 42 ' skip first two Select Case Count Case 3 To 18 X = 18 - Count If Signaltime(count) > Min_time Then Toggle Humidityw.x Case 19 To 34 X = 34 - Count If Signaltime(count) > Min_time Then Toggle Temperaturew.x Case 34 To 42 X = 42 - Count If Signaltime(count) > Min_time Then Toggle Humsens_chksum.x End Select Next End Sub '############################################################# Calculate Checksum and compare with trasnmitted value Function Compare_chksum(byval Hsens_humidity As Word , Byval Hsens_temperature As Word , Byval Hsens_chksum As Byte) As Byte Local Chksum As Byte Chksum = Low(hsens_humidity ) + High(hsens_humidity ) Chksum = Chksum + Low(hsens_temperature) Chksum = Chksum + High(hsens_temperature) If Chksum = Hsens_chksum Then Compare_chksum = 1 Else Compare_chksum = 0 End If End Function Problem jest następujący, gdy wgram program w zamieszczonej wersji to działa. Wskazuje w miarę wiarygodną temp, niestety nie mogę sprawdzić jak to się ma z wilgotnością. Natomiast, gdy w pętli głównej wstawię instrukcje If to wyskakuje na wyświetlaczu Read Error. Czy ta funkcja jest potrzebna w tym programie? Przypuszczam, że kontroluje poprawność pomiarów. Jeśli tak to, co jest z nią nie tak?
|
|||
Re: DHT22
Opcja według mnie sprawdza poprawnośc odczytanych danych i poprostu blokuje wyświetlanie jeśli się pojawiają bzdury. Może samo to sprawdzanie sumy kontrolnej jest błędne. Można by próbowac wypisac na LCD wartości obliczonej i odczytanej sumy kontrolnej i zobaczyć co się pokazuje. Pewnie w pdf od czujnika będzie podany wzór na sumę kontrolną, warto go sprawdzić
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
re DHT22
Jeden błąd to
Drugie Case powinno zaczynać się od 35. Ale musi być coś jeszcze bo nic to nie zmieniło.
Komunikacja wygląda następująco
"DATA=8 bit integral RH data+8 bit decimal RH data+8 bit integral T data+8 bit decimal T data+8 bit checksum
If the data transmission is right, check-sum should be the last 8 bit of "8 bit integral RH data+8 bit decimal RH
data+8 bit integral T data+8 bit decimal T data."
Według tego funkcja do obliczania sumy kontrolnej jest dobra. Sprawdzałem ją na oryginałach to się znaczy wstawiłem w pętle Do coś takiego
Czyli sprawdziłem na orginałach i liczby były sobie równe. Z tego wynika że komunikacja jest ok tylko coś jest z tą funkcją nie tak.
Jak sprawdziłem w funkcji to Hsens_chksum jest ok ale przy wyświetleniu Hsens_humidity oraz Hsens_temperature wyskakuje 0 tylko dlaczego? Zmienne te nie mogą być typu Word?
Re: funkcje
Nie mam za dużego doswiadczenia z funkcjami w bascom..... spróbuj wywalić tą funkcję i wrzucić etykietę i zmienne globalne. Probram jest krótki i na pewno nie zaciemni Ci to obrazu całości a będzie działać
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.
re DHT22
Zrobiłem zanstępijąco:
Skopiowałem zawartość funkcji do pętli Do
za ifem
Skasowałem Compare_chksum = 1 i wpisałem tu Lcd "wilg"......
dla else zrobiłem Lcd "error"
Usunełem funkcje, zmianiłem zmienne i działa.
Dzięki za pomoc
Mógłbyś wrzucić cały kod po
Mógłbyś wrzucić cały kod po poprawkach? Szukam jakiegoś wilgotnościomierza.
Sprawdzony działający kod z
Sprawdzony działający kod z moim opisem:
zaczerpnięty ze strony Wiktora -> AVRproject.ru
powodzenia
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Dzieki za kod pewnie nie
Dzieki za kod pewnie nie jednemu się przyda.Musze kupic ten czujnik i sie pobawić z nim,ale cos czuje ze do większego projektu to będę miał ciężko go zaadoptować:)Trzeba sie będzie poduczyć.
Ależ proszę (-; Wielkość
Ależ proszę (-;
Wielkość projektu jest bez znaczenia jedyne co by mogło zawadzać to te waitus.
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
DHT22
Zrobiłem sobie programik na podstawie mojego działającego kodu i obsługuje on 3 DHT22.
Za pomocą przycisku można zmieniać wyświetlane wartości z 1, 2 lub 3 DHT. Przycisk obsługiwany jest instrukcją
W etykiecie zmiana jest zwiększanie zmiennej odpowiadającej za wyświetlanie odpowiednich wartości. Program bez obsługi DHT działa szybko, to znaczy przyciśnięcie przycisku powoduje dość szybką zmianę wyświetlanych wartości. Po dołożeniu obsługi 3 x DHT i naciśnięciu przycisku trzeba długo czekać na zmianę wyświetlanych wartości. Przypuszczam że spowodowane jest to czasem sczytywania danych z trzech DHT. Jest jakaś możliwość przyspieszenia pracy przycisku (szybsza reakcja taka jak bez DHT). Zmiana kwarcu na 16MHz coś pomoże?
Nie tędy droga
Opóźnienia spowodowane są "sposobem" obsługi czujników, zwiększenie szybkości wykonywania programu nie zmieni szybkości dekodowania danych i z resztą nie może bo bzdury by wyszły.
Zmień ideologię programu, np odczytuj pomiary co minutę, lub rzadziej i prezentuj je ze zmiennych, a nie bezpośrednio z czujnika.
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
TIMERY
Czy w beskomie można korzystać z obu timerów jednocześcnie to się znaczy.
Tomer 1 służy do obsługi DHT konkretnie do odmierzania czasu trwania kolejnych bitów.
Timer0 służy do odmierzania czasu między kolejnymi odczytami z DHT.
Program korzysta jeszcze z ADC i wszystko było dobrze dopóki nie skorzystałem z Timera0. Jak wstawiłem go do programu to po pewnym czasie od włączenia program zaczyna świrować poczym się zawiesza.
Czy może być tak że jeszcze
Czy może być tak że jeszcze jakieś funkcje bascom, które być może wykorzystujesz działają na podstawie jednego z użytych timerów?
Przerób program przerwania, by tylko i wyłącznie jednym timerem odmierzać oba czasy, np przez wprowadzenie dodatkowego podziału. Gdy 8ms3 osiągnie maksymalną wartość, inkrementuj dodatkową zmienną do odmierzania czasu. W razie potrzeby czynność możesz powtórzyć wielokrotnie.
W obsłudze przerwania timera nie ładujesz wartości początkowej, odmierzane odcinki czasu nie są równe z pierwszym.
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Wykonuje jeszcze, co pewien
Wykonuje jeszcze, co pewien czas zapis parametrów odczytywanych do tablicy i zapis parametrów ustawionych Writeeeprom.
Tylko jak to zrobić gdy przy obsłudze DHT wykonywane są komendy start i stop timer oraz zerowanie jego wartości?
A co trzeba przerobić w tym twoim programie gdy mam DHT22 podłączonego pod PinA.3 bo widziałem ze do jego obsługi nie jes potrzebny timer. Zrobiłem tak i coś mi nie działa.
tak w ciemno powiem -
tak w ciemno powiem - ustawienia fuse bits posprawdzaj
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
A konkretnie to które bity?
A konkretnie to które bity? Bo inne programy na tej atmedze 32 chodzą.
ustawienia fuse bits
Przed chwilką znalazłem taką ściągawkę.
Mówiąc wcześniej o ustawieniu tych bitów zastanawiałem się gdzie jest jtag bo firmowo jest zawsze załączony, i czasem "przeszkadza". Ale wyprowadzenia tego interfejsu dotyczą części portu C. Więc wypada zapytać czym objawia się nie działanie.
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Jtag wyłączyłem, pozatym jak
Jtag wyłączyłem, pozatym jak wgrywam mój program to jest wszystko ok. W twoim zmieniłem tylko
Niweiem tylko jakie zadanie ma ta ostatnia komęda "Dht_io_set Alias Ddra.3" bo było "Dht_io_set Alias Ddrd.6"
DRD to rejestr odpowiedzialny
DRD to rejestr odpowiedzialny za konfigurację pinów IO, zapisy równoznaczne z np Config Pind.1 = Output/Input.
W tym programie pin do komunikacji z DHT raz jest wejściem a razy wyjściem, i stąd to.
$baud = 19200 -> niepotrzebne jeśli z uart nie korzystasz - nie powinno zawadzać.
Dalej nie określiłeś czym objawia się nie działanie.
Poczytaj czy pin wybrany nie ma jakichś "super" właściwości, bądź spróbuj na innym. Oraz sprawdź czy w "fusach" dobrze nastawione 8MHz.
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Na wyświetlaczu pokazuje się
Na wyświetlaczu pokazuje się TMP:0C ; PHP:3% czyli błąd sumy kontrolnej.
Jak postępy?
Czy doszedłeś do przyczyny dysfunkcji?
Jakiego typu czujników używasz?
... doczytałem masz DHT22, warto sprawdzić "timingi" czy są jakieś różnice w stosunku do DHT11, z którym ten program działa prawidłowo. I w razie potrzeby poprawić czasy oczekiwań, itp.
.... elementy mogą nie być zgodne i z tego tytułu pewno masz problem
porównanie
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Jak postępy?
Też właśnie zmontowałem ten układzik używając dht22 i atmegi8L. Z tym kodem co podałeś czasy sie zgadzają tylko dht22 może mieć mkrótszy startup ale to wszystko jedno jak jest dłuższy. Też mi pokazuje tmp:0C i php:3% Fusy sie zgadzają jest na 8mhz. W momencie gdy usunąłem cześć kodu w której odbywa się sprawdzanie liczby kontrolnej wyświetla mi tmp:0C iphp"2%. Uszkodzony jest chyba czujnik? Jak chuchnąłem na czujnik to przez chwile pokazywał tmp:1C i php:3%.
No to trzeba wyjaśnić wkońcu ((-;
Więc ujawnijmy podstawowe różnice pomiędzy dwoma rodzajami sensorów DHT11 i DHT22 (AM2301)
DHT11
DHT22
z tego co jest istotne to widzę zakres i rozdzielczość dokonywanych pomiarów oraz ich precyzja. Dla nas ma znaczenie rozdzielczość z tytułu na różny sposób między sensorami kodowania danych. I z tego tytułu po podmianie programów wychodziły dziwne rzeczy.
no więc jak wiesz/wiecie, każdy sensor "wypluwa" 40 bitów z których powstają 5 słów bajtowych. Licząc od części najbardziej znaczącej, każdy produkuje dwa bajty z wilgotnością, kolejnie dwa bajty z temperaturą i bajt z sumą kontrolną. I tu kończą się zgodności.
DHT11 ponieważ ma rozdzielczość 1 nie generuje części dziesiętnej (ułamkowej), która zawsze jest równa zero, zarówno przy temperaturze jak i wilgotności. Więc autor programu, który zamieściłem zignorował więc przetwarzanie tego bajtu, dla jego uproszczenia.
Na potwierdzenie mojej teorii w nocie wyczytamy:
Czyli sensor wysyła najpierw część całkowitą, a potem dziesiętną zawsze równą zero.
DHT22 ten ma rozdzielczość jedną dziesiątą i trochę inaczej dane są upychane w tych 16 bitach, co można łatwo obejrzeć w nocie. Dla przykładu temperatura 23,4 stopnie Celsjusza kodowana jest jako liczba 234, i trzeba sobie wstawić w odpowiednie miejsce przecinek. Dokładnie to widać w programie zamieszczonym przez michal512. Dlatego dla zapisu tak dużej liczby potrzeba nierozłącznych dwóch bajtów.
To co jest istotne, to sposób "kodowania" temperatury ujemnej w sensorze, który ją umie mierzyć. Przedstawiony program nie zawiera jej obsługi. Znacznik "mrozów" to bit nr 24 (najstarszy bit temperatury), gdy jest ustawiony oznacza, że jako wynik dostaliśmy wartość ujemną. Należało by badać jego wystąpienie i przedsięwziąć odpowiednią akcję.
Jak dla mnie program mniej elegancki na instrukcji waitus jest bardziej interesujący do wykorzystania w małym ?C, pochłania mniej zasobów ?C, i generuje mniejszą binarkę, ale jest mniej ciekawszy. Natomiast program z funkcjami i procedurami jest bardziej "edukacyjny" ale ma jedną niedogodność - bitwait. W przypadku problemów "z łącznością" program może pójść w maliny i warto by tu zastosować watchdog-a, aby temu zapobiec. Co zeżre oczywiście następne bajty pamięci flash. W przypadku chwilowego rozłączenia sensor "wysypie" swoje bity, a ?C będzie czekał w nieskończoność na wystąpienie stosownego bitu.
kaktus
ps do kolekcji DHT11 zakupiłem sobie DHT22 i się pewno pobawię ((-;
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Udało się.
Na te dziesiętne wpadłem wcześniej ale zapisywałem je jako oddzielne bity(korzystałem z jakiejś badziewnej noty katalogowej). Posiedziałem troche nad kodem i oto co zrobiłem
Wszystko działa póki co
pozdrawiam
20 zł gratis za rejestracje
termostat?
Teraz czy mógłby mi któś pomóc w budowie termostatu na podstawie tego. Chodzi mi o to żeby niezależnie od głównej pętli działała jeszcze pętla sprawdzająca h i t i podająca stan wysoki na wybranych wyjściach
coś w stylu:
20 zł gratis za rejestracje
((-;
Nie ma jak samodzielna praca.
Zwróć jeszcze uwagę jak ciekawie autor chyba drugiego kodu ominął dzielenie, przy wyświetlaniu wyniku, które jest mordęgą dla 8-śmio bitowego ?C. Po prostu formatuje string-a przy wyświetlaniu ((-;
jak cyferki niepotrzebne to jest to bardzo sprytne rozwiązanie. Czy potrzebujesz do czegoś część dziesiętną - widzę że ją specjalnie obliczasz, aaaaa już widzę ukryta konwersja typu zmiennej ((-; kompilator robi ją za Ciebie:
zdaje się dzielenie daje zawsze wynik "rzeczywisty".
wnioski pozostawiam Tobie.
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
heeee
Moje pytanie, o cyfry, ubiegłeś kolejną wypowiedzią. (-;
Przejdźmy do Twojego termostatu.
Wszystko już sam zrobiłeś, w pętli głównej możesz dołączyć twoje warunki testujące wartość temperatury i ustawiające piny IO.
ALE
zauważ co się będzie działo gdy temperatura będzie na pograniczu progu przełączenia ...
ja bym to zrobił tak:
odczyt temperatury (czujnika) np co minutę (lub pewien interwał czasu)
test wartości i kontrola pinów IO co dwie minuty lub rzadziej.
W tym celu musiałbyś "zorganizować" jakiś "patent" na bardziej lub mniej dokładne odliczanie czasu.
Niektórzy robią to przez inkrementację zmiennej za każdym wykonaniem pętli głównej programu - to gdy nie trzeba dokładnego pomiaru czasu, a Mirley zdaje się ładnie przedstawił gdzieś domierzanie czasu na timerze.
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Dziwny odczyt
Czy liczba dziesiętna jest w tym przypadku dobrze obliczona? Pytam bo na wyświetlaczu cały czas liczba dziesiętna jest równa liczbie jednostek np 25,5 albo 47,7 nie osiąga takich wartości jak np. 25,3. Czy możliwe jest że chińczyki się po prostu wycwaniły?
20 zł gratis za rejestracje
((-;
Musiałbyś rozwinąć co znaczy dobrze, w twoim mniemaniu. Program działa prawidłowo i sensor też. ((-;
Z wypowiedzi wnioskuję że programista miał na myśli coś innego, od uzyskanego rezultatu.
Rozwiązanie 1
zmień typ liczby T na rzeczywistą, drugie obliczenia powinny być wtedy zbędne.
Rozwiązanie 2
zamień kolejnością te dwie linie. ((-;
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Ok
Rozwiązanie 2 zadziałało najpierw trzeba obliczyć Ti i Hi a potem dopiero H i T . Przynajmniej w tym przypadku.
Dzięki wielkie.
20 zł gratis za rejestracje
Coś nie działa
Koledzy potrzebuję porady :) . Generalnie to zajmuje się elektroniką zupełnie amatorsko i dla przyjemności. Powoli zgłębiam Bascoma ale dłuuuuga droga przede mną jeszcze stąd moje może naiwne pytania. OK, ale do rzeczy.
Zrobiłem sobie ten higrometr na postawie informacji stąd i z sieci. Załączam mój schemat. Układ zmontowałem, wgrałem program do ATMegi8 (ten z posta nr 23). Po włączeniu zasilania układ startuje, na wyświetlaczu pojawiają się napisy jak trzeba, potem przechodzi to wskazań Temp i PHP i tu niezależnie czy włączony jest czujnik DHT22 czy układ rusza bez czujnika wskazania Temp = O st.C a PHP 2%.
Zerknijcie proszę na schemat czy jest poprawny i zasugerujcie co powinienem zrobić/sprawdzić żeby układ jednak zadziałał.
Czy w atmedze muszę ustawiać jakoś fusy bo na razie to wgrałem program a fusy zostawione są "fabryczne" ?
Dzięki za sugestie i wyrozumiałość dla "zielonego" ;)
[img]Uploaded with ImageShack.com[/img]
Kamil
Sam obczaiłeś przyczynę niedziałania
Piszesz:
i masz 100% rację..
zauważ co w programie pisze - jakie są deklaracje
Widzę dwa rozwiązania albo poprawisz drugą linię na taktowanie którego używasz, albo przestawisz fusebits tak aby było zgodnie z deklaracją.
Rezonator zewnętrzny w chwili obecnej nie jest używany przez "Twój" program. Też się to nastawia za pomocą fusebits.
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Dzięki za podpowiedź.Skoro
Dzięki za podpowiedź.
Skoro już mam w układzie zewnętrzny rezonator to go wykorzystam :)
Czyli żeby włączyć zewnętrzny rez. 8MHz ustawiam fusy następująco:
RSTDISBL = 1 (niezaznaczony)
WDTON = 1 (niezaznaczony)
SPIEN = 0 (zaznaczony)
CKOPT = 0 (zaznaczony)
EESAVE = 1 (niezaznaczony)
BOOTSZ1 = 0 (zaznaczony)
BOOTSZ0 = 0 (zaznaczony)
BOOTRST = 1 (niezaznaczony)
BODLEVEL = 1 (niezaznaczony)
BODEN = 1 (niezaznaczony)
SUT1 = 1 (niezaznaczony)
SUT0 = 0 (zaznaczony)
CKSEL3 = 1 (niezaznaczony)
CKSEL2 = 1 (niezaznaczony)
CKSEL1 = 1 (niezaznaczony)
CKSEL0 = 1 (niezaznaczony)
Dobrze myślę ?
Kamil
ściągnij sobie
ściągnij sobie mkavrCalkulator dla M8 jest on darmowy tam bez żadnych pomyłek ustawisz sobie fusy.
Temperatury ujemne
Dzięki za mkavrCalculator.
Układ już działa :)
Mam natomiast inny problem a jeszcze nie radzę sobie z Bascomem najlepiej więc proszę Was o radę.
Chcę sobie używać tego wilgotościomierza i termometru na zewnątrz. Dziś dla pewności wsadziłem czujnik do lodówki i niestety po przejściu poniżej zera termometr zwariował i pokazywał jakieś 3480 stC.
Podpowiedzcie jak przerobić ten kod (z posta nr 23 kolegi mijur) tak żeby wskazywał temperatury ujemne.
Kamil
wypowiedź 22
Moja wypowiedź -post nr 22 porusza ten problem, poczytaj jak coś będzie niejasne daj znać.
kaktus
re. wypowiedź 22
Kombinuje jak umiem ale jak wspomniałem jestem na początku drogi z Bascomem :), analizuję program i wspomagam się podręcznikiem "Programowanie uC AVR w jezyku Bascom". Jednak nie rozumiem jeszcze:
- skąd wyciągnąć ten bajt 24
- jak rozpoznać, że jest ustawiony
- jak miałaby wyglądać instrukcja dla uC
Jeśli mógłbys mi cokolwiek podpowiedziec będę wdzięczny.
Czy powinienem zacząć od instrukcji warunkowych i wyboru "If...Then..." ?
Np If T.23 = (nie mam pojęcia jaka wartoś miałaby tu być) Then (jakaś instrukcja) ?
Proszę o wyrozumiałość i jeśli masz chęć o wskazanie drogi :)
Kamil
Ustawienie wilgotności
Witam
Chciałbym móc zmieniać żądaną wilgotność przez przycisk czy ten kod mi w tym pomoże ?
Ustawienie wilgotności
Witam
Chciałbym móc zmieniać żądaną wilgotność przez przycisk czy ten kod mi w tym pomoże ?
Ustawienie wilgotności
Witam
Chciałbym móc zmieniać żądaną wilgotność przez przycisk czy ten kod mi w tym pomoże ?
yin@yang
Już tam nie przesadzaj, bo udowodniłeś że doskonale potrafisz analizować i myślisz przy tym logicznie.
No więc jak wiesz odczytywane poszczególne bity z sensora lądują w zmiennej Sensor_data, z której to później "wyciągane" są poszczególne wartości, mierzonych czy tam monitorowanych wielkości fizycznych.
I tutaj uświadomiłeś mi że w mojej wypowiedzi zrobiłem błąd/przejęzyczenie, gdyż sprawa nie dotyczy bajtu 24 tylko bitu. ;-PP
Już poprawiłem powyżej.
Teraz należy zajrzeć do noty katalogowej, gdzie wyczytamy (w dokumencie który posiadam punkt 7.2 Single-bus communication protocol, na stronie 5):
Przykład poprzedza tabelka 5 z teorią:
i już wszystko jasne.
Musisz tylko pamiętać jakiego typu jest zmienna przechowująca odebrane wartości.
Gdy bit jest ustawiony, oznacza ze zapisano do niego 1 logiczną, a gdy skasowany oznacza że zapisano do niego 0. Instrukcję set i reset pewno znasz, ona to ładnie obrazuje.
W razie potrzeby pytaj dalej choć jak Cię "znam" to już rozkminisz teraz swój problem ((-;
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
kolego gość
Piszesz:
Z tego co piszesz, to aby zmienić wilgotność to raczej trzeba nachuchać na sensor, - zmienić warunki w jego otoczeniu.
HEHEHE
A teraz poważnie, pewno masz na myśli coś innego o czym się mogę tylko domyślać, a czego nie chcesz zdradzić.
Więc musisz zawsze dokładnie opisać na czym Ci zależy.
Jak się domyślam (widzę na Twoim listingu) to pewno chcesz testować "stan" jakiegoś pina ?C i na tej podstawie modyfikować jakąś zmienną.
Koniec dedukcji.
Po teście "stanu pina" nie rób takich długich bezczynności, jedna dziesiąta wystarczy tego co napisałeś. W drugim przypadku wogóle nie zrobiłeś przerwy - jesteś niekonsekwentny, albo o czymś nie wiem, co autor miał na myśli? W takim razie muszę zapytać po co te:
I moja propozycja spróbuj zapoznać się z instrukcją debounce.
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
kaktus
No dzięki za słowa wsparcia :)
Jak dzieci mnie nie zamęczą to siądę w weekend i trochę pomyślę. Może do czegoś ciekawego dojdę :)
A w razie problemów (a na pewno sie pojawią ;) ) znowu poproszę cię o uwagi.
Kamil
Dzieciorki do kozy i będzie git.
Zajmie Ci to pięć minut, i będziesz miał obsługę temperatury ujemnej.
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Kaktus
Wyglada, że z moją wiedzą Bascomie jeszcze nie jest tak dobrze ale chęci nauki są :)
Nie wiem za bardzo jak to ugryźć, czytam czytam i już mam mętlik w głowie.
Na razie wymyśliłem takie coś:
If T.15=1 then
Cls
Upperline
Lcd "T: -" ; T ; "," ; Ti ; "c"
Lowerline
Lcd "H:" ; H ; "," ; Hi ; "%"
End If
If T.15=0 then
Cls
Upperline
Lcd "T: " ; T ; "," ; Ti ; "c"
Lowerline
Lcd "H:" ; H ; "," ; Hi ; "%"
End If
Ale mam wrażenie (biorąc pod uwagę twoje rady), że pomijam coś w temacie wyciągania bitu z Sensor_data. Tylko nie wiem jak sie za to zabrać. Czy na początku powinno byc np:
Sensor_data(24)
Set T.15=1
??? jeśli jeszcze cię nie zmęczyłem moją niewiedzą to podaj proszę jakieś kolejne sugestie.
Chęć rozgryzienia problemu mam wielką ale wiedzy jeszcze za mało ;)
Kamil
Nie zmęczyłeś, masz wyjście awaryjne - zapytać kaktusa ((-;
Wiedza przyjdzie w miarę wciągania się, i rozwiązywania problemów.
Generalnie nie chcę napisać gotowca bo nauka będzie kiepska, a uważam że sobie z tym poradzisz. Gdzieś w moich postach podałem mój nr gg, w "nagłych" sytuacjach zawsze możesz skorzystać.
No dobra .... odpowiem rzeczowo
w nawiązaniu do tego co opisałem wcześniej proponuję w pierwszym kroku testowanie - badanie zawartości odpowiedniej komórki w zmiennej Sensor_data i tu przypominam Sensor_data to ciąg 40 znaków
czyli jest to "specjalna" tablica czterdziestoelementowa do przechowywania wartości 40 x bajt o zakresie tablicy asci, o czterdziestejpierwszej (właściwie jest ona zlokalizowana na początku) komórce zawierającej długość tej tablicy, (ilość znaków) - to było trochę teorii
teraz dla uzmysłowienia deklarujemy string - ciąg znaków o liczbie 5 - oznacza to że fizycznie zostanie zarezerwowana pamięć na 5 wartości bajt a w pierwszej specjalnej komórce (poza naszą deklaracją) czyli szósty bajt, siedzi aktualna długość naszego string-a,
gdy do naszej zmiennej wpiszemy "Abc" wtedy w tej specjalnej komórce siedzi wartość 3, ale do rzeczy bo od tematu się oddaliłem.
Więc gdy będziesz testował odpowiednią komórkę string-a, aby sprawdzić czy jest "mróz" pamiętaj o zachowaniu zgodności typu lub posłuż się kodem odpowiedniego znaku asci (takie bajty i bity znakowe, literowo cyfrowe itp)
w drugim kroku w przypadku stwierdzenia mrozu, możesz nadpisywać znak "stwierdzenia mrozu" znakiem "brak mrozu" i kolejnie przejść do konwersji aby określić cyframi/liczbami wartość temperatury.
Jest jeszcze możliwość inna, gdy już wiesz czy mróz jest czy go nie ma, zawsze nadpisuj ten znacznik w zmiennej Sensor_data
jedno i drugie jest dobre, drugie zaoszczędzi ociupinkę pamięci kodu - odpada jeden warunek testujący.
No więc teraz trzeba to przelać tylko na kod.
kaktus
"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".
Poddaję się na razie. Za mało
Poddaję się na razie. Za mało jeszcze umiem i nie wiem jak wydobyć i analizować ten konkretny bajt ze zmiennej Sensor_data a potem wykonać kolejne kroki o których piszesz. Muszę jeszcze sobie sporo poczytać i co dla mnie najważniejsze poanalizować różne programy/kody napisane w Bascomie żeby lepiej go zrozumieć. Nie chcę zadawać głupich pytań więc najpierw trochę nauki :) . Na razie więc dopisanie obsługi temp ujemnej odkładam do chwili kiedy posiądę więcej tej "magicznej" wiedzy ;) . Dzieci jutro jadą na wakacje to będę miał trochę ciszy i spokoju na douczenie się. Odezwę się niebawem jak coś sensownego wymyśę :) i poproszę Cię o uwagi.
Kamil
dth22 rozwiazanie
Uruchomilem ostatnio taki czujnik, jak ktos szuka, podsylam dzialajacy program.
Probleem okazalo sie to, ze czujnik dziala inaczej niz dth11.
Tutaj wytlumaczenie:
Sensor_datah= 0000000100101111000000001111001100100011 - dane odczytane z czujnika
hh= 0000000100101111 -dane wilgotnosci
hh=303
Znakdth 00000- jesli jest 1000 to t>0
th= 000011110011 -dane temperatury
th=243
crc= 0100011-crc
crc=35
Dht_put Alias Portb.0 'podlaczenie 1wire
Dht_get Alias Pinb.0 'podlaczenie 1wire
Dht_io_set Alias Ddrb.0 'podlaczenie 1wire
Declare Sub Get_th(th As Integer , Hh As Word)
Dim Th As Integer
Dim Hh As Word
Dim Hh1 As Word '
Dim Crc As Byte
Dim Mybyte As Byte
Dim Sensor_data As String * 40
Dim Znakdth As Byte
Dim Tmp_str8t As String * 12
Dim Tmp_str8h As String * 16
Dim Tmp_str8z As String * 4
Dim Tmp_str8c As String * 8
Dim Count As Byte
Dim Napis As String * 6
Sub Get_th(th As Byte , Hh As Word)
If Dthes = 1 Then
Count = 0
Sensor_data = ""
Set Dht_io_set
Reset Dht_put
Waitms 25
Set Dht_put
Waitus 40
Reset Dht_io_set
Waitus 40
If Dht_get = 1 Then
Hh = 1
Exit Sub
End If
Waitus 80
If Dht_get = 0 Then
Hh = 2
Exit Sub
End If
While Dht_get = 1 : Wend
Do
While Dht_get = 0 : Wend
Waitus 30
If Dht_get = 1 Then
Sensor_data = Sensor_data + "1"
While Dht_get = 1 : Wend
Else
Sensor_data = Sensor_data + "0"
End If
Incr Count
Loop Until Count = 40
Set Dht_io_set
Set Dht_put
'Print "Sensor_datah= " ; Sensor_data
Tmp_str8h = Left(sensor_data , 16)
Hh = Binval(tmp_str8h)
'Print "hh= " ; Tmp_str8h
'Print "hh=" ; Hh
Tmp_str8z = Mid(sensor_data , 17 , 4)
Znakdth = Binval(tmp_str8z)
'Print "znak=" ; Tmp_str8z
'Print "znak=" ; Znakdth
Tmp_str8t = Mid(sensor_data , 21 , 12)
Th = Binval(tmp_str8t)
'Print "th= " ; Tmp_str8t
'Print "th=" ; Th
If Znakdth = 8 Then 'znak ujemny
Th = Th * -1
End If
'If Th > 300 Then
' Th = Th * -1
'End If
Tmp_str8c = Right(sensor_data , 8)
Crc = Binval(tmp_str8c)
'Print "crc= " ; Tmp_str8c
'Print "crc=" ; Crc
'Mybyte = Th + Hh
'If Mybyte <> Crc Then
' Hh = 3
'End If
Dthes = 0
Dth = Th
Dhh = Hh
Napis = Str(th)
Napis = Format(napis , " 0.0")
End Sub
End If
Return
Program dziala, zostal sprawdzony na atmege128.
DHT22 AM2302 Czujnik Temp I Wilgotności
Uruchomilem ostatnio taki czujnik, jak ktos szuka, podsylam dzialajacy program.
Probleem okazalo sie to, ze czujnik dziala inaczej niz dth11.
Tutaj wytlumaczenie:
Sensor_datah= 0000000100101111000000001111001100100011 - dane odczytane z czujnika
hh= 0000000100101111 -dane wilgotnosci
hh=303
Znakdth 00000- jesli jest 1000 to t>0
th= 000011110011 -dane temperatury
th=243
crc= 0100011-crc
crc=35
Dht_put Alias Portb.0 'podlaczenie 1wire
Dht_get Alias Pinb.0 'podlaczenie 1wire
Dht_io_set Alias Ddrb.0 'podlaczenie 1wire
Declare Sub Get_th(th As Integer , Hh As Word)
Dim Th As Integer
Dim Hh As Word
Dim Hh1 As Word '
Dim Crc As Byte
Dim Mybyte As Byte
Dim Sensor_data As String * 40
Dim Znakdth As Byte
Dim Tmp_str8t As String * 12
Dim Tmp_str8h As String * 16
Dim Tmp_str8z As String * 4
Dim Tmp_str8c As String * 8
Dim Count As Byte
Dim Napis As String * 6
Sub Get_th(th As Byte , Hh As Word)
If Dthes = 1 Then
Count = 0
Sensor_data = ""
Set Dht_io_set
Reset Dht_put
Waitms 25
Set Dht_put
Waitus 40
Reset Dht_io_set
Waitus 40
If Dht_get = 1 Then
Hh = 1
Exit Sub
End If
Waitus 80
If Dht_get = 0 Then
Hh = 2
Exit Sub
End If
While Dht_get = 1 : Wend
Do
While Dht_get = 0 : Wend
Waitus 30
If Dht_get = 1 Then
Sensor_data = Sensor_data + "1"
While Dht_get = 1 : Wend
Else
Sensor_data = Sensor_data + "0"
End If
Incr Count
Loop Until Count = 40
Set Dht_io_set
Set Dht_put
'Print "Sensor_datah= " ; Sensor_data
Tmp_str8h = Left(sensor_data , 16)
Hh = Binval(tmp_str8h)
'Print "hh= " ; Tmp_str8h
'Print "hh=" ; Hh
Tmp_str8z = Mid(sensor_data , 17 , 4)
Znakdth = Binval(tmp_str8z)
'Print "znak=" ; Tmp_str8z
'Print "znak=" ; Znakdth
Tmp_str8t = Mid(sensor_data , 21 , 12)
Th = Binval(tmp_str8t)
'Print "th= " ; Tmp_str8t
'Print "th=" ; Th
If Znakdth = 8 Then 'znak ujemny
Th = Th * -1
End If
'If Th > 300 Then
' Th = Th * -1
'End If
Tmp_str8c = Right(sensor_data , 8)
Crc = Binval(tmp_str8c)
'Print "crc= " ; Tmp_str8c
'Print "crc=" ; Crc
'Mybyte = Th + Hh
'If Mybyte <> Crc Then
' Hh = 3
'End If
Dthes = 0
Dth = Th
Dhh = Hh
Napis = Str(th)
Napis = Format(napis , " 0.0")
End Sub
End If
Return
Program dziala, zostal sprawdzony na atmege128.
Zły pomiar
Hej! Czy można prosić o poprawioną wersje? Niestety wyniki wilgotności jak i temperatury są zawyżone i skaczą co 10*C i 10%. Pozdrawiam!
Ujemna temeratura DHT22
Witam!
Czy ktoś ma gotowy program z obsługą ujemnych temperatur?