DHT22 AM2302 Czujnik Temp I Wilgotności


Witam
Zakupiłem niedawno czujnik z tematu gdzieś w necie znalazłem przykładowy programik do jego obsługi na Bescoma tylko, że coś chyba z nim nie tak. Programik wygląda następująco.
Wszystko co zmieniłem poprzedziłem komętarzem w formie orginału.

'######################## 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?




Portret użytkownika mirley

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.

Portret użytkownika michal512

re DHT22

Jeden błąd to

 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

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

dim Chksu As Byte
 
   Chksu = Low(Humidityw ) + High(Humidityw )
   Chksu = Chksu + Low(Temperaturew)
   Chksu = Chksu + High(Temperaturew)
 
lcd Chksu
lowerline
lcd Humsens_chksum 

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?

Portret użytkownika mirley

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.

Portret użytkownika michal512

re DHT22

Zrobiłem zanstępijąco:
Skopiowałem zawartość funkcji do pętli Do
za ifem

If Chksum = Hsens_chksum Then
      Compare_chksum = 1

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

Portret użytkownika Grzeniu 73

Mógłbyś wrzucić cały kod po

Mógłbyś wrzucić cały kod po poprawkach? Szukam jakiegoś wilgotnościomierza.

Portret użytkownika kaktus

Sprawdzony działający kod z

Sprawdzony działający kod z moim opisem:

 $regfile = "m8def.dat"
$crystal = 8000000
 
'konfiguracja wyświetlacza LCD
Config Lcd = 16 * 2
Config Lcdpin = Pin,Rs=Portc.5,E=Portc.4,Db4=Portc.3,Db5=Portc.2,Db6=Portc.1,Db7=Portc.0
Cursor Off
Cls
 
'deklaracja procedury
Declare Sub Get_th(t As Byte , H As Byte)
 
Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128
 
'czujnik podłączony do PortD.6
Dht_put Alias Portd.6
Dht_get Alias Pind.6
Dht_io_set Alias Ddrd.6
 
Dim T As Byte                        'zmienna do przechowywania temperatury
Dim H As Byte                        'zmienna do przechowywania wilgotności
Dim Crc As Byte                      'zmienna do przechowywania bajtów parzystości
Dim Mybyte As Byte
Dim Sensor_data As String * 40       'tutaj będą zapisywać się dane z czujnika
Dim Tmp_str8 As String * 8
Dim Count As Byte                    'zmienna do obliczania odebranych bitów
 
Enable Interrupts
 
Set Dht_io_set
Set Dht_put
 
Lcd "DHT 11"
Lowerline
Lcd "  sensor"
 
Do
   Waitms 1500
   Call Get_th(t , H)
   Cls
   Lcd "TMP: " ; T ; "C"
   Lowerline
   Lcd "PHP: " ; H ; "%"
 
Loop
 
Sub Get_th(t As Byte , H As Byte)
 
 Count = 0
 Sensor_data = ""
 Set Dht_io_set                                         'robimy wyjście z PD.6
 Reset Dht_put                                          'ustawić magistralę w stan LOW
 Waitms 25                                              'odczekać co najmniej 18ms
 
 Set Dht_put                                            'zwolnić magistrale
 Waitus 40
 Reset Dht_io_set                                       'robimy wejście z PD.6
 Waitus 40                                              'odczekaj 40 ms
 If Dht_get = 1 Then                                    'jeśli jest jeszcze jeden, ???? ?? ??? ?? ???????? 1
    H = 1                                               'oznacza że czujnik nie odpowiedział
    Exit Sub                                            'kończymy podprogram
 End If
 
'jeśli czujnik odpowiedział i wyciągnął magistrale do ziemi kontynuujemy pracę
  Waitus 80                                             'czekamy jeszcze 80ms
  If Dht_get = 0 Then                                   'jeśli na linii jest nadal 0
    H = 2                                               'oznacza czujnik zwariował
    Exit Sub                                            'kończymy podprogram
  End If
 
'jeśli wszystko pójdzie dobrze i czujnik zareagował prawidłowo, możemy kontynuować
 
  While Dht_get = 1 : Wend                'czekamy, aż magistrala pokazuje 1
 
   Do                                     'zaczynamy przyjmować 40-bitowe dane
    While Dht_get = 0 : Wend              'czekamy na ustawienie magistrali w stan 0
    Waitus 30                             'po wystąpieniu stamu 0 czekać 30 ms
     If Dht_get = 1 Then                  'jeśli na szynie 1
       Sensor_data = Sensor_data + "1"    'zapisujemy do zmiennej tą ?????????? ? ?????????? ??? ???????
       While Dht_get = 1 : Wend           'i czekamy aż nadajnik wyśle kolejny bit
       Else                               'w przeciwnym razie, jeśli tam jest 0
       Sensor_data = Sensor_data + "0"    'zapisujem je do zmiennej
    End If
    Incr Count                            'zwiększamy licznik
   Loop Until Count = 40                  'Powtarzaj tę czynność dopóki licznik osiągnie liczbę 40
 
   Set Dht_io_set
   Set Dht_put
 
'zaczynamy rozkładać otrzymane dane
 
   Tmp_str8 = Left(sensor_data , 8)                'bierzemy lewe 8 znaków zmiennej
   H = Binval(tmp_str8)                            'jest cała część wilgotności
 
   Tmp_str8 = Mid(sensor_data , 17 , 8)            'wyjmujemy 8 znaków ze środka
   T = Binval(tmp_str8)                            'to cała część temperatury
 
   Tmp_str8 = Right(sensor_data , 8)               'prawe 8 znaków
   Crc = Binval(tmp_str8)                          'dane testowe
 
'test sumy kontrolnej
 
   Mybyte = T + H                      'dodajemy wartości temperatury i wilgotności
   If Mybyte <> Crc Then               'jeśli suma kontrolna się nie zgadza
      H = 3                            'Oznacza to, że dane nie są poprawne
   End If
 
End Sub                                      'powrót do głównej pętli programu

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.".

Portret użytkownika Grzeniu 73

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ć.

Portret użytkownika kaktus

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.".

Portret użytkownika michal512

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ą

Debounce Ustaw , 0 , Zmiana , Sub 

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?

Portret użytkownika kaktus

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.".

Portret użytkownika gosc

TIMERY

Czy w beskomie można korzystać z obu timerów jednocześcnie to się znaczy.

.
.
.
Config Timer1 = Timer , Prescale = 8
Config Timer0 = Timer , Prescale = 256
On Timer0 Ob_timer0
Enable Interrupts
Enable Timer0
Load Timer0 = 250
.
.
.
Ob_timer0: 
      Incr 8ms3                                             'co 10s odczyt jednego DHT wilgotności
 
      If 8ms3 = 1250 Then                                   '8*1250=10 po 10 sekundach 
 
         Incr Kdht
 
         If Kdht = 4 Then
            Kdht = 1
         End If
 
         Select Case Kdht                                  'oczyt jednego z DHT
            Case 1
               Call 1dht22
             Case 2
               Call 2dht22
             Case 3
               Call 3dht22
         End Select
 
         8ms3 = 0
      End If
 
Return

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.

Portret użytkownika kaktus

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.".

Portret użytkownika michal512

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?

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

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.
'dla atmegi 32
 
'dyrektyw mikrokontrolera
 
$baud = 19200
$crystal = 8000000                                          'informuje kompilator o częstotliwości oscylatora
                                                            'taktującego mikrokontroler
$regfile = "m32def.dat"
 
$hwstack = 40
$swstack = 20
$framesize = 20
 
Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.5 , E = Portc.6 , Rs = Portc.7
                                                             'Konfiguracja linii mikrokontrolera, do których dołączono
                                                             'wyświetlacz LCD
 
 
'deklaracja procedury
Declare Sub Get_th(t As Byte , H As Byte)
 
Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128
 
'czujnik podłączony do PortD.6
Dht_put Alias Porta.3
Dht_get Alias Pina.3
Dht_io_set Alias Ddra.3
 
Dim T As Byte                                               'zmienna do przechowywania temperatury
Dim H As Byte                                               'zmienna do przechowywania wilgotności
Dim Crc As Byte                                             'zmienna do przechowywania bajtów parzystości
Dim Mybyte As Byte
Dim Sensor_data As String * 40                              'tutaj będą zapisywać się dane z czujnika
Dim Tmp_str8 As String * 8
Dim Count As Byte                                           'zmienna do obliczania odebranych bitów
 
Enable Interrupts
 
Set Dht_io_set
Set Dht_put
 
Lcd "DHT 11"
Lowerline
Lcd "  sensor"
 
Do
   Waitms 1500
   Call Get_th(t , H)
   Cls
   Lcd "TMP: " ; T ; "C"
   Lowerline
   Lcd "PHP: " ; H ; "%"
 
Loop
 
Sub Get_th(t As Byte , H As Byte)
 
 Count = 0
 Sensor_data = ""
 Set Dht_io_set                                             'robimy wyjście z PD.6
 Reset Dht_put                                              'ustawić magistralę w stan LOW
 Waitms 25                                                  'odczekać co najmniej 18ms
 
 Set Dht_put                                                'zwolnić magistrale
 Waitus 40
 Reset Dht_io_set                                           'robimy wejście z PD.6
 Waitus 40                                                  'odczekaj 40 ms
 If Dht_get = 1 Then                                        'jeśli jest jeszcze jeden, ???? ?? ??? ?? ???????? 1
    H = 1                                                   'oznacza że czujnik nie odpowiedział
    Exit Sub                                                'kończymy podprogram
 End If
 
'jeśli czujnik odpowiedział i wyciągnął magistrale do ziemi kontynuujemy pracę
  Waitus 80                                                 'czekamy jeszcze 80ms
  If Dht_get = 0 Then                                       'jeśli na linii jest nadal 0
    H = 2                                                   'oznacza czujnik zwariował
    Exit Sub                                                'kończymy podprogram
  End If
 
'jeśli wszystko pójdzie dobrze i czujnik zareagował prawidłowo, możemy kontynuować
 
  While Dht_get = 1 : Wend                                  'czekamy, aż magistrala pokazuje 1
 
   Do                                                       'zaczynamy przyjmować 40-bitowe dane
    While Dht_get = 0 : Wend                                'czekamy na ustawienie magistrali w stan 0
    Waitus 30                                               'po wystąpieniu stamu 0 czekać 30 ms
     If Dht_get = 1 Then                                    'jeśli na szynie 1
       Sensor_data = Sensor_data + "1"                      'zapisujemy do zmiennej tą ?????????? ? ?????????? ??? ???????
       While Dht_get = 1 : Wend                             'i czekamy aż nadajnik wyśle kolejny bit
       Else                                                 'w przeciwnym razie, jeśli tam jest 0
       Sensor_data = Sensor_data + "0"                      'zapisujem je do zmiennej
    End If
    Incr Count                                              'zwiększamy licznik
   Loop Until Count = 40                                    'Powtarzaj tę czynność dopóki licznik osiągnie liczbę 40
 
   Set Dht_io_set
   Set Dht_put
 
'zaczynamy rozkładać otrzymane dane
 
   Tmp_str8 = Left(sensor_data , 8)                         'bierzemy lewe 8 znaków zmiennej
   H = Binval(tmp_str8)                                     'jest cała część wilgotności
 
   Tmp_str8 = Mid(sensor_data , 17 , 8)                     'wyjmujemy 8 znaków ze środka
   T = Binval(tmp_str8)                                     'to cała część temperatury
 
   Tmp_str8 = Right(sensor_data , 8)                        'prawe 8 znaków
   Crc = Binval(tmp_str8)                                   'dane testowe
 
'test sumy kontrolnej
 
   Mybyte = T + H                                           'dodajemy wartości temperatury i wilgotności
   If Mybyte <> Crc Then                                    'jeśli suma kontrolna się nie zgadza
      H = 3                                                 'Oznacza to, że dane nie są poprawne
   End If
 
End Sub                                                     'powrót do głównej pętli programu

Portret użytkownika kaktus

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.".

Portret użytkownika michal512

A konkretnie to które bity?

A konkretnie to które bity? Bo inne programy na tej atmedze 32 chodzą.

Portret użytkownika kaktus

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.".

Portret użytkownika michal512

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

'dla atmegi 32
 
'dyrektyw mikrokontrolera
 
$baud = 19200
$crystal = 8000000                                          'informuje kompilator o częstotliwości oscylatora
                                                            'taktującego mikrokontroler
$regfile = "m32def.dat"
 
$hwstack = 40
$swstack = 20
$framesize = 20
 
Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.5 , E = Portc.6 , Rs = Portc.7
                                                             'Konfiguracja linii mikrokontrolera, do których dołączono
.
.
.
Dht_put Alias Porta.3
Dht_get Alias Pina.3
Dht_io_set Alias Ddra.3
.
.
.

Niweiem tylko jakie zadanie ma ta ostatnia komęda "Dht_io_set Alias Ddra.3" bo było "Dht_io_set Alias Ddrd.6"

Portret użytkownika kaktus

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.".

Portret użytkownika michal512

Na wyświetlaczu pokazuje się

Na wyświetlaczu pokazuje się TMP:0C ; PHP:3% czyli błąd sumy kontrolnej.

Portret użytkownika kaktus

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.".

Portret użytkownika gosc

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%.

Portret użytkownika kaktus

No to trzeba wyjaśnić wkońcu ((-;

Więc ujawnijmy podstawowe różnice pomiędzy dwoma rodzajami sensorów DHT11 i DHT22 (AM2301)

DHT11

specyfikacja DHT11

DHT22

specyfikacja 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:

Quote:
Data consists of decimal and integral parts. A complete data transmission is 40bit, and the
sensor sends higher data bit first.
Data format: 8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T
data + 8bit check sum. If the data transmission is right, the check-sum should be the last 8bit of
"8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data"

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.".

Portret użytkownika mijur

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

$regfile = "m8def.dat"
$crystal = 8000000
 
'konfiguracja wyświetlacza LCD
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
Config Lcdbus = 4
Cursor On
Cls
 
'deklaracja procedury
Declare Sub Get_th(t As Word , H As Word)
 
Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128
 
'czujnik podłączony do PortD.6
Dht_put Alias Portd.6
Dht_get Alias Pind.6
Dht_io_set Alias Ddrd.6
 
 
Dim Crc As Byte                                             'zmienna do przechowywania bajtów parzystości
Dim Mybyte As Byte                                          'zmienna do obliczania bitu parzystośći
Dim Sensor_data As String * 40                              'tutaj będą zapisywać się dane z czujnika
Dim Count As Byte
Dim T As Word                                               'zmienna do przechowywania temperatury
Dim H As Word                                               'zmienna do przechowywania wilgotności
Dim S16 As String * 16                                      'zmienna do obliczania odebranych bitów
Dim Ti As Byte                                              'zmienna do przechowywania dziesiętnej temperatury
Dim Hi As Byte                                              'zmienna do przechowywania dziesiętnej wilgotności
 
 
Enable Interrupts
 
 
 
Lcd "DHT 22"
Lowerline
Lcd "Sensor"
 
Do
   Dht_io_set = 1
   Dht_put = 1
   Wait 5
   Call Get_th(t , H)
   Cls
   Upperline
   Lcd "T:" ; T ; "," ; Ti ; "c"
   Lowerline
   Lcd "H:" ; H ; "," ; Hi ; "%"
 
Loop
 
Sub Get_th(t As Word , H As Word)
 
 Count = 0
 Sensor_data = ""
 Dht_io_set = 1                                             'robimy wyjście z PD.6
 Dht_put = 0                                                'ustawić magistralę w stan LOW
 Waitms 1                                                   'odczekać co najmniej 18ms
 
 Dht_put = 1                                                'zwolnić magistrale
 Waitus 20
 Dht_io_set = 0                                             'robimy wejście z PD.6
 Waitus 40                                                  'odczekaj 40 ms
 If Dht_get = 1 Then                                        'jeśli jest jeszcze jeden, ???? ?? ??? ?? ???????? 1
    H = 1                                                   'oznacza że czujnik nie odpowiedział
    Exit Sub                                                'kończymy podprogram
 End If
 
'jeśli czujnik odpowiedział i wyciągnął magistrale do ziemi kontynuujemy pracę
  Waitus 80                                                 'czekamy jeszcze 80ms
  If Dht_get = 0 Then                                       'jeśli na linii jest nadal 0
    H = 2                                                   'oznacza czujnik zwariował
    Exit Sub                                                'kończymy podprogram
  End If
 
'jeśli wszystko pójdzie dobrze i czujnik zareagował prawidłowo, możemy kontynuować
 
  While Dht_get = 1 : Wend                                  'czekamy, aż magistrala pokazuje 1
 
   Do                                                       'zaczynamy przyjmować 40-bitowe dane
    While Dht_get = 0 : Wend                                'czekamy na ustawienie magistrali w stan 0
    Waitus 30                                               'po wystąpieniu stamu 0 czekać 30 ms
     If Dht_get = 1 Then                                    'jeśli na szynie 1
       Sensor_data = Sensor_data + "1"                      'zapisujemy do zmiennej tą ?????????? ? ?????????? ??? ???????
       While Dht_get = 1 : Wend                             'i czekamy aż nadajnik wyśle kolejny bit
       Else                                                 'w przeciwnym razie, jeśli tam jest 0
       Sensor_data = Sensor_data + "0"                      'zapisujem je do zmiennej
    End If
    Incr Count                                              'zwiększamy licznik
   Loop Until Count = 40                                    'Powtarzaj tę czynność dopóki licznik osiągnie liczbę 40
 
   Dht_io_set = 1
   Dht_put = 1
 
'zaczynamy rozkładać otrzymane dane
 
 
   S16 = Left(sensor_data , 16)
   H = Binval(s16)
   H = H / 10
   Hi = H Mod 10
 
   S16 = Mid(sensor_data , 17 , 16)
   T = Binval(s16)
   T = T / 10
   Ti = T Mod 10
 
   S16 = Right(sensor_data , 8)
   Crc = Binval(s16)
   'test sumy kontrolnej
 
   Mybyte = T + H                                           'dodajemy wartości temperatury i wilgotności
   If Mybyte <> Crc Then                                    'jeśli suma kontrolna się nie zgadza
      Lcd "error"                                           'Oznacza to, że dane nie są poprawne
   End If
 
 
 
 
End Sub                                                     'powrót do głównej pętli program

Wszystko działa póki co
pozdrawiam

-

20 zł gratis za rejestracje

Portret użytkownika mijur

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:

Do
   If H < 70 Then
   Portb.0 = 1
   End If
 
   If H > 60 Then
   Portb.0 = 0
   End If
   If T < 22 Then
   Portb.1 = 1
   End If
   If T > 28 Then
   Portb.1 = 0
   End If
Loop

-

20 zł gratis za rejestracje

Portret użytkownika kaktus

((-;

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 ((-;

Quote:
Format(humiditys , "0.0")

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:

Quote:
T = T / 10

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.".

Portret użytkownika kaktus

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.".

Portret użytkownika mijur

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

Portret użytkownika kaktus

((-;

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.".

Portret użytkownika mijur

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

Portret użytkownika yin@yang

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

Portret użytkownika kaktus

Sam obczaiłeś przyczynę niedziałania

Piszesz:

Quote:
Czy w atmedze muszę ustawiać jakoś fusy bo na razie to wgrałem program a fusy zostawione są "fabryczne" ?

i masz 100% rację..

zauważ co w programie pisze - jakie są deklaracje

$regfile = "m8def.dat"
$crystal = 8000000

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.".

Portret użytkownika yin@yang

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

Portret użytkownika Grzeniu 73

ściągnij sobie

ściągnij sobie mkavrCalkulator dla M8 jest on darmowy tam bez żadnych pomyłek ustawisz sobie fusy.

Portret użytkownika yin@yang

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

Portret użytkownika gosc

wypowiedź 22

Moja wypowiedź -post nr 22 porusza ten problem, poczytaj jak coś będzie niejasne daj znać.

kaktus

Portret użytkownika yin@yang

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

Portret użytkownika gosc

Ustawienie wilgotności

Witam

Chciałbym móc zmieniać żądaną wilgotność przez przycisk czy ten kod mi w tym pomoże ?

      Locate 1 , 1
      Lcd "  Humilidity "
      Locate 2 , 1
      Lcd "USTAW: " ; Liczba ; Chr(0) ; "C"
      Waitms 100
 
      If Pinb.1 = 0 Then
               Incr Liczba
      End If
      Waitms 200
 
      If Pinb.2 = 0 Then
               Decr Liczba
      End If
 
      If Liczba > 95 Then Liczba = 95
      If Liczba < 20 Then Liczba = 20

Portret użytkownika gosc

Ustawienie wilgotności

Witam

Chciałbym móc zmieniać żądaną wilgotność przez przycisk czy ten kod mi w tym pomoże ?

      Locate 1 , 1
      Lcd "  Humilidity "
      Locate 2 , 1
      Lcd "USTAW: " ; Liczba ; Chr(0) ; "C"
      Waitms 100
 
      If Pinb.1 = 0 Then
               Incr Liczba
      End If
      Waitms 200
 
      If Pinb.2 = 0 Then
               Decr Liczba
      End If
 
      If Liczba > 95 Then Liczba = 95
      If Liczba < 20 Then Liczba = 20

Portret użytkownika gosc

Ustawienie wilgotności

Witam

Chciałbym móc zmieniać żądaną wilgotność przez przycisk czy ten kod mi w tym pomoże ?

      Locate 1 , 1
      Lcd "  Humilidity "
      Locate 2 , 1
      Lcd "USTAW: " ; Liczba ; Chr(0) ; "C"
      Waitms 100
 
      If Pinb.1 = 0 Then
               Incr Liczba
      End If
      Waitms 200
 
      If Pinb.2 = 0 Then
               Decr Liczba
      End If
 
      If Liczba > 95 Then Liczba = 95
      If Liczba < 20 Then Liczba = 20

Portret użytkownika kaktus

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):

Quote:
Special Instructions:
When the temperature is below 0 °C, the highest position of the temperature data.
Example: -10.1 °C Expressed as 1 000 0000 0110 0101
Temp.:0000 0000 0110 0101 = 0065H(Hexadecimal)= 6×16 +5 = 101
=> Temp. = -10.1°C

Przykład poprzedza tabelka 5 z teorią:

Quote:

Temperature resolution of 16Bit, the previous high; temperature sensor string value is 10 times
the actual temperature value;
Temp. The temperature is the highest bit (Bit15) is equal to 1 indicates a negative temperature, the
temperature is the highest bit (Bit15) is equal to 0 indicates a positive temperature;
Temperature in addition to the most significant bit (Bit14 ~ bit 0) temperature values.

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.".

Portret użytkownika kaktus

kolego gość

Piszesz:

Quote:

Ustawienie wilgotności
Witam
Chciałbym móc zmieniać żądaną wilgotność przez przycisk czy ten kod mi w tym pomoże ?

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:

Waitms 200

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.".

Portret użytkownika yin@yang

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

Portret użytkownika kaktus

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.".

Portret użytkownika yin@yang

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

Portret użytkownika kaktus

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

Dim Sensor_data As String * 40 

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.".

Portret użytkownika yin@yang

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

Portret użytkownika gosc

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.

Portret użytkownika gosc

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.

Portret użytkownika gosc

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!

Portret użytkownika gosc

Ujemna temeratura DHT22

Witam!

Czy ktoś ma gotowy program z obsługą ujemnych temperatur?