DHT11 Temperatur-/Feuchtigkeitssensor

Derzeit versuche ich, ein Byte von meinem dht11-Sensor zu lesen und in das virtuelle Terminal zu schreiben, aber ich konnte kein einfaches Datenblatt für Anfänger finden. Ich fand einen etwas komplizierten mikroC-Code und eine Einrichtung mit pic16f628a und lcd. Sie können es hier finden. Das funktioniert, aber wenn ich ein virtuelles Terminal hinzufüge. Auf dem virtuellen Terminal wird nichts angezeigt, selbst wenn ich die erforderlichen mikroC-Codes hinzufüge. Während meines zweiten Versuchs, ich ersetze meinen Mikrocontroller durch pic16f877a, kann ich diesen Text auf dem virtuellen Terminal "Keine Antwort vom Sensor" sehen, was die Fehlermeldung meines mikroC-Codes ist.

Hier sind einige Informationen über dht11; DHT11 verwendet eine vereinfachte Single-Bus-Kommunikation. Einzelbus, der nur eine Datenleitung, das System des Datenaustauschs, Steuerung durch einen einzigen Bus zu vervollständigen. Es sendet ein 40-Bit-Datenformat: Die ganzzahligen 8-Bit-Luftfeuchtigkeitsdaten + 8-Bit-Dezimaldaten der Luftfeuchtigkeit +8-Bit-Ganzzahl-Temperaturdaten + 8-Bit-Teiltemperaturdaten +8-Bit-Paritätsbit. Sie finden das Datenblatt auch von: hier

Wie Sie sehen können, gibt es keine fehlerhafte Verbindung

Ich bekomme auch das gleiche Problem, wenn ich versuche, pic16f877a zu verwenden. Entschuldigung, wenn Sie die Lösung dafür haben, helfen Sie mir bitte, Justine Joseph
@JustineWambura Nach dem 19. Dezember werde ich eine Schritt-für-Schritt-Lösung veröffentlichen, die mikroC-Code, Proteus-Simulation, Hardware-Images usw. enthält. Wenn Sie denken, dass es zu spät ist, hier ein Hinweis: DHT11 sendet 40 Bits in Folge, bevor Sie diese erhalten Bits sollten Sie das Signal starten, ein Beispiel finden Sie hier . In diesem Beispiel kann der Timer-Teil verwirrend und problematisch sein. Schau dir das Teil an. Viel Glück :)

Antworten (2)

Vor ein paar Wochen wollte ich eine einfache Schaltung aufbauen, die Feuchtigkeit und Temperatur in der Luft messen soll. Wenn ich anfange zu recherchieren, habe ich keine Kenntnisse darüber, wie man eine Schaltung einrichtet oder wie ich einen Code in eine Mikrocontrollereinheit einbetten kann und viele ähnliche Fragen.

Im Folgenden erkläre ich meine kleine Herausforderung Schritt für Schritt. Ich hoffe, es wird hilfreich sein. Bevor wir anfangen, sollten Sie Ihre Tassen auffüllen, es könnte etwas lang dauern.

Hier ist nun meine Komponentenliste;

Bild 16F877A (40-Pin) Quarz 4,0 MHz 22pF Kondensator 100nJ Kondensator (0,1uF) 330nJ Kondensator (0,3uF) DHT11 (Feuchtigkeits- und Temperatursensor) 1uF Kondensator (1 Mikrof) 10uF Kondensator max232 RS232 DB9 Anschluss 9V Batterie & Batterieverschluss

Einrichten;

1) Steckbrett

Einige Arten von Steckbrettern haben eine positive oder negative Leitung durch die Platine, auf der anderen Seite können die Strom- und Erdungsleitungen der anderen Typen in zwei Teile geteilt werden. Sie können dies herausfinden, indem Sie sich die roten und blauen Linien auf dem Steckbrett ansehen. Und im Inneren gibt es Buchstaben und Zahlen. Zahlen repräsentieren die Säulen, die miteinander verbunden sind. Wenn ich also 5 V an A-0 anschließe, haben B-0, C-0, D-0 und E-0 die gleiche Spannung.Geben Sie hier die Bildbeschreibung ein

2) 7805 Regler (9V bis 5V)

Wenn Sie die Datenblätter von pic16f877a und dht11 gelesen haben, haben Sie erfahren, dass sie mit 5 V arbeiten, unsere Batterie jedoch 9 V hat.Geben Sie hier die Bildbeschreibung einGeben Sie hier die Bildbeschreibung ein

Wie Sie oben sehen können, können Sie Ihre Spannung leicht regulieren. Jetzt können Sie Ihre positiven Klemmen vom Ausgang des Reglers speisen.

3) DHT11 (Sensor)

Dies ist ein günstiger, digitaler Feuchtigkeits- und Temperatursensor mit 4 Pins. Hier ist ein schönes Datenblatt (aufgrund meines guten Rufs konnte ich nicht mehr als 2 Links posten. Sie können es bei Google finden, wenn Sie es finden, werfen Sie einen Blick auf zwei oder mehr Datenblätter, da einige davon möglicherweise nicht klar genug sind). wichtig, um zu verstehen, wie dht11 funktioniert. Während Sie an elektronischen Projekten arbeiten, werden Sie in einer wirklich kurzen Erklärung auf Vcc-, Vdd-, Vss- und Vee-Pins stoßen. Vcc und Vdd sind eine positive Spannungsversorgung, Vee und Vss sind eine negative Masseversorgung. Sie können also davon ausgehen, dass Vcc und Vdd für die folgenden Bilder gleich sind.Geben Sie hier die Bildbeschreibung einGeben Sie hier die Bildbeschreibung ein

4) Bild 16F877A (40-polig)

Dies ist eine bekannte Mikrocontrollereinheit, die leicht zu finden ist und genug Bein für mein Projekt hat, deshalb bevorzuge ich dieses Bild. Hier ist das Datenblatt: (Leider konnte ich aufgrund meines Rufs nicht mehr als 2 Links posten. Sie finden es auf der Webseite von Mikrochip) Das Datenblatt zeigt Ihnen das Pin-Diagramm. Im Diagramm sehen Sie Zahlen von 1 bis 40. Auf dem folgenden Bild sehen Sie den kleinen eingestürzten Punkt. Es repräsentiert das Hinspiel.

Geben Sie hier die Bildbeschreibung ein

5) Kristall (Uhr)

Wie jeder Prozessor muss auch der 877a takten. Bitte beachten Sie nicht die Kristall-Mhz des Schemas, unsere Schaltung arbeitet mit 4-MHz-Quarzkristall mit 22-pF-Kondensatoren.

Geben Sie hier die Bildbeschreibung ein

6) Max232

Ok, wie gesagt, dieses Projekt wird Temperatur und Luftfeuchtigkeit messen und diese Werte an den Computer senden. Um diese Werte von unserer Schaltung zum PC zu bekommen, müssen wir an dieser Stelle einen seriellen Kommunikationsteil bauen. Haben Sie keine Angst vor Telekommunikationswörtern, mit Hilfe des RS-232-Kabels ist alles ganz einfach. Bevor Sie das Kabel anschließen, sollten Sie das folgende Schema erstellen. Auf dem Bild sehen Sie TTL Serial TX und RX, diese beiden Kabel werden mit den Pins 25 (TX) und 26 (RX) des Bildes verbunden.

Geben Sie hier die Bildbeschreibung ein

Das obige Schema kann verwirrend sein, wenn Sie sich vorstellen, dass am unteren Rand des Bildes eine Masse und vier schwarze Knoten (die sich nahe am unteren Rand befinden) mit Masse verbunden sind.

Für ein vollständiges Proteus-Tutorial finden Sie mein Video unten, aber vergessen Sie nicht, dass Proteus nur eine Simulation ist und das nicht garantiert, dass Ihre Hardware richtig funktioniert. Vor allem die Frequenz kann einige Probleme verursachen. Hier ist

Mein YouTube-Video!

Im mikroC-Code stelle ich die LEDs entsprechend der Luftfeuchtigkeit ein, wenn sie größer als 20% ist, schaltet sich die obere LED ein, und wenn die Luftfeuchtigkeit 30% überschreitet, schaltet sich auch die 2. LED ein.

Geben Sie hier die Bildbeschreibung ein

MikroC-Code;

sbit Data    at RB0_bit;
sbit DataDir at TRISB0_bit;
unsigned short k;

unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
char temp[] = "Temperature is 00.0 C";
char hum[] = "Humidity is 00.0 %";

void DHT11StartSignal(){
  DataDir = 0;
  Data    = 0;
  Delay_ms(25);
  Data    = 1;
  Delay_us(30);
  DataDir = 1;
}

unsigned short DHT11CheckResponse(){
  k = 150;
  while(!Data){
    Delay_us(2);
    k--;
    if(k<1) return 0;  // time out
  }
  k = 150;
  while(Data){
    Delay_us(2);
    k--;
    if(k<1) return 0;   // time out
  }
  return 1;
}


unsigned short DHT11ReadByte(){
  int i;
  unsigned short num = 0;
  DataDir = 1;
  for (i=0; i<8; i++){
    while(!Data);
    Delay_us(40);
    if(Data) num |= 1<<(7-i);
    while(Data);
  }
  return num;
}

void main() {
  UART1_Init(9600);
  TRISC.RC0 = 0;
  TRISC.RC1 = 0;
  TRISC.RC2 = 0;

  while(1){
    DHT11StartSignal();
    if(!DHT11CheckResponse()) continue;
    RH_Byte1 = DHT11ReadByte();
    RH_Byte2 = DHT11ReadByte();
    T_Byte1 = DHT11ReadByte();
    T_Byte2 = DHT11ReadByte();
    DHT11ReadByte(); /* Checksum */

    // Set temp
    temp[15] = T_Byte1/10 + 48;
    temp[16] = T_Byte1%10 + 48;
    temp[18] = T_Byte2/10 + 48;
    UART1_Write_Text(temp);
    UART1_Write(10);
    UART1_Write(13);

    // Set hum
    hum[12] = RH_Byte1/10 + 48;
    hum[13] = RH_Byte1%10 + 48;
    hum[15] = RH_Byte2/10 + 48;
    UART1_Write_Text(hum);
    UART1_Write(10);
    UART1_Write(13);
    UART1_Write(10);
    UART1_Write(13);

    PORTC.RC0 = (RH_Byte1) >= 20;
    PORTC.RC1 = (RH_Byte1) >= 30;
    PORTC.RC2 = (RH_Byte1) >= 40;

    // Wait
    Delay_ms(1000);
  }
}

Und letzter Teil:

Code in die MPU einbetten;

Bildstation

Geben Sie hier die Bildbeschreibung ein

DHT11 ATMEGA8 MikroC Programmierung...

sbit Data    at PORTC5_Bit;
sbit Data_In at PINC5_Bit;
sbit DataDir at DDC5_bit;

unsigned short k,l;

unsigned int T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
char temp[] = "Temperature is 00.0 C";
char hum[] = "Humidity is 00.0 %";

void DHT11StartSignal(){
  DataDir = 1;
  Data    = 0;
  Delay_ms(18);
  Data    = 1;
  Delay_us(40);
  //Data = 0;
  DataDir = 0;
}

int DHT11CheckResponse(){
  k = 150;
  while(!Data_In)
  {
    Delay_us(10);
    k--;
    if(k<=1)
    {
     UART1_Write('D');
     return 0;  // time out
    }
  }

  k = 150;
  while(Data_In)
  {
    Delay_us(20);
    k--;
    if(k<=1)
    {
    UART1_Write('T');
    return 0;   // time out
    }
  }
  return 1;
}


unsigned int DHT11ReadByte(){
  int i;
  unsigned short num = 0;
  DataDir = 0;
  for (i=0; i<8; i++){
    while(!Data_In);
    Delay_us(25);
    if(Data_In) num |= 1<<(7-i);
    while(Data_In);
  }
  return num;
}

void main() {
  UART1_Init(9600);
  while(1){
again:
    DHT11StartSignal();
   if(!DHT11CheckResponse()) continue;
    RH_Byte1 = DHT11ReadByte();
    RH_Byte2 = DHT11ReadByte();
    T_Byte1 =  DHT11ReadByte();
    T_Byte2 =  DHT11ReadByte();
    DHT11ReadByte(); /* Checksum */

    // Set temp
    temp[15] = T_Byte1/10 + 48;
    temp[16] = T_Byte1%10 + 48;
    temp[18] = T_Byte2/10 + 48;
    UART1_Write_Text(temp);
    UART1_Write(10);
    UART1_Write(13);

    // Set hum
    hum[12] = RH_Byte1/10 + 48;
    hum[13] = RH_Byte1%10 + 48;
    hum[15] = RH_Byte2/10 + 48;
    UART1_Write_Text(hum);
    UART1_Write(10);
    UART1_Write(13);
    UART1_Write(10);
    UART1_Write(13);


    // Wait
    Delay_ms(1000);
  }
}