Acquisire dati da sensore DHT11

Attenzione !I messaggi sul forum potrebbero essere modificati dal nostro staff. La data e l'ora dei messaggi potrebbe non essere quella di invio ma quella di moderazione da parte dello staff. Grazie per l'attenzione.

Home Forum Controllori SlimLine e Netsyst (LogicLab) Acquisire dati da sensore DHT11

Questo argomento contiene 0 risposte, ha 1 partecipante, ed è stato aggiornato da  Sergio Bertana 2 mesi fa.

Stai vedendo 1 articolo (di 1 totali)
  • Autore
    Articoli
  • #46894

    Sergio Bertana
    Amministratore del forum

    Ricevo da un cliente la richiesta in merito alla possibilità di acquisire dati da un sensore di temperatura e umidità DHT11 con un modulo CPU compact. Vediamo come è possibile interfacciare in modo economico il sensore al modulo CPU.

    Intanto cominciamo con il dire che come si evince dal data sheet il sensore ha un suo protocollo di comunicazione basato su 1 segnale digitale da 3 a 5 Volt. Il segnale è bidirezionale, un impulso basso di almeno 18mS forza la trasmissione in uscita dal sensore dei 40 bits di dato. I bits di dato sono di durata:

    Bit ‘0’ : ~54uS Low and ~24uS High
    Bit ‘1’ : ~54uS Low and ~70uS High

    Per leggere questi dati a questa velocità è possibile utilizzare i segnali DTR e CTS della porta seriale, la funzione SysSetSerialDTR permette di settare lo stato del DTR in uscita, la funzione SysGetSerialCTS permette di acquisire lo stato del CTS in ingresso.

    Quindi interfacciandosi con questi segnali che ricordo sono a livello logico compatibile con la RS232 (-6V il livello FALSE e +6V il livello TRUE) è possibile collegarsi tramite un traslatore di livello al pin di I/O del DHT11. Poi con un programma in ST è possibile gestirne il protocollo. Posto di seguito un esempio di gestione DTR e lettura CTS.

    IF (SysFirstLoop) THEN
    Serial.COM:=ADR('COM0'); (* COM port definition *)
    Serial.Baudrate:=19200; (* Baudrate *)
    Serial.Parity:='E'; (* Parity *)
    Serial.DataBits:=8; (* Data bits *)
    Serial.StopBits:=1; (* Stop bits *)
    Serial.DTRManagement:=DTR_OFF; (* DTR management *)
    Serial.DTRComplement:=FALSE; (* DTR complement *)
    Serial.EchoFlush:=FALSE; (* Received echo flush *)
    Serial.DTROnTime:=0; (* DTR On time delay (mS) *)
    Serial.DTROffTime:=0; (* DTR Off time delay (mS) *)
    Serial.FlushTm:=0; (* Flush time (mS) *)
    Serial.RxSize:=0; (* Rx buffer size *)
    Serial.TxSize:=0; (* Tx buffer size *)
    END_IF;
    
    Serial(Open:=TRUE); (* Serial port management *)
    
    i:=SysSetSerialDTR(TRUE, Serial.File);
    FOR i:=0 TO 10 DO i:=i; END_FOR;
    CTSSts[0]:=SysGetSerialCTS(Serial.File);
    
    i:=SysSetSerialDTR(FALSE, Serial.File);
    FOR i:=0 TO 10 DO i:=i; END_FOR;
    CTSSts[1]:=SysGetSerialCTS(Serial.File);
    
    i:=SysSetSerialDTR(TRUE, Serial.File);
    FOR i:=0 TO 10 DO i:=i; END_FOR;
    CTSSts[0]:=SysGetSerialCTS(Serial.File);
    
    i:=SysSetSerialDTR(FALSE, Serial.File);
    FOR i:=0 TO 10 DO i:=i; END_FOR;
    CTSSts[1]:=SysGetSerialCTS(Serial.File);
Stai vedendo 1 articolo (di 1 totali)

Devi essere loggato per rispondere a questa discussione.