Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Odczyt danych z DHT11 ATTINY13 BASCOM

koczis_ws 13 Apr 2020 19:50 633 12
e-mierniki
  • #1
    koczis_ws
    Level 27  
    Witam serdecznie,
    Chcę zrobić sterowanie wentylatora w łazience takie, żeby wentylator włączył się gdy wilgotność powietrza przekroczy pewną wartość. Nabyłem więc czujniki DHT11 pracujące pod 1wire.
    Walczę z problemem już jakiś czas i nie mogę sobie poradzić. Znalazłem artykuł na ten temat : https://serwis.avt.pl/manuals/AVT3079.pdf.
    Przystosowałem zamieszczony tam fragment programu do ATTINY13 i niestety nie działa :(
    Mikrokontroler wykrywa DHT11 co mam potwierdzone ale wygląda na to, że czujnik tylko zgłasza się ale nie wysyła danych bo na linii danych po impulsie potwierdzającym jest stale stan wysoki.
    Code: vbnet
    Log in, to see the code


    Problem jest na obu zakupionych szt. I jeszcze jedno, jak nie podam zasilania 5V do czujnika to milczy całkowicie, a piszą, że może pracować jako 1wire.
    W programie zastosowałem wpisy danych kontrolnych do EEPROMu żeby wiedzieć gdzie występuje zagwózdka. Niestety nie mam monitora a emulator z programu BASCOM nie działa. Przy okazji może ktoś wie jak go uruchomić.
    Będę wdzięczny za wszelkie porady.
  • e-mierniki
  • #2
    bart-projects
    Level 25  
    Tiny13 ma najczęściej niedokładny wewnętrzny oscylator. Można to sprawdzić każąc mu policzyć np. 1s i sprawdzając oscyloskopem lub tanim analizatorem Saleae.
    Obstawiam więc zależności czasowe. Np potrzebujesz odliczyć 25us. Tam w projekcie mieli kwarc 4MHz więc dokładniej...

    Ten oscylator można kalibrować, ale trzeba mieć czym ->jakiś przyrząd pomiarowy->oscyloskop/analizator.

    Jak nie masz, to proponuję przestawić Tiny na 9,6MHz i oczywiście to samo wpisać w programie $crystal = 9600000. To powinno dać większa dokładność (większa ilość taktów na odmierzanie tych mikrosekund).

    Mam projekt gdzie Atmega8 udaje czujnik DS18B20 i tam używam wewnętrznego oscylatora. Z tego co pamiętam to chyba na 1MHz nie dałby rady bo miał jeszcze coś do roboty :D

    Co do problemów z symulatorem to nie rozumiem pytania a monitorem nazywasz emulator terminala? Czyli nie masz przejściówki USB<>TTL?
  • #3
    koczis_ws
    Level 27  
    bart-projects wrote:
    Co do problemów z symulatorem to nie rozumiem pytania a monitorem nazywasz emulator terminala? Czyli nie masz przejściówki USB<>TTL?

    Ogólnie jestem w tym zielony, więc oczekuję łopatologicznej :) porady jak monitorować Tiny na PC.
    A jeśli chodzi o przestawienie na 9,6MHz to rozumiem, że trzeba dać zewnętrzny oscylator.
  • e-mierniki
  • #4
    bart-projects
    Level 25  
    Nie trzeba zewnętrznego kwarca. Te procesory mają wewnętrzny podzielnik częstotliwości przez osiem. Fabrycznie nowy procesor ma go włączony. Bit który nim zawiaduje nazywa się CKDIV8.

    Procesor Tiny13 ma oscylator 9,6MHz ale podzielony przez osiem daje 1,2MHz. Można to wyłączyć i ślimaka przyspieszyć :D

    Fabrycznie nowy procesor ma FuseBity LOW 6A HIGH FF.
    Gdy wyłączysz CKDIV8 powinny wyglądać tak : LOW 7A HIGH FF

    Krótką instrukcję jak to można zmienić napisałem dawno temu i może nie na Tiny13 więc może być ciut nieaktualna, ale sprawdź
    -> https://bart-projects.cba.pl/ckdiv8.html
    (Bascomem patrz obrazek na samym dole strony)

    Tak na marginesie - Tiny13 ma ograniczone możliwości. Podglądanie go na PC to albo przez terminal albo specjalistyczny debuger lub analizator. Wygodniej byłoby uruchomić ten program na np. Arduino Uno/Nano z przejściem do USB a potem przenieść. Wiedziałbyś że DHT11 działa a tylko program na Tiny trzeba poprawić.
  • #6
    bart-projects
    Level 25  
    Nie pisałem o tak oczywistej dla mnie rzeczy jak to czy wykonałeś test poprawności ustawienia CKDIV8 czyli prosty program do mrugania LED

    Code: vbnet
    Log in, to see the code

    Normalnie mruga co sekundę a jak dalej chodzi na 1,2MHz to mruga co osiem :D

    Wiesz.. czegoś trzeba być pewnym, chyba że odczytałeś zaprogramowane Fusy i jesteś pewien..

    [EDIT] Po pobieżnel lekturze noty DHT podmieniłbym Sub pomiar na ten poniżej. Może pomoże :D

    Code: vbnet
    Log in, to see the code
  • #7
    koczis_ws
    Level 27  
    Oczywiście że wykonałem test i jest ok.
    Poprzednio, przed przestawieniem na 9.6MHz, faktycznie jak wpisałem taktowanie większe niż 1.2MHz to czasy się wydłużały i nie wiedziałem dlaczego. Teraz jestem ciut mądrzejszy :)
  • #8
    bart-projects
    Level 25  
    Nie zauważyłem odpowiedzi i edytowałem poprzedni swój post. Zerknij do niego. Może coś wniesie. Dodałem opisy.
    Nigdy nie miałem tego w rekach, ale sam początek wyglądał na błędnie napisany. Dalej tez bym poprawił, ale..to nie moja sprawa :P

    Jeśli ma się rezystor podciągający ok 4K7 tak jak pokazano w nocie to te linie na końcu sub wydają się zbędne:
    Code: vbnet
    Log in, to see the code
  • #9
    koczis_ws
    Level 27  
    No niestety dalej nic. Zawiesza się tu:

    If Wejscie = 1 Then 'pin dalej w stanie wysokim? (brak odpowiedzi)
    Blad = 1
    Return
    End If

    Napisałem też program z wykorzystaniem funkcji 1wire BASCOMa. Tam tak jakby odczytał jeden bajt o wartości &H40 i tyle.

    Dodano po 1 [godziny] 29 [minuty]:

    W desperacji napisałem taki program do sprawdzenia czy czujnik cokolwiek robi:

    Code: vbnet
    Log in, to see the code


    Jeżeli Wait przed pętlą ustawię i prędkość na 9.6MHz to LED sie nie zapala, a przy 1.2MHz się zapala. Czyli coś tam czujnik robi chyba(?).
    Wygląda na to,że z Tiny13 mi to nie wyjdzie :( Chyba że trzeba jeszcze coś ustawić w Tinie.
  • #11
    bart-projects
    Level 25  
    Z nowymi proponuję od razu podciągnąć linię transmisji rezystorem 4K7 do VCC i zrezygnować w ogóle z tego kodu który zamieściłeś w pierwszym poście.

    Po podaniu masy przez uC i zwolnieniu linii czujnik ma odpowiedzieć podając masę a Ty masz tam w kodzie że uC ma wystawić stan wysoki przez 40us a według noty czujnik ma odpowiedzieć pomiędzy 20us a 40us. Czujnik mógł więc próbować ściągnąć pin do masy już po 20us a tu Zonk bo procesor trzymał stan wysoki. Może to uszkodziło wyjście OC czujnika.

    Wpisz w Google "DHT11 bascom". Jest dużo sprawdzonych kodów.

    PS. Przy okazji zamówienia mogłeś sobie zamówić jakiś konwerter USB<>UART za 5zł, albo Saleae za 31,50 bo jeszcze nie raz by się przydał :D
  • #12
    koczis_ws
    Level 27  
    bart-projects wrote:
    zrezygnować w ogóle z tego kodu który zamieściłeś w pierwszym poście.

    Po podaniu masy przez uC i zwolnieniu linii czujnik ma odpowiedzieć podając masę a Ty masz tam w kodzie że uC ma wystawić stan wysoki przez 40us a według noty czujnik ma odpowiedzieć pomiędzy 20us a 40us.


    Ale Ty też tak zrobiłeś.

    Set Kierunek 'pin bedzie wyjściem
    Reset Wyjscie 'podaj stan niski
    Waitms 30 'datasheet minimum 18ms
    Reset Kierunek 'pin będzie wejściem
    Set Wyjscie 'włącz podciąganie '
    'miedzy 20us do 40us DHT ma ściągnać pin komunikacji do masy
    Waitus 41

    Ale to jest ok bo 'Wyjście' jest przez 'Reset Kierunek' ustawione jako wejście i czeka na reakcję czujnika.
    Przeglądałem wiele stron i przykładów i ten kod powstał na ich podstawie.
    Czy odwrotne podłaczenie czujnika mogło spowodować jego uszkodzenie?

    Dodano po 7 [godziny] 14 [minuty]:

    bart-projects wrote:
    czujnik ma odpowiedzieć podając masę a Ty masz tam w kodzie że uC ma wystawić stan wysoki przez 40us


    No i kurde miałeś rację :idea: . Wykasowałem to i ruszyło :D. No i musiałem po kolei usuwać wpisy do EEPROMu bo dawały dodatkowe opóźnienia. Ale dzięki nim wiedziałem gdzie trzeba coś zmienić.
    Tylko czemu wszędzie w przykładach jest Set Wyjscie ???
    Dzieki za cenne wskazówki.

    Dodano po 1 [godziny] 21 [minuty]:

    Cały program do sterowania wentylatorem łazienkowym jest taki:

    Code: vbnet
    Log in, to see the code


    Może się komuś przyda.
  • #13
    koczis_ws
    Level 27  
    Mam jeszcze pytanko. Jak przelicza się wartości podane przez DHT11 na rzeczywiste parametry temperatury i wilgotności. W datasheet nic nie znalazłem. Czy podane tam zakresy parametrów to zakres od &H00 do &HFF danych ?
    Różne przykłady jakie znalazłem to programy w C korzystające z gotowych bibliotek, a ja się uperłem na BASCOM i samodzielne opracowanie :)