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);