controllo ventole,, qualche problema

ciao a tutti!
sto realizzando , o meglio modificando, uno scketch che ho gia testato e sto utilizzando con piacere.
in pratica si tratta di un sensore temp e umidita che comanda una ventola tramite relay on/off.
ho un valore fisso di 80% umidita che mi fa partire le ventole e un valore delta di -5 punti (75%) che spegne le ventole.
ora l'ho modificato inserendo 4 pulsanti (collegati in pullup interna sui pin 2,3,4,5) che mi aumentano il livello massimo di umidita e il delta.
il programma gira e non sembra avere problemi...ma ho dei livelli di umidita alti. non vorrei che qualche dato sballsse il sensore...posso postare il codice?

Certo che puoi, senza è difficile capire se c'è qualcosa che non va

//PROGETTO ARDUINO TEMPERATURA VENTOLE VIGNATI LUCA
/*
I collegamenti dei pulsanti
 * Pulsante Incrementa Pin 2 di Arduino e GND
 * Pulsante Decrementa Pin 3 di Arduino e GND
 * Pulsante Incrementa Pin 4 di Arduino e GND
 * Pulsante Decrementa Pin 5 di Arduino e GND
 ( non servono le resistenze )

*/


#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include <DHT.h>
#include <DallasTemperature.h>
#include <OneWire.h> // dichiarazione di utilizzo della libreria OneWire.h
#include <RTClib.h>
#include <DallasTemperature.h> // dichiarazione di utilizzo della libreria DallasTemperature.h

#define LED_PIN 13
#define DHTPIN 8   // definisco il pin del sensore DHT-22
#define DHTTYPE DHT22 // definisco il tipo di sensore
#define ONE_WIRE_BUS 12 // assegna il valore 12 al nome ONE_WIRE_BUS

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);    // definisco a quali pin è connesso il display

DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS); // associa alla porta 2 (valore di ONE_WIRE_BUS) il canale dati dei sensori


DallasTemperature sensors(&oneWire); //trasferisce alle routine della libreria DallasTemperature
// il controllo delle funzioni OneWire




int relay = 7; // pin del sengale per il relè - attivo = high;
int set = 80;  //set a piacere dell'umidità per far accendere la ventola
int delta = 5; //quanti punti % in meno servono per spegnere la ventola rispetto al set


//----------------PULSANTI------------------------------------------------

byte pulsante_inc = 2 ; // Pulsante incrementa i gradi massimi
byte pulsante_dec = 3 ; // Pulsante decrementa i gradi massimi

byte last_stato_inc = HIGH ;
byte last_stato_dec = HIGH ;
byte stato_inc = HIGH ;
byte stato_dec = HIGH ;


byte pulsante_inc2 = 4 ; // Pulsante incrementa i gradi massimi
byte pulsante_dec2 = 5 ; // Pulsante decrementa i gradi massimi

byte last_stato_inc2 = HIGH ;
byte last_stato_dec2 = HIGH ;
byte stato_inc2 = HIGH ;
byte stato_dec2 = HIGH ;


//---------------------------------------------------------------------------- SETUP FISSO----------------------------

void setup(void) {

pinMode(pulsante_inc, INPUT_PULLUP);   //imput digitale pulsante +
pinMode(pulsante_dec, INPUT_PULLUP);   //imput digitale pulsante -

pinMode(pulsante_inc2, INPUT_PULLUP);   //imput digitale pulsante +
pinMode(pulsante_dec2, INPUT_PULLUP);   //imput digitale pulsante -

pinMode(LED_PIN, OUTPUT);  //imposta il pin come uscita PER POI SPEGNERE IL LED

pinMode (relay, OUTPUT); // pin del relè settato su output;
digitalWrite(relay, HIGH);//ad ogni reset o accensione imposta comunque le ventole spente poi contralla il tutto

//Serial.begin(9600); // inizializza la porta seriale per l'utilizzo del monitor seriale 

sensors.begin(); // inizializza i sensori
lcd.begin(20, 4); //imposta il tipo di display
Wire.begin();



//------------------ scrivo caratteri fissi su display ------------------------------

lcd.setCursor(0, 0);
lcd.print("Sump Temp.");
lcd.setCursor(0, 1);
lcd.print("Sump Umid.");
lcd.setCursor(0, 2);
lcd.print("set:");
lcd.setCursor(7, 2);
lcd.print("%");
lcd.setCursor(9, 2);
lcd.write(">");
lcd.setCursor(15, 1);
lcd.print("%");   //Simbolo umidita
lcd.setCursor(15, 0);
lcd.write("c");
lcd.write(B11011111); //Simbolo dei gradi celsius
lcd.setCursor(13, 2);
lcd.print("%");   //Simbolo umidita
lcd.setCursor(0, 3);
lcd.print("123456789");   //Simbolo umidita
}


//-----------------------------------------LOOP CONTINUO PROGRAMMA -------------------

void loop(void) {


  //--------------------------------------- FUNZIONE BOTTONI 1-------------------
  stato_inc = digitalRead(pulsante_inc); //
  if (stato_inc != last_stato_inc) {
    if (stato_inc == LOW) {
      set = set + 1; // incrementa di 1 
    }
  }
  last_stato_inc = stato_inc;

  stato_dec = digitalRead(pulsante_dec); //
  if (stato_dec != last_stato_dec) {
    if (stato_dec == LOW) {
      set = set - 1; // decrementa di 1 
      if ( set <= 1 ) {
        set = 1 ;
      }
    }
  }
  last_stato_dec = stato_dec ;



 //--------------------------------------- FUNZIONE BOTTONI 1-------------------
  stato_inc2 = digitalRead(pulsante_inc2); //
  if (stato_inc2 != last_stato_inc2) {
    if (stato_inc2 == LOW) {
      delta = delta + 1; // incrementa di 1 
    }
  }
  last_stato_inc2 = stato_inc2;

  stato_dec2 = digitalRead(pulsante_dec2); //
  if (stato_dec2 != last_stato_dec2) {
    if (stato_dec2 == LOW) {
      delta = delta - 1; // decrementa di 1 
      if ( delta <= 1 ) {
        delta = 1 ;
      }
    }
  }
  last_stato_dec2 = stato_dec2 ;


digitalWrite(LED_PIN, LOW);  //spegne led pin 13 di default acceso


//---------------------- TEMPERATURA UMIDITA INTERNA ----------------------
int t = dht.readTemperature();
int h = dht.readHumidity();


lcd.setCursor(12, 0);
lcd.print(t);
lcd.setCursor(12, 1);
lcd.print(h);

// ----------------------programmo il rele in base all'umidita ---------------------

lcd.setCursor(5, 2);
lcd.print(set);  // scrivo sul display il limite massimo impostato coi tasti
lcd.setCursor(11, 2);
lcd.print(set-delta);  // scrivo sul display il delta impostato coi tasti





if (h >= set) {
//accende rele
digitalWrite(relay, LOW);

}
if(h <=set-delta) {
// spegne relay
  digitalWrite(relay, HIGH);

}
//delay(1000);
// lcd.noBacklight();
 
 


}

fratt:
Certo che puoi, senza è difficile capire se c'è qualcosa che non va

allegato :wink:
in teoria volevo modificarlo inserendo una ventola a 4 pin e comandandola direttamente da arduino , ma mi son reso conto che è troppo x me...non riesco a capirci

Non ho capito cosa non funziona...
La ventola? Si accende / spegne nel momento sbagliato?
Altro?

fratt:
Non ho capito cosa non funziona...
La ventola? Si accende / spegne nel momento sbagliato?
Altro?

non loso. il sistema funziona e sembra girare. ieri pero dopo aver inserito i pulsanti sembra che il dht leggesse valori piu alti. dal 70% è passato a oltre 80% e credevo leggesse valori sballati.
molto probabilmente avevo riempito l'aria della camera di umidita io...stamattina è di nuovo al 70% quindi il sensore funziona.
siccome sono autodidatta, secondo te la funzione che incrementa i 2 valori è scritta correttamente?

altra cosa, adesso ho scritto una funzione che ,come prova, mi accende e spegne il led pin13 . legge lo stato del pulsante se era stato premuto o no.
cosi premo 1 volta si accende, premo un altra volta si spegne.
posso utilizzarla per spegnere la retroilluminazione del display con lcd.backlight(); ?
vi metto il classico codice per il bottone che ho messo giu

int ledPin = 13;  //Il led è connesso al pin 13
int pinButton = 7;  //Il pulsante è connesso al pin 7
int valButtonOld = LOW; 
int ledState = LOW;


void setup() {
 
 pinMode(ledPin, OUTPUT);  //Il pin del led è un'uscita 
 pinMode(pinButton, INPUT_PULLUP);  //Il pin del pulsante è un'entrata 
 
}


void loop() {
   
 int valButton = digitalRead(pinButton);
  
  if(valButton==HIGH && valButtonOld==LOW)
    ledState = !ledState; // Inverte lo stato (da ON a OFF, da OFF a ON) 
  
  digitalWrite(ledPin, ledState);
  valButtonOld = valButton;
      
}

lucavigna:
siccome sono autodidatta, secondo te la funzione che incrementa i 2 valori è scritta correttamente?

Mi pare corretta. Funziona come ti aspetti?

Per il discorso del backlight dell'lcd, puoi sicuramente accenderlo e spegnerlo come dici tu, basta che sostituisci la digitalWrite con le istruzioni per accendere o spegne la retroilluminazione.

allora, si dopo qualche prova sembra essere tutto corretto!
grazie!

per la funzione retroilluminazione ho provato ma non fa qualche che deve
la sua funzione è questa giusto? lcd.noBacklight();
perche non capisco ...mettendola al posto come dici te , mi spegne la luce e rimane cosi

lcd.noBacklight() spegne la retroilluminazione.
non ho sottomano la libreria, ma dovrebbe esserci un’altra funzione per accenderla.

ovviamente, essendo 2 istruzioni diverse, il codice va leggermente cambiato rispetto a prima, dove facevi un’unica digitalWrite cambiando il valore passato.

fratt:
lcd.noBacklight() spegne la retroilluminazione.
non ho sottomano la libreria, ma dovrebbe esserci un’altra funzione per accenderla.

ovviamente, essendo 2 istruzioni diverse, il codice va leggermente cambiato rispetto a prima, dove facevi un’unica digitalWrite cambiando il valore passato.

si con lcd.noBacklight(); si spegne e per riaccenderla basta usare lcd.backlight();
per come l’ho fatta io legge il pulsante , la spegne ma se mollo il pulsante si riaccende. e non va bene, perche non ricorda che era gia stato premuto.
mentre fatto con il led di arduino funziona bene.

devi segnarti lo stato...
col led facevi ledState = !ledState e puoi usarlo anche adesso per la retroilluminazione.
però adesso non passi il valore alla fnzione, ma ne hai 2 diverse, quindi devi usare un if su ledState.

:confused: non ci sono , mi perdo via...

if (ledState) {
  lcd.backlight();
} else {
  lcd.noBacklight();
}

ok provo grazie! EDIT: funziona alla grande ed era una stupidata. non so perche ma mi perdo via nelle cose piu semplici

adesso stavo litigando con un altro sensore, il DS18B20. l'ho implementato come secondo sensore ma mi va ad impallare tutto! uff che noia! vado a litigare ancora :grin:
EDIT: abbandonato il sensore, mi da troppi problemi. adesso appena mi arriva il programmatore x l'esp 8266 provo a mandare online i dati , altra sfida x me

fratt:

if (ledState) {

lcd.backlight();
} else {
 lcd.noBacklight();
}

fratt, riciao.
allora lo sketch funziona alla grande!
adesso pero vorrei poter comandare le ventole in pwm. in modo da evitare di utilizzare il relay e la ventola sempre al 100%
dispongo di 2 ventole pwm e quindi sto cercando di provare.
online ho trovato uno sketch semplicissimo. e sembra funzionare.
ma ho trovato anche altri sketch che controllano il pwm generando impulsi a 25kHz
allego quello semplice che funziona ma mi mette alcuni dubbi

int FanPWM = 9;             // Fan PWM pin 
int PushButtonInput1 = 2;   // Push button - set PWM Fan speed LOW
int PushButtonInput2 = 3;   // Push button - set PWM Fan speed Medium
int PushButtonInput3 = 4;   // Push button - set PWM Fan speed High


void setup() 
{
  
  pinMode(FanPWM, OUTPUT);
  pinMode(PushButtonInput1,INPUT_PULLUP);
  pinMode(PushButtonInput2,INPUT_PULLUP);
  pinMode(PushButtonInput3,INPUT_PULLUP);
}


void loop()
{
 //-----------------LOW----------------------
 if(digitalRead(PushButtonInput1) == LOW)
 analogWrite(FanPWM, 1);
 //----------------Medium---------------------
 if(digitalRead(PushButtonInput2) == LOW)
 analogWrite(FanPWM, 127);
 //------------------High-----------------------
 if(digitalRead(PushButtonInput3) == LOW)
 analogWrite(FanPWM, 255);
 //---------------------------------------------
}

I dubbi quali sono?

fratt:
I dubbi quali sono?

che in qualche modo si rovini la ventola…

adesso ho creato questo sketch.
_rilevo la temperatura e umidita con dht22
_la scrivo sul display x visualizzarla
_se l’umidita è maggiore o uguale a 80% accendo al massimo la ventola (pwm 255)
_se l’umidita è uguale o minore a 80-delta(5punti%) mette la ventola al minimo (pwm 1)
PS: ho misurato l’uscita del pin pwm e con valore 1 ho 0v, con valore 175 ho 3.4v , con valore 255 ho 5v è corretto?
questo è lo sketch che sembra funzionare:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include <DHT.h>


#define LED_PIN 13
#define DHTPIN 8   // definisco il pin del sensore DHT-22
#define DHTTYPE DHT22 // definisco il tipo di sensore


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);    // definisco a quali pin è connesso il display
DHT dht(DHTPIN, DHTTYPE);


int FanPWM = 9;             // Fan PWM pin 
int set80 = 80;//set a piacere dell'umidità per far accendere la ventola
int delta = 5;//quanti punti % in meno servono per spegnere la ventola rispetto al set

//---------------------------------------------------------------------------- SETUP FISSO----------------------------
void setup(void) {
  
pinMode(FanPWM, OUTPUT);
pinMode(LED_PIN, OUTPUT);  //imposta il pin come uscita PER POI SPEGNERE IL LED

lcd.begin(20, 4); //imposta il tipo di display
Wire.begin();


//------------------ scrivo caratteri fissi su display ------------------------------

lcd.setCursor(0, 0);
lcd.print("Sump Temp.");
lcd.setCursor(0, 1);
lcd.print("Sump Umid.");
}

//-----------------------------------------LOOP CONTINUO PROGRAMMA -------------------

void loop(void)
{

digitalWrite(LED_PIN, LOW);   //spegne led pin 13 di default acceso

//---------------------- TEMPERATURA UMIDITA  ----------------------
int t = dht.readTemperature();
int h = dht.readHumidity();

lcd.setCursor(15, 0);
lcd.write("c");
lcd.write(B11011111); //Simbolo dei gradi celsius
lcd.setCursor(12, 0);
lcd.print(t);

lcd.setCursor(15, 1);
lcd.print("%");   //Simbolo umidita
lcd.setCursor(12, 1);
lcd.print(h);

// ----------------------programmo il rele in base all'umidita ---------------------
if (h >= set80) {
//accende rele
//digitalWrite(relay, LOW);
 analogWrite(FanPWM, 255);
}

if(h <= set80-delta) {
// spegne relay
 // digitalWrite(relay, HIGH);
analogWrite(FanPWM, 1);
}

}

Allora... Non sono molto ferrato sull'hardware, quindi prendi con le pinze quello che dico...

Se la tua ventola è fatta per essere pilotata in pwm non si rovina... Non so se tutte le ventole lo sono... Magari posta il modello esatto così qualcuno più ferrato di me può darti una risposta più precisa.

Vedendo il programma però non capisco che utilità abbia il pwm rispetto al relè... Se accendi sempre al massimo o al minimo il pwm non serve...
Tra l'altro il relè serve solo se la ventola richiede una tensione diversa da Vcc o se richiede più corrente di quella che un pin può fornire.

fratt:
Vedendo il programma però non capisco che utilità abbia il pwm rispetto al relè... Se accendi sempre al massimo o al minimo il pwm non serve...
Tra l'altro il relè serve solo se la ventola richiede una tensione diversa da Vcc o se richiede più corrente di quella che un pin può fornire.

allora tuttomi serve dentro al mobile dell'acquario. era impostato in modo che alla rilevazione di 80% umidita la ventola partiva, per poi spegnersi una volta abbassata a 60% (x esempio)
arduino è alimentato a 12v, idem la ventola, ma siccome ha un consumo credo maggiore (12v 032A) di quello che arduino puo supportare ho inserito un relay. cosi arduino va a 12v, la ventola va a 12v prendendo alimentazione direttamente dall'alimentatore e il relay mi attaccava e staccava in base ai valori impostati.
poi la salinita mi ha rovinato la vecchia ventola dopo 1 anno di lavoro.
l'idea nuova era sfruttare la ventola nuova acquistata (ventola pwm) in modo da evitare che si spegna e riaccenda in continuo (lo faceva ogni 10/15 minuti)
cosi con la pwm la ventola è accesa sempre al minimo...e se l'umidita sale , la ventola aumenta di velocita fino a quando l'umidita è scesa a valori impostati.
cosi non ho un continuo attacca/stacca...

questo è il link della ventola: 12V DC 0.32A Cooling Fan with Extreme Silent Low Speed Control / 120mm x 20mm x 25mm Supply | CE, TUV, UL, and ISO 9001 Manufacturing and Developing | TITAN Technology Limited