Skocz do zawartości

Zamiana DHT11 na DHT22 - brak odczytu.


Danielos01

Pomocna odpowiedź

Witam, poprawiam swój termometr i napotkałem problem przy wymianie zewnętrznego czujnika DHt11 na nowy DHT22. Po podłączeniu czujnika DHT11 wszystko poprawnie pokazuje, natomiast podłączenie czujnika DHT22 pokazuje stałą wartość(przeważnie wilgotność 2-3%, a temperaturę 0 - przy rzeczywistych wartościach 70%, 230C). Czujniki na pewno jest sprawny i program też jest prawidłowy - sprawdzałem i jestem w 100% przekonany. Wygląda na to że na brak pomiarów ma wpływ połączenie czujnika. Czy ktoś mógłby mi doradzić co mógłbym poprawić w połączeniach płytki czy raczej nadaje się do zrobienia na nowo? Długość przewodu do  czujnika ma około 60 cm, natomiast dla sprawdzenia wyprowadziłem dodatkowe krótkie przewody i na nich też nie działa odczyt.

IMG_20191207_104124.jpgIMG_20191207_10412cccccc4.jpgIMG_20191207_104134.jpg

IMG_20191207_104200.jpg

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Trudno zgadywać co może być przyczyną takiego zachowania czujnika. Oba czujniki mają taki sam pin-out więc nie powinno być problemu przy zamianie o ile nie podłączasz ich odwrotnie. Jedyna różnica poza zakresem pomiarowym to częstotliwość dokonywania pomiarów która dla dht22 wynosi 0.5H czyli pomiaru można dokonywać co 2 sekundy, w przypadku dht11 jest to 1H.

Jeśli więc nie ma nigdzie przerwy w połączeniach to wniosek nasuwa się tylko jeden - czujnik jest uszkodzony. Możesz spróbować jeszcze przed podłączeniem zewrzeć ze sobą wszystkie nóżki czujnika np. wtykając go w jedną linię na stykówce - czasami taki zabieg pomaga bo rozładowuje wewnętrzne pojemności. Jeśli to nie pomoże to chyba już nic innego nie pomoże.

Dla testów spróbuj pobierać dane wolniej, np. raz na 3s.

--------

zrobiłem mały research i znalazłem taki poradnik: http://akademia.nettigo.pl/dht22/

Zwróć uwagę na rezystor podciągający pomiędzy pinem 1 a 2 i sposób pobierania danych. Powodzenia

Edytowano przez Anonim
aktualizacja
Link do komentarza
Share on other sites

(edytowany)

Dzięki za zainteresowanie tematem. Daje sobie uciąć rękę że czujnik DHT22 jest sprawny - posiadam dwa takie czujniki, oba sprawne.

Odczyt dokonuje co 10 sekund a docelowo będzie jeszcze większy odstęp czasu.

Czujniki podłączone do Arduino i wgrany z biblioteki program do testu - czujniki działaj. Wypinamy z Arduino i wpinam w płytkę i nie dzialaj. Nie ma możliwości że są uszkodzone, przejścia na płytce są, zmierzyłem rezystancję między pinem uC a data czujnika i wynosi 0.8 oma.

Kod uważam za dobry, bo:

1) jak podłącze DHT11 to działa bez zarzutu - używam biblioteki której autorem jest Mark Ruys;

2)po wgraniu do Arduino(na płytke arduino) i podłączeniu czujnika DHT22 w serial monitorze wyświetla prawidłowe wartości.

//Stacja pogodowa(temperatura + wilgotnosc)

//Ustawienia wyświetlacza
#include <LiquidCrystal.h>
const int rs = 8, en =0, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//Utworzenie znaku stopni (wyswietlacz)
byte stopnie[8]={
  0b11100,
  0b10100,
  0b11100,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
  };
  
//Ustawienia czujnikow DHT
#include "DHT.h"
#define DHT11_WEW 9    //czujnik wewnetrzny DHT11 (pin9)
#define DHT22_ZEW 10    //czujnik zewnetrzny DHT22(pin 10)
DHT dht_wew;
DHT dht_zew;

//Przycisk i zmienne
#define przycisk1 1 //przycisk do podswietlania wyswietlacza
#define przycisk2 2  //przycisk do zmiany menu wyswietlacza, przycisk do obslugi przerwan
#define LED 3       //dioda podswietlenia wyswietlacza
#define foto A5     //fotorezystor do automatycznego sterowania podswietleniem
int podswietlenie;
int wybor=0;        //zmienna do sterownia wyswietlaczem
//zmienne przetrzymujace max i min temperature na zewnatrz
float max_temp;     
float min_temp;
//zmienne przetrzymujace max i min wilgotnosci na zewnatrz
int max_wilg;
int min_wilg;
//zmienne przetrzymujace wartosc wilgotnosci i temperature wewnatrz budynku
int wilgotnosc_wew;
int temperatura_wew;
//zmienne przetrzymujace wartosc wilgotnosci i temperature na zewnatrz
int wilgotnosc_zew;
float temperatura_zew;

void setup() 
{
  pinMode(LED,OUTPUT);
  analogWrite(LED,podswietlenie);
  lcd.begin(16, 2); 
  lcd.createChar(0,stopnie);
  dht_wew.setup(DHT11_WEW);
  dht_zew.setup(DHT22_ZEW);
  attachInterrupt(digitalPinToInterrupt(przycisk2), menu, LOW); // Przerwanie(reagujące na stan niski) 
}                                                                  //sluzace do przelaczania wyswietlanego teksu na wyswietlaczu
                                                    

void menu() //funkcja do przelaczania menu wyswietlacza
{
  if(wybor<3)
    wybor++;
  else
    wybor=0;
}

void wyswietlacz() //wybor informacji na wyswietlaczu
{
  switch(wybor) 
  {
    case 0: stan1(); break;
    case 1: stan2(); break;
    case 2: stan3(); break;
  }
}

void stan1()  //funkcja menu glownego, wyswietlanie aktualnych danych
{
  lcd.clear();
  lcd.print("WEW: "); lcd.print(wilgotnosc_wew); lcd.print("%  ");
  lcd.print(temperatura_wew); lcd.print((char)0);lcd.print("C");
  lcd.setCursor(0,1); 
  lcd.print("ZEW: ");lcd.print(wilgotnosc_zew); lcd.print("%  "); 
  lcd.print(temperatura_zew); lcd.print((char)0); lcd.print("C");
}

void stan2()  //funkcja wyswietlanie max i min temperatury zewnetrznej
{
  lcd.clear();
  lcd.print("max temp: "); lcd.print(max_temp); lcd.print((char)0);lcd.print("C");
  lcd.setCursor(0,1); lcd.print("min temp: "); lcd.print(min_temp); lcd.print((char)0);lcd.print("C");
}

void stan3()  //funkcja wyswietlanie max i min wilgotnosci zewnetrznej
{
  lcd.clear();
  lcd.print("max wilg: "); lcd.print(max_wilg); lcd.print("%");
  lcd.setCursor(0,1); lcd.print("min wilg: "); lcd.print(min_wilg); lcd.print("%");
}

void loop()
{
  //Pobieranie informacji o jasnosci oswietlenia (fotorezystor)
    podswietlenie=analogRead(foto);
    podswietlenie=map(podswietlenie,0,1023,0,250);
    analogWrite(LED,podswietlenie);
  
  //Reczne podswietlenie wyswietlacza
  if(digitalRead(przycisk1)==LOW)
  {
    podswietlenie=200;
    analogWrite(LED,podswietlenie);
    delay(3000);
  }
  
  //Pobranie informacji o wilgotnosci i temperaturze DHT11
  wilgotnosc_wew = dht_wew.getHumidity();
  temperatura_wew = dht_wew.getTemperature();
  
  //Pobranie informacji o wilgotnosci i temperaturze DHT22
  wilgotnosc_zew = dht_zew.getHumidity();
  temperatura_zew = dht_zew.getTemperature();

  //Zapisywanie max i min temperatury
  if(temperatura_zew>max_temp)
    max_temp=temperatura_zew;
  else
    if(temperatura_zew<min_temp)
      min_temp=temperatura_zew;
  
  //Zapisywanie max i min wilgotnosci
  if(wilgotnosc_zew>max_wilg)
    max_wilg=wilgotnosc_zew;
  else
    if(wilgotnosc_zew<min_wilg)
      min_wilg=wilgotnosc_zew;
  
  wyswietlacz();
  delay(10000);   //przerwa programowa  
}

 

Edytowano przez Danielos01
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

33 minuty temu, ethanak napisał:

Ja bym mimo wszystko zamiast autodetekcji wymusił model przy inicjalizacji... spróbuj.

Nie bardzo rozumiem o co Ci tutaj chodzi.

Wstawiłem do kodu dht_zew.getStatusString(), i po włączeniu zasilania przez około 10 sekund status jest TIMEOUT, po czym status zmienia się w OK . Zrobiłem to dla DHT22 (zdjecia) oraz dla DHT11 i tutaj przy statusie OK wyświetla prawidłowe wartości.

IMG_20191207_124031.jpg

IMG_20191207_124103.jpg

Link do komentarza
Share on other sites

może spróbuj nim poruszać, raz w jedną raz w drugą stronę.. może w czujniku coś nie łączy. Chińskie guano świat zalewa i tylko czasu szkoda się z tym zmagać godzinami, dniami, latami.. i życie zleci jak z.. strzelił. Powinien działać bez żadnego problemu.

Link do komentarza
Share on other sites

Nie bardzo rozumiem o co Ci tutaj chodzi.

To dlaczego używasz biblioteki, której nie potrafisz użyć?

Metodę dht.setup możesz wywołać z dwoma parametrami (drugi to typ). zajrzyj proszę na własny dysk i obejrzyj plik DHT.h.

autodetekcja jest rozwiązana w bardzo uproszczony sposób (tzn. że jeśli wystąpił timeout to jest to dht11). Dodatkowo jest informacja, że po autodetekcji musisz co najmniej sekundę zaczekać przed następnym odczytem. Jakoś tego w Twoim programie nie widzę (czyli  program nie jest poprawny).  10 sekund po starcie to Twój delay.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

A masz ten podciąg do Vcc w ogóle? Ten od DO, być może dht11 ma wewnętrzny a 22 nie.

Tak też może być jak@ethanak pisze, trzeba zawsze najpierw przejrzeć chociaż pobieżnie pliki wykorzystywanych bibliotek.

Link do komentarza
Share on other sites

Dzięki wielkie @ethanak i @atMegaTona za pomoc. Wstawiłem przerwę po autodetekcji jak pisałeś @ethanak. Czy mógłbyś jeszcze poswięcić mi jedną odpowiedź na wytłumaczenie dwóch rzeczy:

1) pisałeś że można w dht.setup wywołać typ czujnika - jak to zrobić, w sensie co wpisać dla czujnika DHT11, DHT22 w dht.setup(2,???);
2) skąd wiesz że trzeba odczekać minimum 1 sekundę po autodetekcji

Jeżeli nie będzie to problem to byłbym wdzięczny za pomoc.

Link do komentarza
Share on other sites

Przed chwilą, Danielos01 napisał:

1) pisałeś że można w dht.setup wywołać typ czujnika - jak to zrobić, w sensie co wpisać dla czujnika DHT11, DHT22 w dht.setup(2,???);

zajrzałeś do DHT.h?

Odpowiedni fragment:

class DHT
{
public:

  typedef enum {
    AUTO_DETECT,
    DHT11,
    DHT22,
    AM2302,  // Packaged DHT22
    RHT03    // Equivalent to DHT22
  }
  DHT_MODEL_t;

  void setup(uint8_t pin, DHT_MODEL_t model=AUTO_DETECT);

 

5 minut temu, Danielos01 napisał:

2) skąd wiesz że trzeba odczekać minimum 1 sekundę po autodetekcji

Bo czytam opisy i komentarze w bibliotekach. W pliku DHT.cpp masz odpowiedni komentarz:

if ( model == AUTO_DETECT) {
    DHT::model = DHT22;
    readSensor();
    if ( error == ERROR_TIMEOUT ) {
      DHT::model = DHT11;
      // Warning: in case we auto detect a DHT11, you should wait at least 1000 msec
      // before your first read request. Otherwise you will get a time out error.
    }
  }

Zresztą ten fragment dość dokładnie wyjaśnia dlaczego nie należy korzystać z autodetekcji.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.