Skocz do zawartości
Danielos01

Zamiana DHT11 na DHT22 - brak odczytu.

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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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 atMegaTona
aktualizacja

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

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

Poza tym nie sprawdzasz, czy getCośtam() nie zwrócił błędu, może też spróbuj...

Udostępnij ten post


Link to post
Share on other sites
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

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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.

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
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!

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