Presentazione + Problema Sonda Temperatura/Umidita' DHT11

Salve gente. :slight_smile: :slight_smile: :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue: 8)
Mi presento...

mi chiamo Carmine, ho 32 anni e scrivo dalla prov. di Latina, ing. nucleare.
Vi seguo da qualche settimana ed ho deciso di iscrivermi e scrivervi in modo da conoscerci e magari aiutarmi :S

Appassionato di elettronica anche se, ho preso una strada "parallela", ho da poco comperato un arduino ed ho gia' realizzato alcuni progetti. Mano mano che li costruivo ono andato avanti nel mettere display sensori ecc ecc.
Praticamente ho realizzato tramite Arduino, la lettura di temperatura e umidita' con il sensore DHT11 e display a cristalli liquidi.
Fino a qui tutto bene... Lo step successivo era quello di inserire, o meglio, utilizzare questo progeto, trasformandolo in un termostato.
Il fatto e' che non riesco a far scattare il Rele' che ho collegato sull' uscita 8 dell' arduino...
Se posto il codice ci possiamo dare un occhiata insieme? Magari sbaglio qualche cosa e dato che sono gia' 3 gg che ci sto su non ne riesco a venire fuori...

che ne dite? posso postare qui il codice?

Grazieeeeeee :stuck_out_tongue:

Posta il codice. La mia sfera di cristallo non ho disponibile in questo momento. :wink:
Ciao Uwe

certo, scrivi pure:)

Eccomi ragazzi... allora... di seguito vi posto il codice che legge la temperatura e pressione e lo visualizza sul display, che ho gia' opportunamente montato e provato e funziona benissimo:

//Esempio TEST per sensore Uminidtà-Temperatura DHT11 + Display
//Librerie Importate
#include <LiquidCrystal.h>
#include <dht11.h>

//Sensore Temperatura-Umidità collegato al pin 7 Digital
#define DHT11PIN 7

//Dichiarazione Variabili
dht11 DHT11;

//Display Collegato alle rispettive uscite di Arduino
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Impostazione per la comunicazione sul Serial Monitor
void setup()
{
Serial.begin(9600);
Serial.println();

//impostiamo il numero di colonne ed il numero di righe sull' lcd
lcd.begin(16, 2);
}
//Impostazioni su Monitor Seriale e indetificazione errori
void loop()
{
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case 0: Serial.println("OK"); break;
case -1: Serial.println("Checksum error"); break;
case -2: Serial.println("Time out error"); break;
default: Serial.println("Unknown error"); break;
}
//Stampa i valori di H sul Serial Monitor
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 7);

//Stampa i valori di T sul Serial Monitor
Serial.print("Temperature (oC): ");
Serial.println((float)DHT11.temperature, 7);

// Visualizzo il valore dell' Umidità sul display e setta il cursore alla colonna 0, su riga 0
lcd.print("Umidita' :");
lcd.print((float)DHT11.humidity, 7);
lcd.setCursor(0, 1);
delay(500);
// Visualizzo il valore della temperatura sul display e setta il cursore alla colonna 0, su riga 1
lcd.print("Temperatura:");
lcd.print((float)DHT11.temperature, 7);
lcd.setCursor(0, 0);
delay(1000);
}

Questo invece e' il codice, che utilizza un sensore DS1820 della Dallas e impostata una soglia di controllo del termostato direttamente
nel programma, fa scattare un rele' appena la T scente a 18 °C. Ovviamente anche questo funziona:

#include <OneWire.h>
#include <DallasTemperature.h>

// Bus 1-wire - sensore Dallas Ds18B20 su pin D2
#define ONE_WIRE_BUS 2 // Dallas su D2
#define CALDAIA 4 // caldaia su D4

#define TMIN 18 // soglia intervento termostato
#define ISTERESI 2 // isteresi

#define ON 1
#define OFF 0

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWireBus(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWireBus);

int Temperatura; // contiene la temperatura letta dal sensore

void setup() {
// codice eseguito all'avvio o per reset:
pinMode(CALDAIA, OUTPUT); // D4 è linea di uscita
// inizializzo il sensore DS1820
sensors.begin();
// Inizializzo Seriale - Serial Monitor
Serial.begin(9600);
}

void loop() {

sensors.requestTemperatures(); // invia il comando leggi temperatura
Temperatura= sensors.getTempCByIndex(0); //estrai la temperature letta
// Scrivo la temperatura sul serial monitor
Serial.print("Valore di temperatura ");
Serial.print(Temperatura);
Serial.println(" °C");

if (Temperatura < TMIN) // freddo - attivare la caldaia
digitalWrite(CALDAIA, ON);
if (Temperatura >= TMIN+ISTERESI) // caldo - spegnere la caldaia
digitalWrite(CALDAIA, OFF);

}

Questo altro sketch invece, e' l'unione, se cosi si puo' dire, dei due programmi, ovviamente modificati. Praticamente, il rele' non scatta, o meglio, scatta al reset e rimane attivo sempre. Poi si disarma (ma non capisco perche') quando schiaccio il tasto del serial monitor e poi si riarma nuovamente per restare attivo:

//Esempio TEST per sensore Uminidtà-Temperatura DHT11 + Display + Termostato

#include <LiquidCrystal.h> //Libreria Display
#include <dht11.h> //Librerie Sensore Temperatura/Umidità

#define DHT11PIN 7 //Sensore Temperatura-Umidità collegato al pin 7 Digital
#define CALDAIA 8 //Utilizzatore (caladaia) collegato/a al pin 8 (Rele')
#define TMIN 18 //soglia intervento termostato + Isteresi
#define ISTERESI 2 //soglia intervento termostato + Isteresi

#define HIGHT 1
#define LOW 0

dht11 DHT11; //Dichiarazione Variabili

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Display Collegato alle rispettive uscite di Arduino

void setup() //Impostazione per la comunicazione sul Serial Monitor
{
Serial.begin(9600);
pinMode(8, OUTPUT); // codice eseguito all'avvio o per reset
lcd.begin(16, 2); //impostiamo il numero di colonne ed il numero di righe sull' lcd
}
void loop()
{
Serial.println("\n");
DHT11.read(DHT11PIN);
{
}
//Stampa i valori di H sul Serial Monitor
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 7);

//Stampa i valori di T sul Serial Monitor
Serial.print("Temperature (oC): ");
Serial.println((float)DHT11.temperature, 7);

// Visualizzo il valore dell' Umidità sul display e setta il cursore alla colonna 0, su riga 0
lcd.print("Umidita' :");
lcd.print((float)DHT11.humidity, 7);
lcd.setCursor(0, 1);
delay(500);

// Visualizzo il valore della temperatura sul display e setta il cursore alla colonna 0, su riga 1
lcd.print("Temperatura:");
lcd.print((float)DHT11.temperature, 7);
lcd.setCursor(0, 0);
delay(500);

if ((DHT11.read(DHT11PIN) < TMIN)) // freddo - attivare la caldaia
digitalWrite(8, HIGHT);
if ((DHT11.read(DHT11PIN)) >= TMIN+ISTERESI) // caldo - spegnere la caldaia
digitalWrite(8, LOW);
}

Non bacchettatemi vi prego!!! :stuck_out_tongue: il discorso e' che nel codice del DS1820, c'e' "int temperatura" dove viene letta la temperatura del sensore, che poi tramite il ciclo if la richiamo per far "girare la condizione... non riesco a capire come si faccia con il sensore DHT11...
Che ne pensate voi? Si puo fare qualcosa?

Anticipatamente ringrazio...

Saluti,
Car :wink:

ti consiglio di non usare la lettura diretta del dht11 perchè è lento e potrebbe non essere pronto quando viene interrogato restituendo valori Hpocchia :slight_smile: e vedo che nello sketch richiami la lettura più volte
Leggi i valori all'inizio dello sketch e salvali in una variabile, e tenta di confrotare valori dello stesso tipo , qui vedo che confronti float e int.

grazie per la info...

i termini di codice come si traduce cio' che ha detto? :S

grazieeeee