costante nello sketch dht11(codice per un termostato)?[RISOLTO]

ciao a tutti. come da tradizione niubbia posto una domanda che ai + sarà trita e ritrita…ma la curiosità si impossessa di tutti coloro i quali si avvicinano ad arduino…
detto ciò, prendendo ad esempio lo sketch degli esempi arduino prendo i valori temperatura ed umidità da un sensore DHT11 ma vorrei che raggiunta una certa temperatura si accendesse un led(pin 8) che testato da solo con il blinking funziona ma non ne vuole sapere di lampeggiare quando la temperatura arriva ad un valore prestabilito…credo che sia un errore di valutazione della costante…sapreste dirmi se è quello che penso?
posto il codice.grazie e buone feste a tutti :slight_smile:

#include <dht.h>

dht DHT;

#define DHT11_PIN 5
const int ledPin = 8;
void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
pinMode(ledPin, OUTPUT);}

void loop()
{
  // READ DATA
  Serial.print("DHT11, \t");
  int chk = DHT.read11(DHT11_PIN);
  
switch (chk)
  {
    case DHTLIB_OK:  
                Serial.print("OK,\t"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
 if ( chk >= 1)
{digitalWrite(ledPin,HIGH);}
else
{digitalWrite(ledPin,LOW);} }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(2000);
}
//
// END OF FILE
//

Non vedo codici di lampeggio, nel tuo sketch. Solo un pin messo HIGH o LOW

ciao leo, grazie per la celere risposta. come detto nel primo post credevo che bastasse questo

 if ( chk >= 1)
{digitalWrite(ledPin,HIGH);}
else
{digitalWrite(ledPin,LOW);} }

per fare arrivare l'mpulso al led su pin 8 evidentemente sono in errore.... :-X

Non solo non c'e' un lampeggio, ma mi pare pure che NON verifichi nessun livello di temperatura. Tu accendi/spegni testando chk che pare solo essere un valore di controllo se lettura ok o ci sono problemi. Quindi if ( chk>=1) che senso ha ?

Questa int chk = DHT.read11(DHT11_PIN); se non ricordo male fa la lettura ma devi usare altra istruzione per sapere qual'è il valore temperatura (DHT.temperature) e usare quello come test per accendere/spegnere il led. Per ora accendilo oltre il limite senza lampeggio.

if( DHT.temperature>20.0)  // check superati i 20 gradi
  digitalWrite(ledPin,HIGH);
else
  digitalWrite(ledPin,LOW);

ciao, la temperatura e l'umidità vengono rilevate dal sensore e "stampate" su monitor di sistema. io vorrei capire qual'è la variabile da dare in pasto al "loop" if else...ovvero quale sarebbe la variabile che arduino mi "stampa" su monitor di sistema come temperatura in °C?

DHT.temperature http://forum.arduino.cc/index.php?topic=287076.msg2010439#msg2010439

ciao, nel frattempo avevo provato anche questa"if( DHT.temperature>20)"..ma il led...è sempre spento... cmq..ragazzi so che è una cosa facile...mi studio meglio il codice e cerco di capire dove sta l'intoppo....

Prima del test if, fatti stampare il valore della temperatura:

Serial.print(DHT.temperature);
Serial.println(" gradi");

La temperatura potrebbe essere in farenaith invece che in gradi. Non ricordo.

ciao temperatura ed umidità vengono lette correttamente in °C e %

Posta lo sketch che hai adesso dopo le tue modifiche.

posto il codice

#include <dht.h>

dht DHT;

#define DHT11_PIN 5
const int ledPin = 8;
void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
pinMode(ledPin, OUTPUT);}

void loop()
{
  // READ DATA
  Serial.print("DHT11, \t");
  int chk = DHT.read11(DHT11_PIN);
  
switch (chk)
  {
    case DHTLIB_OK:  
                Serial.print("OK,\t"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
 if ( DHT.temperature > = 1)
{digitalWrite(ledPin,HIGH);}
else
{digitalWrite(ledPin,LOW);} }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(2000);
}
//
// END OF FILE
//

Hai le graffe di chiusura messe i posto errato. Usa ctrl+t nell' IDE

editato ma nulla è cambiato

#include <dht.h>

dht DHT;

#define DHT11_PIN 5
const int ledPin = 8;
void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  // READ DATA
  Serial.print("DHT11, \t");
  int chk = DHT.read11(DHT11_PIN);

  switch (chk)
  {
  case DHTLIB_OK:  
    Serial.print("OK,\t"); 
    break;
  case DHTLIB_ERROR_CHECKSUM: 
    Serial.print("Checksum error,\t"); 
    break;
  case DHTLIB_ERROR_TIMEOUT: 
    Serial.print("Time out error,\t"); 
    break;
  default: 
    Serial.print("Unknown error,\t"); 
    break;
    if ( DHT.temperature >= 1)
    {
      digitalWrite(ledPin,HIGH);
    }
    else
    {
      digitalWrite(ledPin,LOW);
    } 
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(2000);
}
//
// END OF FILE
//

Certo che è cambiato !!! :grin:

adesso che è indentato bene, non vedi che tutta la parte del test della temperatura è DENTRO lo switch ed inoltre solo se c'e' un errore Unknown ? (e poi comunque il break non lo farebbe eseguire)

risolto, è bastato (come suggerito da nid) spostare la condizione if/else fuori dallo switch.

#include <dht.h>

dht DHT;

#define DHT11_PIN 5
const int ledPin = 8;
void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  // READ DATA
  Serial.print("DHT11, \t");
  int chk = DHT.read11(DHT11_PIN);

  switch (chk)
  {
  case DHTLIB_OK:  
    Serial.print("OK,\t"); 
    break;
  case DHTLIB_ERROR_CHECKSUM: 
    Serial.print("Checksum error,\t"); 
    break;
  case DHTLIB_ERROR_TIMEOUT: 
    Serial.print("Time out error,\t"); 
    break;
  default: 
    Serial.print("Unknown error,\t"); 
    break;
    
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(2000);
if ( DHT.temperature >= 22)
    {
      digitalWrite(ledPin,HIGH);
    }
    else
    {
      digitalWrite(ledPin,LOW);
    } }
//
// END OF FILE
//

se qualcuno volesse approntare un termostato fai da te ecco fatto:)
grazie a tutti