Problema con DHT22

Salve, sto programmando una centralina per irrigazione e stazione meteo IoT con diversi sensori. Per ogni sensore ho dedicato una tab sull'IDE con uno o più void dedicate alla lettura del sensore, al test e alla diagnostica.
Per qualche motivo i void dedicati al DHT22 Adafruit non mi permettono di compilare il codice (che non è ancora ultimato ndr) perchè il void richiamato nel programma principale da l'errore seguente "DTHRead (nome del void) not declared for this scope".

Questo è il codice incluso nel file principale nel void setup():

//test sensore DHT22
 Serial.println(F("DHT22 test")); //scrivi testo "DHT22 test!"
  dht.begin();
  DHT22Read; //effettua una lettura del sensore tramite il void DHT22Read
  DHT22Test; //utilizza la misura appena effettuata per verificare la presenza di errori (void incluso nel file DHT22.ino)

il void DHT22Read lo si ritrova nel void loop() per effettuare la misura.
Quest'ultimo consiste in un banale codice basato sulle librerie di Adafruit per leggere temperatura e umidità, lo incollo nel caso fosse d'aiuto:

void DHT22Read() {
  
  if(DHTerrorState == 0) { //se il sensore non è stato escluso
    
    h = dht.readHumidity();  // lettura dell'umidità
    t = dht.readTemperature(); // lettura della temperatura
  
    // controlla se le letture sono fallite
    if (isnan(h) || isnan(t)) {
      
      Serial.println(F("Lettura del sensore DHT22 fallita"));
    
      //interrompi il funzionamento del sensore dopo un determinato numero di errori
      DHTerror ++; //incrementa il contatore degli errori
      
      if (DHTerror > 3) { //se vengono contati più di tre errori
      
        Serial.println("DHT22 guasto");
        
        DHTerrorState = 1; //incrementa la variabile di stato per escludere il sensore in caso di guasto
      }
    }
    else {
      DHTerror = 0; //azzera il contatore di errori a seguito di una misura corretta
    }
    
    hic = dht.computeHeatIndex(t, h, false); // Calcolo temperatura percepita
    
    if (t < -25 || t > 50) { //se la temperatura letta è minore di -25 gradi o maggiore di 50 esegui
      Serial.println("DHT22: lettura errata della temperatura.");
    }
  }
}

Secondo voi qual è il problema?

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

1 Like

A quanto detto da UKHeliBob aggiungo ...

... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (... e, per evitare future possibili discussioni/incomprensioni, prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Meglio se alleghi tutti i file zippati.
Comunque potrebbe essere che hai dimenticato le parentesi dopo il nome della funzione DHT22Read.

Nella funzione setup() devi scrivere:

DHT22Read(); // questa è una chiamata a funzione valida

Ciao.

Più semplicemente, puoi incollare il contenuto di ogni scheda sotto il contenuto della prima e pubblicare, poi, tutto insieme. Anch'io divido il programma in schede e quando devo pubblicarlo (se non è tropppo voluminoso) faccio così.

Centralina_irrigazione.zip (24,2 KB)

Questo è il file zip, ho provato sia con Arduino Cloud che con l'IDE in locale e dà solamente errore sui void riguardanti il sensore DHT... ho aggiunto le parentesi come mi hai consigliato ma non è cambiato nulla. :pensive:

Ci ho messo un mese per capire.
Ti sei dimenticato di chiudere un commento nel file "Algoritmo_irrigazione.ino".

// main.ino

void setup() {

}

void loop() {

}

/* commento non chiuso

Tutti i rimanenti file .ino vengono accodati dopo il commento non chiuso e li vede come commenti e quindi non vede la definizione di quelle funzioni.

Nota: fammi la cortesia non chiamarle void, si chiamano "funzioni". :innocent:

Ciao.

Grazie mille! Ora funziona, non sapevo che lasciando un commento aperto succedesse questo, ho passato circa 5/6 ore a fare prove su prove senza capire perché non funzionasse. Grazie ancora

Neanche io lo sapevo. O meglio dovrebbe dare degli errori specifici e invece da quell'errore perché casualmente quelle due funzioni nel file DHT22.ino vengono accodate dopo il file contenente il commento non chiuso. Mentre per gli altri file .ino evidentemente sono accodati dopo il file .ino principale cioè quello che contiene il loop().

Comunque ci sono arrivato anche grazie ai messaggi che il compilatore sputa fuori, prima dell'errore evidente. Quindi consiglio sempre di leggere tutti i messaggi evidenziati.

Ciao.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.