Problema con Sensori di temperatura

Con l’ide 1.8.13 me l’ha installata senza problemi.

Io ho installato ide 1.8.13 ma utilizzo Visual Studio Code.

Mai usato VSCode per arduino.

Allora… dopo infiniti tentativi ho parzialmente risolto il problema.

  1. Impostazione della seriale errata, SimpleDHT22 vuole i 115200 e non i 9600 come avevo impostato io.

  2. scrivendo questo codice:

SimpleDHT22 sensTemp(_S_TMAC);

		Serial.print("pin DHT : ");
		Serial.println(_S_TMAC);

		//Creo la variabile temporanea relativa all'umidita'
		float umidita = 0 ;

		//Creo la variabile intera relativa a simpleDHTErrSuccess
		int err = SimpleDHTErrSuccess;

		if ((err = sensTemp.read2(&temperatura, &umidita, NULL)) != SimpleDHTErrSuccess){
				
			temperatura = 999;

		}

		//Serial.print("Temp DHT : ");
		//Serial.println(temperatura);

		//Aggiungo un piccolo delay di sincronizzazione
    	        delay(50);

funziona tutto correttamente… MA… come provo a togliere quel Serial.print all’inizio torna a non funzionare. Ho provato ad inserire dei delay prima da 5 poi da 20 e anche da 50 ma niente… Ovviamente non posso sporcare la seriale visualizzando il numero del piedino del sensore :sweat_smile:

Ho provato a modificare anche il file di esempio:

#include <SimpleDHT.h>

// for DHT22, 
//      VCC: 5V or 3V
//      GND: GND
//      DATA: 2
int pinDHT22 = 44;
SimpleDHT22 dht22(pinDHT22);

void setup() {
  Serial.begin(115200);
}

void loop() {
  // start working...
  //Serial.println("=================================");
  //Serial.println("Sample DHT22...");
  
  // read without samples.
  // @remark We use read2 to get a float data, such as 10.1*C
  //    if user doesn't care about the accurate data, use read to get a byte data, such as 10*C.
  float temperature = 0;
  float humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht22.read2(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT22 failed, err="); Serial.print(SimpleDHTErrCode(err));
    Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(2000);
    return;
  }
  
  Serial.print("Sample OK: ");
  Serial.print((float)temperature); Serial.print(" *C, ");
  Serial.print((float)humidity); Serial.println(" RH%");
  
  // DHT22 sampling rate is 0.5HZ.
  delay(2500);
}

commentando i due serial.print iniziali. E non funziona!!

Mi sembra alquanto strano che questa libreria voglia avere due serial.print all’inizio per funzionare… mhaaa

Non vedo nessun motivo logico per cui servano 2 Serial.print per far funzionare la libreria…

Vallo a dire a me…

Sto provando con la libreria DHT.h e funziona, ma vorrei rendere il codice più snello.
Mi spiego meglio.

Come in precedenza, nel costruttore creo un oggetto DHT sensore(pin,tipo) e lo memorizzo in una variabile DHT _sensTemp privata.

Nel metodo getTemperatura vado a richiamare quella variabile _sensTemp, etc…

Ma ottengo questo errore che non riesco a capire a cosa si riferisce:

C:\Users\fabs\AppData\Local\Temp\arduino_build_955354\sketch\sensore_temperatura.cpp: In constructor 'sensore_temperatura::sensore_temperatura(int, int, codici_gestione_sistema, bool)':
sensore_temperatura.cpp:14:115: error: no matching function for call to 'DHT::DHT()'
 sensore_temperatura::sensore_temperatura(int S_TMAC, int RL_VEN, codici_gestione_sistema C_G_S, bool sensoreDallas) {
                                                                                                                   ^
In file included from C:\Users\fabs\AppData\Local\Temp\arduino_build_955354\sketch\sensore_temperatura.h:23:0,
                 from C:\Users\fabs\AppData\Local\Temp\arduino_build_955354\sketch\sensore_temperatura.cpp:12:
C:\Users\fabs\Documents\Arduino\libraries\DHT_sensor_library/DHT.h:65:3: note: candidate: DHT::DHT(uint8_t, uint8_t, uint8_t)
   DHT(uint8_t pin, uint8_t type, uint8_t count = 6);
   ^~~
C:\Users\fabs\Documents\Arduino\libraries\DHT_sensor_library/DHT.h:65:3: note:   candidate expects 3 arguments, 0 provided
C:\Users\fabs\Documents\Arduino\libraries\DHT_sensor_library/DHT.h:63:7: note: candidate: constexpr DHT::DHT(const DHT&)
 class DHT {
       ^~~
C:\Users\fabs\Documents\Arduino\libraries\DHT_sensor_library/DHT.h:63:7: note:   candidate expects 1 argument, 0 provided
C:\Users\fabs\Documents\Arduino\libraries\DHT_sensor_library/DHT.h:63:7: note: candidate: constexpr DHT::DHT(DHT&&)
C:\Users\fabs\Documents\Arduino\libraries\DHT_sensor_library/DHT.h:63:7: note:   candidate expects 1 argument, 0 provided
exit status 1

ovviamente se creo l’oggetto sensore all’interno del metodo get Temperatura():

DHT sensTemp(_S_TMAC,DHT22);

		temperatura = sensTemp.readTemperature();

tutto funziona correttamente.

Vorrei però evitare che ogni volta che viene chiamato il metodo mi venga creato un nuovo oggetto, anche perchè non so in termini di consumo di risorse cosa implichi questo, considerando che questo sistema deve stare attivo h24 7 giorni su 7 !

prova a postare il codice completo

File sensore_temperatura.cpp

#include "sensore_temperatura.h"

sensore_temperatura::sensore_temperatura(int S_TMAC, int RL_VEN, codici_gestione_sistema C_G_S, bool sensoreDallas) {

	//Salvo la variavile sensoreDallas, che mi occorre per sapere se il sensore che sto leggendo e' un sensore
	//Dallas oppure un DHT22
	_sensoreDallas = sensoreDallas;

	//Salvo le variabili passate
	_S_TMAC = S_TMAC;
	_RL_VEN = RL_VEN;
	_C_G_S = C_G_S;

	//Ora controllo se il sensore che sto creando sia un sensore Dallas
	if (sensoreDallas) {

		//Imposto i due pinMode dei due parametri passati durante la creazione dell'instanza
		//pinMode(S_TMAC, INPUT);
		//pinMode(RL_VEN, OUTPUT);

		//Inizializzo il sensore Dallas
		//Per prima cosa imposto la connessione OneWire
		OneWire oneWire(_S_TMAC); 
		//Ora dichiaro l'oggetto sensore Dallas
		//DallasTemperature sensore(&oneWire);

		//Salvo le due variabili del sensore
		_oneWire = oneWire;
		//_sensore = sensore;

		//Avvio il sensore in lettura
		//_sensore.begin();

	}
	//Se non e' un sensore Dallas allora si tratta di un sensore DHT22
	else {

		//Imposto i due pinMode dei due parametri passati durante la creazione dell'instanza
		//pinMode(S_TMAC, INPUT);
		//pinMode(RL_VEN, OUTPUT);

		//Salvo nelle variabili locali le due variabili passate
		_S_TMAC = S_TMAC;
		_RL_VEN = RL_VEN;
		_C_G_S = C_G_S;

		//Inizializzo il sensore DHT22
		//SimpleDHT22 sensTemp(S_TMAC);
		//DHT sensTemp(S_TMAC, DHT22);

		//Creo un'istanza del sensore
		//_sensTemp = sensTemp;

	}

}

//Funzione che restituisce un float contentente la temperatura
float sensore_temperatura::GetTemperatura() {

	//Creo la variabile float relativa alla temperatura
	float temperatura = 0 ;

	//Per prima cosa controllo quale sensore sto utilizzando

	//Primo caso : Sensore Dallas
	if (_sensoreDallas) {

		//OneWire oneWire(_S_TMAC); 
		//Ora dichiaro l'oggetto sensore Dallas
		DallasTemperature sensore(&_oneWire);

		//_sensore.begin();

		//Attivo la richiesta della temperatura
		//_sensore.requestTemperatures();
		sensore.requestTemperatures();

  		//Memorizzo la temperatura letta in gradi Celsius
  		//temperatura = _sensore.getTempCByIndex(0);
		temperatura = sensore.getTempCByIndex(0);

	}

	//Secondo caso : Sensore DHT
	else {

		/*SimpleDHT22 sensTemp(_S_TMAC);

		Serial.print("pin DHT : ");
		Serial.println(_S_TMAC);

		//Creo la variabile temporanea relativa all'umidita'
		float umidita = 0 ;

		//Creo la variabile intera relativa a simpleDHTErrSuccess
		int err = SimpleDHTErrSuccess;

		if ((err = sensTemp.read2(&temperatura, &umidita, NULL)) != SimpleDHTErrSuccess){
				
			temperatura = 999;

		}

		//Aggiungo un piccolo delay di sincronizzazione
    	delay(50);*/

		//Creo la variabile umita di tipo float che conterra'
		//il valore dell' umidita' letta dal sensore
		//float umidita = 0 ;

		DHT sensTemp(_S_TMAC,DHT22);

		temperatura = sensTemp.readTemperature();

	}

	//Controllo che non ci siano valori nulli della temperatura, in caso di valore nullo ritorno 999
	if (!isnan(temperatura) && temperatura!=999) return temperatura;
	else return 999;
	
}

//Funzione che restituisce un float contentente l'umidita'
float sensore_temperatura::GetUmidita() {

	/*SimpleDHT22 sensTemp(_S_TMAC);

	//Serial.print("pin DHT : ");
	//Serial.println(_S_TMAC);

	//Creo la variabile umita di tipo float che conterra'
	//il valore dell' umidita' letta dal sensore
    float umidita = 0 ;
	float temperatura = 0 ;

	//Creo la variabile intera relativa a simpleDHTErrSuccess
	int err = SimpleDHTErrSuccess;

	if ((err = sensTemp.read2(&temperatura, &umidita, NULL)) != SimpleDHTErrSuccess){
	//if ((err = _sensTemp.read2(&temperatura, &umidita, NULL)) != SimpleDHTErrSuccess){

		umidita = 999;
	}

	//Aggiungo un piccolo delay di sincronizzazione
    delay(50);*/

	//Creo la variabile umita di tipo float che conterra'
	//il valore dell' umidita' letta dal sensore
    float umidita = 0 ;
	//float temperatura = 0 ;

	DHT sensTemp(_S_TMAC,DHT22);

	umidita = sensTemp.readHumidity();

	//Controllo che non ci siano valori nulli della umidita', in caso di valore nullo ritorno 999
	if (!isnan(umidita) && umidita != 999) return umidita;
	else return 999;

}

file sensore_temperatura.h

#ifndef sensore_temperatura_h
#define sensore_temperatura_h

//Librerie di sistema
#include <Arduino.h>
#include "codici_gestione_sistema.h"
#include "pinout.h"

//Includo il file per la gestione del sensore di temperatura DHT
#include <SimpleDHT.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

// librerie per il funzionamento del sensore DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>

class sensore_temperatura
{

	public:

		//sensore_temperatura(int S_TMAC, int RL_VEN, codici_gestione_sistema C_G_S);
		sensore_temperatura(int, int, codici_gestione_sistema, bool);
		//sensore_temperatura(int, int, codici_gestione_sistema);

		float GetTemperatura();
		float GetUmidita();
		void AttivaVentilatore();
		void DisattivaVentilatore();
		int GetStatoVentilatore();

	private:

		bool _sensoreDallas;
		int _S_TMAC;
		int _RL_VEN;
        //SimpleDHT22 _sensTemp;
		//DHT _sensTemp;
		DallasTemperature _sensore;
		OneWire _oneWire;
		codici_gestione_sistema _C_G_S;

};


#endif

Il codice non funzionante è commentato… ma si dovrebbe intuire.

Sei poi riuscito a risolvere?
A me non è venuto in mente niente di sensato da suggerire…

Ho risolto ? Diciamo che funziona ! :sweat_smile:

Creo un nuovo oggetto sensore ogni volta che viene richiamato il metodo. Non è il massimo ma purtroppo è l’unica soluzione che funziona.

Se qualcuno riuscisse a trovare una soluzione differente ne sarei molto grato!!