• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
DHT11 - prawidłowy co drugi odczyt
#1
Posiadam czujnik DHT11 bez rezystora, podłączyłem go mostkując +5V z Data przez rezystor 4.7, dodatkowo GND do GND, VCC do 5V i Data do pinu numer 2.
Korzystam z biblioteki "Mark Ruys" i po wgraniu szkicu co drugi odczyt to wilgotność 0 i temperatura 0, jakby co drugą sekundę pojawia się prawidłowy odczyt, a odświeża co sekundę.
Kod:
#include "DHT.h"
#define DHT11_PIN 2
DHT dht;

void setup()
{
 Serial.begin(9600);
 dht.setup(DHT11_PIN);
}

void loop()
{
 //Pobranie informacji o wilgotnosci
 int wilgotnosc = dht.getHumidity();
 Serial.print(wilgotnosc);
 Serial.print("%RH | ");
 
 //Pobranie informacji o temperaturze
 int temperatura = dht.getTemperature();
 Serial.print(temperatura);
 Serial.println("*C");

 delay(1000); //Odczekanie wymaganego czasu
}
Gdy wgram wersję, która pokazuje tylko prawidłowy odczyt pojawiają się tylko prawidłowe wartości ale mniej więcej co 2 sekundy, jakby pomija te, które byłyby równe 0.
Kod:
#include "DHT.h"
#define DHT11_PIN 2
DHT dht;

void setup()
{
 Serial.begin(9600);
 dht.setup(DHT11_PIN);
}

void loop()
{
 //Pobranie informacji o wilgotnosci
 int wilgotnosc = dht.getHumidity();
 //Pobranie informacji o temperaturze
 int temperatura = dht.getTemperature();
 
 if (dht.getStatusString() == "OK") {
   Serial.print(wilgotnosc);
   Serial.print("%RH | ");
   Serial.print(temperatura);
   Serial.println("*C");
 }
 
 //Odczekanie wymaganego czasugo
 delay(dht.getMinimumSamplingPeriod());
}

Dlaczego tak jest, czytałem, że DHT11 pozwala na odczyt co 1 sekundę, a DHT22 co 2 sekundy. Czy coś jest nie tak z czujnikiem, czy jest ich aż tyle wersji, że różnie działają? Wygląda, że czujnik działa, a co drugi odczyt więc nie wiem czego to jest wina?
 
Odpowiedź
#2
Widocznie znalazłeś rozwiązanie. Chcesz częściej odczytywać wilgotność to zmień czujnik. Zawsze sprawdzaj czy wynik jest prawidłowy przed jego użyciem w programie, nawet odczyt co 5s nie gwarantuje, że każda transmisja zakończy się sukcesem. Sprawdzanie wartości co 1s też ma mało sensu, bo czujnik potrzebuje kilku sekund by zauważyć zmianę wilgotności otoczenia. Oczywiście nie zatrzymuj programu na 2 - 5s, użyj millis i po prostu przez 2-5s pomijaj odczyt czujnika.
 
Odpowiedź
#3
Ogólnie chodzi o to, że przeglądałem różne projekty i zazwyczaj przy odczycie co 1 sekundę prawidłowo pokazywało odczyt i najwyżej co, któryś odczyt był błędny. U mnie wygląda tak, że dokładnie co drugi odczyt jest nieprawidłowy. Jeżeli chodzi o przydatność tak częstego odczytu to faktycznie nie odgrywa to aż tak dużej roli ale chodzi mi o to czy z moim czujnikiem jest coś nie tak, czy DHT11 tak działa (chociaż w innych tutorialach, które przeglądałem właśnie co 1s odczyt wydaje mi się, że działa), czy w ogóle pomimo wspólnej nazwy "DHT11" aż tak mogą się różnić, że u kogoś działa co 1 sekundę, a np. u mnie co 2s i to jest normalne zachowanie? Chodzi mi przede wszystkim o to czy czujnik jest w 100% sprawny czy coś z nim jest jednak nie tak.
 
Odpowiedź
#4
Nie ma co dzielić włosa na czworo. Ten czujnik i tak jest najsłabszy z popularnych czujników wilgotności do Arduino. Nie licz na to, że jak pokazuje 35% to jest to faktycznie 35% +/-5. Ostatnio podłączyłem 4 obok siebie niby wyższej klasy niż ten DHT11 i rozjazd był 15% między nimi, a teoretycznie najsłabszy był najbliżej czujnika wzorcowego. Ale czy czujnik wzorcowy pokazuje dzisiaj dobrze też nie wiem, sprawdzany był 2 lata temu, czy pokazywał dobrze od tamtej pory dowiem się dopiero po następnym wzorcowaniu.
Taki urok chińskiego sprzętu, może wystarczy zwiększyć czas między odczytami do 1.1 sekundy i już będzie OK.
Zresztą w PDF nic nie ma o 1s, a na WIKI w opisie jest minimalny czas samplowania 1s, https://www.itead.cc/wiki/DHT11_Humidity...nsor_Brick, więc może trwać i 10s i pretensji mieć nie można. Nie wiem skąd wzięli tę 1 sekundę. W przykładowym szkicu do DHT11 też mam delay 2000ms.
 
Odpowiedź
#5
Przeprowadziłem kilka testów i już przy delay(1150) już działa każdy odczyt (poza pierwszym, ale przy większych czasach też pierwszy odczyt po wgraniu programu to 0).
Teraz tylko jak zmienić drugi program czyli ten, który pomija błędne pomiary aby wykonywał pomiar nie co 2 sekundy, a co 1150?
Czy należy:
Kod:
delay(dht.getMinimumSamplingPeriod());
zmienić na:
Kod:
delay(1150); //Odczekanie wymaganego czasu
Nie wiem gdzie jest ten minimalny czas ustawiony w tym przykładzie.

Ogólnie w porównaniu z kupioną stacją pogodową temperatury wyglądają prawie identycznie tak wilgotność jest zawyżona czasami o 4, a czasami nawet o 10 (dopiero licząc maksymalne poziomy błędów jakie ma czujnik i stacja jest szansa, że wynik końcowy będzie prawie taki sam).
 
Odpowiedź
#6
Moja biblioteka w przypadku esp dht działa prawidłowo mimo że odczytywal bym co 100ms zawsze wynik jest poprawny i te same ma komendy get. Temperature itd. Biblioteka tak jest skonstruowana jakby czujnik miał pamięć i pobiera dane z pamięci a w pamięci aktualizował co 2s.
 
Odpowiedź
#7
Zajrzyj do przykładu blinkWithoutDelay, tam jest zrobione miganie led co 1s możesz zamienić na 2000 i to co jest w tym if'ie do zmiany stanu led jest robione co 2s. To najprostszy sposób by nie blokować działania uC na 1-2s, bo w tym czasie jest ślepy i głuchy, np. na przyciski. W ten sam sposób robisz wyświetlanie na ekran LCD, czy drukowanie na serial. Na forum wrzucałem też przykład funkcji czas() wykorzystującej ten mechanizm z opisem jak działa. Używając jej można robić pomiar tylko w nowej parzystej sekundzie if(fsekundy &&(sekundy%2==0));.
Na forach czytałem że te DHT22 lubią się powiesić i pomaga im tylko odłączenie zasilania. Zasilić można go z pinu uC, podajesz mu napięcie tak samo jakbyś zaświecał led, można tu też dodać rezystor 100om. Pobór prądu na poziomie 1mA jest OK dla Atmegi. W ten sam sposób zasilam nawet mały ekran OLED.
Wystarczy w SETUP dodać jakiś delay przy starcie lub zadbać o to by pierwszy pomiar nie był szybciej niż 2s po podaniu zasilania - daj mu czas na naładowanie kondensatorów i prawidłowe rozpoczęcie pracy.
W programie dodaj obsługę WDT:
Kod:
#include <avr/wdt.h>

void setup() {
wdt_enable(WDTO_4S);

}

void loop() {
wdt_reset();

}

Jeśli DTH zawiesi komunikację i uC stanie to WDT po 4s go zresetuje, przy starcie odłącz DHT zasilanie, włącz za 2 sekundy (to go ewentualnie zresetuje) za kolejne 2s wróć do pomiarów.
Cały obieg pętli loop w powyższym ustawieniu WDT nie może trwać dłużej niż 4s (WDTO_4S można zmienić na mniejszy lub na max 8s), ale pętle dłuższe niż kilka ms to i tak porażka.  Dlatego tak ważne jest by nie używać delay, a zamiast tego z mills pomijać wykonywanie poleceń, na które jeszcze nie pora.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości