relay+dht11 HELP!!

Ciao a tutti questa é la prima volta per me in questo forum anche se vi seguo da molto.
Ho un problema di programmazione molto semplice per voi ma difficile per me :cry: !
so gia come leggere la temperatura e l'umiditá ed ho gia usato un istruzione di tipo "if" per far si che appena supera una temperatura si disecciti un relay, il problema é che appena raggiunge la temperatura prestabilita stacca il relay e poi dopo 3/4 secondi lo riattacca per poi ristaccarlo perche la temperatura barcolla tra es. 27-28.

Come faccio a far arrivare la temp ad esempio a 27° poi fino a che non scende sotto 25° rimane diseccitato per poi rieccitarlo fino al raggiungimento dei 27°??
Grazie mille ragazzi!

Prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI (spiegando quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi ... devi implementare quello che normalmente si chiama un "ciclo di isteresi".

In pratica NON dovrai avere più un singolo if, ma dovrai averne uno per cui se superato un certo valore (es. 27.5°) si fa una cosa (es. si stacca il relay) ed uno per cui se scendi sotto un certo valore (25.5°) se ne fa un'altra (es. attacchi il relay).

In questo modo eviti che il relay attacchi e stacchi in continuazione a causa di piccole oscillazioni di temperatura.

Guglielmo

Quindi non devo piu usare ELSE ma due IF? Provo
grazie mille

Ne sto uscendo pazzo!!! Mi sapete spiegare come mai il < e > me li considera al contrario?

Veniamo a casa tua x vedere lo sketch che hai scritto ? Oppure usiamo la lampada di vetro ?
Leggiti il regolamento. Soprattutto sezione 11 e 7

Come già detto da Guglielmo:
ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Ciao come ti ha detto Guglielmo devi prevedere un Delta ( Isteresi), avevo anche io il tuo stesso problema e ho risolto in questo modo:

 // Comando Relè
  if(sensors.getTempCByIndex(0) < TempImp-z  )  // Imposta Attivazione Relè Sensore
  {
  digitalWrite(outPin1, LOW); // accendo il Relè
  
   
         
   }
    
  if(sensors.getTempCByIndex(0) > TempImp+y )  //Imposta Disttivazione Relè Sensore
  {
  digitalWrite(outPin1, HIGH); // spengo il Relè Sensore
  
  
  
  
    
   }

Come vedi io ho specificato 2 “Delta” differenti, uno superiore ed uno inferiore.

Naturalmente li ho prima dichiarati qui:

float TempImp=(21.0); // Valore cambio di stato del Relè 
float y=(1.0);        // Delta Superiore
float z=(0.5);        // Delta Inferiore

In questo modo se imposti la temperatura a 21°
il relè è ON fino a 22°
poi stacca e riattacca quando scendi sotto 20,5°

Questo è il mio sketch, purtroppo anche con il consiglio di Roby0303 non funziona.

1- non riesco a capire come mai negli i simboli maggiore e minore li devo scrivere al contrario (< >), ( ad esempio se scrivo: if(5>4){…} non mi va in funzione l’if, ma se lo scrivo cosi: if(5<4){…} in questo modo funziona);

2- io per prelevare i dati del sensore ho preso uno sketch di esempio della libreria DHT11 (mi ha fatto penare per farla funzionare) ed ho tolto le cose superflue e l’ho modificata per visualizzare i dati su di un display. Se mi dite come fare per prendere i dati dal sensore che proprio non lo capisco…

3- il display (di tipo lcd hd44780 16x2) delle volte fa cilecca e perde le scritte, oppure compaiono strani simboli (anche se le funzioni dell’arduino continuano a funzionare), questo mi succede ad esempio quanto (non sempre) il relay che comanda un carico di circa 50w in 220v cambia stato e produce un sbalzo di corrente, se esiste un modo per risolvere o evitare che accada (agiungere qualche filtro o che ne so).

Utilizzo un arduino UNO, ma ho gia in ordine un bel Arduino Mega che dovrebbe arrivarmi lunedi 09.
Lo utilizzo per regolare la temperatura e l’umidità di un terrario per serpenti, con un umidificatore (relay2) ad ultrasuoni, una ventola (relay3) per pc ed una lampada riscaldante (relay1) per la temperatura

#include <avr/io.h>
#include <avr/wdt.h>

#define Reset_AVR() wdt_enable(WDTO_8S); while(1) {} 

#include <LiquidCrystal.h>

#include <DHT11.h>
int pinsensore=6;
DHT11 dht11(pinsensore); 
LiquidCrystal lcd(8, 7, 5, 4, 3, 2);
const int relay1 = 9;
const int relay2 = 10;
const int relay3 = 11;
const int relay4 = 12;

float tempSET=(27,0);
float z=(1.0);
float y=(1.0);

int umidMAX = 65;
int umidMIN = 60;

void setup()
{
  lcd.begin(16, 2);
  Serial.begin(9600);
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Umidita'  %");

  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
}

void loop()
{
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))==0)
  {
    lcd.setCursor(12,0);
    lcd.print(temp);
    lcd.setCursor(12,1);
    lcd.print(humi);
  }
  else
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Errore N:");
    lcd.setCursor(13,0);
    lcd.print(err);
    delay(5000);
    Reset_AVR();

  }




  if(temp > tempSET+y )  //Imposta Disattivazione Relè Sensore
  {
    digitalWrite(relay1, LOW); // spengo il Relè Sensore
  }


  if(temp < tempSET-z  )  // Imposta Attivazione Relè Sensore
  {
    digitalWrite(relay1, HIGH); // accendo il Relè       
  }




  if(humi>umidMIN){
    digitalWrite(relay2,HIGH);
  }
  else{
    digitalWrite(relay2,LOW);
  }

  if(humi<umidMAX){
    digitalWrite(relay3,HIGH);
  }
  else{
    digitalWrite(relay3,LOW);
  }

  delay(3000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Umidita'  %");
}

frattomatti:
1- non riesco a capire come mai negli i simboli maggiore e minore li devo scrivere al contrario (< >), ( ad esempio se scrivo: if(5>4){…} non mi va in funzione l’if, ma se lo scrivo cosi: if(5<4){…} in questo modo funziona);

… ricontrolla bene perché è semplicemente … IMPOSSIBILE :smiling_imp:


if (a > b) {
… viene qui se a e maggiore di b …
}
else {
… viene qui se a è minore o uguale a b …
}

… e su questo NON ci sono dubbi, quindi … ricontrolla quello che stai facendo, metti delle Serial.print() per verificare i valori prima del IF, ecc. ecc.

Guglielmo

*P.S. : Lo scopo di sostituire la UNO con la MEGA ? ? ? * :o Da quello che descrivi leggi e comandi … ben poche cose … :roll_eyes:

Giuro ho controllato mille volte e se non inserisco i simboli al contrario non mi funziona.
Questo ciclo di isteresi proprio non riesco a farlo!!! o mi rimane accesa fino a che non fonde oppure mi si accende e spegne in continuazione a cavallo di un valore di SET che gli ho dato.
La Mega la prendo perche voglio aggiungere altre cose come un rtc ed ho gia le porte piene.

veramente sto diventanto scemo, avro caricato 100 prove di sketch cercato in tutto internet....

Magari dico una stupidaggine, ma non è che sono i tuoi rele che funzionano a logica inversa (low si attivano) e quindi ti fanno ragionare male ?

nid69ita:
Magari dico una stupidaggine, ma non è che sono i tuoi rele che funzionano a logica inversa (low si attivano) e quindi ti fanno ragionare male ?

Non dici assolutamente una stupidaggine, se usi il relè pilotandolo direttamente
allora è logico che per attivarlo devi mettere l'uscita "HIGH" ma se usi gli shield
come questo ( e come ho usato io)

quasi sicuramente funzionano a "logica inversa".

io uso una scheda da 4 relay comprata su ebay, solo che credo di aver fuso la scheda arduino perche ora non riesce piu ad attivarmi i relay… avrei dovuto metterci un npn…

sapreste dirmi che npn dovrei metterci? e le resistenze da utilizzare?

Poi ancora non riesco a creare un ciclo di isteresi!! non mi porta proprio!!! hahaha
grazie mille

Non hai messo la foto dei relè e qundi non sappiamo quale tipo possano essere,
ma se hai preso un modulo a 4 relè probabilmente hanno 6 pin ( 2 per l' alimentazione e 4 per l'attivazione).
Per capire se i rele sono guasti e in quale logica funzionano è sufficente che attacchi l'alimentazione
( + e - ) e poi vedi se si attivano collegando gli altri 4 pin al positivo o al negativo.

Se "clikkano" quando metti il pin a massa allora sono il "logica inversa".

Puoi testare invece l'arduino facendo girare uno sketch compreso nell'IDE,
il più semplice come il "Blink"

Faro i suddetti test, la scheda relay é una da 4 relay pilotati a 5v si con i 6pin. Grazie a presto

Ciao, ho riguardato il tuo sketch e ho travato alcune cose che non tornano,
forse la più lampante è l’impostazione della temperatura in cui hai separato il decimale con la virgola invece che con il punto.

float tempSET=(27,0);

Ho modificato alcune cose e a me pare che adesso vada abbastanza bene.
Ti allego lo sketch che ho modificato, confrontalo con il tuo in modo che vedi i cambiamenti.

Ricorda che devi cambiare i settaggi dell’ LCD perchè io ho uno “I2C”

P.S.
Se usi questo tipo di LCD ti servono solo 2 Ingressi Analogici, risparmi quindi 6 pin
Digitali e non hai bisogno dell’arduino Mega .

#include <DHT.h>

#define DHTPIN 6   // Pin "DATA" Sensore
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);

#include <Wire.h>  // Libreria di sistema - E' richiesta da I2CIO.cpp
#include <LiquidCrystal_I2C.h> // Libreria LCD I2C
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);//Inizializzo LCD


const int relay1 = 9;
const int relay2 = 10;
const int relay3 = 11;
const int relay4 = 12;

float tempSET=(40.0);
float y=(10.0);    // Delta Superiore    
float z=(5.0);    // Delta Inferiore    

int umidMIN = 60;
int umidMAX = 70;


void setup()
{
  lcd.begin(16, 2);
  Serial.begin(9600);
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Umidita'  %");
    
     dht.begin();
   
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
}

void loop()
{
  int err;
  
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  



  if(dht.readTemperature() < tempSET-z )  //Imposta Disattivazione Relè Sensore
  {
    digitalWrite(relay1, LOW); // Accendo il Relè Temperatura
  }


  if(dht.readTemperature() > tempSET+y  )  // Imposta Attivazione Relè Sensore
  {
    digitalWrite(relay1, HIGH); // Spengo il Relè Temperatura      
  }




  if(h > umidMIN){
    digitalWrite(relay2,HIGH);  // Spengo Relè 2
  }
  else{
    digitalWrite(relay2,LOW);  // Accendo relè 2
  }

  if(h < umidMAX){
    digitalWrite(relay3,HIGH);  //Spengo Relè 3
  }
  else{
    digitalWrite(relay3,LOW);   // Accendo relè 3
  }

  delay(3000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temperatura");
  lcd.print(t);
  lcd.setCursor(0,1);
  lcd.print("Umidita'  %");
  lcd.print(h);
}

Ciao.

Roby0303:
Ciao, ho riguardato il tuo sketch e ho travato alcune cose che non tornano,
forse la più lampante è l'impostazione della temperatura in cui hai separato il decimale con la virgola invece che con il punto.

float tempSET=(27,0);

Non l'avevo notato. Ma inoltre a che caspita servono quelle inutili parentesi tonde ?

Comè giusto che sia la saggezza vince sempre!
Avevo programmato tutto in logica Diretta, ma i relè vanno a logica inversa, perciò non mi funzionava come doveva e dovevo ricorrere al segno del < > inversi…
ora ho sistemato e funziona tutto benissimo!!
Veramente Grazie mille a tutti!!