Ventole pwm

Buonasera sto cercando di controllare delle ventole pwm con arduino mega. Riducono la velocità a seconda della temperatura letta da un sensore ds1820. Quando la temperatura scende al di sotto dei 26 gradi le ventole si spengono. Tra i 26 e 26,06 gradi si spengono e si accendono qualcuno sa come posso risolvere il problema?

Ciao, non sono un esperto, ma se paragono per esempio il termostato di casa, fa una lettura della temperatura ogni 2 minuti circa, altrimenti anche lui quando è li li continuerebbe a switchare on off, mentre se dai un delay ogni lettura dovresti garantirti un po di tempo prima che il componente torni caldo. Spero di esserti stato di aiuto.

Ciao le ventole le devo mettere sopra un acquario marino quindi non c'e' molta differenza di temperatura dopo un certo tempo

Devi creare un ciclo di isteresi … quindi non comparare solo con 26, ma ad esempio decidi che se T < 26 spegni e riaccendi quando T > 27 (o altra temperatura) in modo che tra le due temperature le ventole non continuini ad accendere e spegnere.

Guglielmo

Puoi spiegarmelo in modo più semplice?

— ti rammento che, da regolamento, è permesso sollecitare risposte (fare “up”) solo dopo almeno 48 ore dall’ultimo post. - gpb01

Gae:
Puoi spiegarmelo in modo più semplice?

… non vedo il tuo programma (che non hai messo), per cui cerco di indovinare … tu probabilmente hai una condizione tipo:

if (temperatura < 26) spegni;
else accendi;

E’ chiaro che in queste condizioni, quando sei sui 26 gradi, la temperatura oscilla e tu continui a saltellare tra acceso e spento. Quello che devi fare è decidere due soglie diverse di temperatura per acceso e spento, tipo:

if (temperatura <= 26) spegni;
if (temperatura >= 27) accendi;

… in modo che, nell’intervallo tra 26 e 27 NON avvenga nulla (ovviamente, se occorre, puoi fare l’intervallo sia più stretto che più largo).

Guglielmo

Ciao grazie provo e poi vi faccio sapere

Non sappiamo cosa fa il Tuo Sketch. Inoltre alle ventole DC non piace essere pilotate in PWM. Prendi delle ventole per PC con 4 fili. Quelle hanno un entrata PWM a 5V.

Ciao Uwe

#include <OneWire.h> 
#include <Wire.h>
#include <TimeLib.h>
#include <TimeAlarms.h>
#include <LiquidCrystal_I2C.h>
#include <DS3232RTC.h>
#include <DallasTemperature.h>
int ventola = 8;  // pin pwm
const int inputPin = 5;

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  
#define LED 13
#define relay1 50
int val=0;


#define ONE_WIRE_BUS 2 

byte Piena[8] = {
        B11111,
        B11111,
        B11111,
        B11111,
        B11111,
        B11111,
        B11111,
        B11111
};

byte Vuota[8] = {
        B11111,
        B10001,
        B10001,
        B10001,
        B10001,
        B10001,
        B10001,
        B11111
};

OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);

void setup() {
    
  Serial.begin(57600);
  while (!Serial) ; // attendere il monitor seriale Arduino

  setSyncProvider(RTC.get);  // la funzione per ottenere il tempo dall'RTC
  if (timeStatus() != timeSet)
    Serial.println("Impossibile sincronizzare con RTC");
  else
    Serial.println("RTC ha impostato l'ora del sistema");

 // setTime(8, 29, 40, 1, 1, 11); // set time to Saturday 8:29:00am Jan 1 2011

  sensors.begin(); 
  lcd.begin(20,4); 
  lcd.createChar(1, Piena);
  lcd.createChar(2, Vuota);
  lcd.clear();
  lcd.backlight();
  pinMode(inputPin,INPUT);
  pinMode(LED,OUTPUT);
  pinMode(relay1,OUTPUT);
  
  Alarm.alarmRepeat(23,30,00, RetroOFF); 
  Alarm.alarmRepeat(07,30,00, RetroON);  
}

void  loop(){  
  digitalClockDisplay();
  Alarm.delay(0); 
  sensors.requestTemperatures(); 
 }

void RetroOFF(){
  lcd.setCursor(0,3);
  Serial.print("Alarm: - turn lights off"); 
  lcd.noBacklight();   
}

void RetroON(){
  lcd.setCursor(0,3);
  Serial.print("Alarm: - turn lights on"); 
  lcd.backlight(); 
}

void digitalClockDisplay()
{
 lcd.setCursor(0,0); 
 lcd.print("Aquarium Reef");
 lcd.setCursor(0,1);
      if(day()<10) lcd.print("0");
        lcd.print(day()); 
        lcd.print("/");
      if(month()<10) lcd.print("0");
        lcd.print(month());
        lcd.print("/");
        lcd.print(year());
        lcd.print(" ");
        lcd.setCursor(12,1);
     if(hour()<10) lcd.print("0");
        lcd.print(hour());
        lcd.print(":");
     if(minute()<10) lcd.print("0");
        lcd.print(minute());
        lcd.print(":");
     if(second()<10) lcd.print("0");
        lcd.print(second());
        lcd.setCursor(0,2);  
        lcd.print("Temp: ");
        lcd.setCursor(6,2);  
        lcd.print(sensors.getTempCByIndex(0)); 
        lcd.setCursor(11,2); 
        lcd.print(" ");
        lcd.setCursor(12,2);  
        lcd.print((char)223); 
        lcd.print("C");

int val=digitalRead(inputPin);        
if (val==HIGH){ 

lcd.setCursor(13,3);  
lcd.print("S:");
lcd.write(byte(2));
lcd.print(" R:");
lcd.write(byte(1));
digitalWrite(LED, HIGH);  //accende il led
digitalWrite(relay1,LOW); 

}else
{ 

lcd.setCursor(13,3);  
lcd.print("S:");
lcd.write(byte(1));
lcd.print(" R:");
lcd.write(byte(2));
digitalWrite(LED, LOW);   //spegne il led
digitalWrite(relay1,HIGH);  
}

if (sensors.getTempCByIndex(0)<=26) {   
    lcd.setCursor(0,3);  
    lcd.print("Fans: OFF");
    analogWrite(ventola,10);
} 

else if (sensors.getTempCByIndex(0) > 26,12 && sensors.getTempCByIndex(0) <= 27) {  
    lcd.setCursor(0,3);  
    lcd.print("Fans: 33%");
    analogWrite(ventola,85);
}  

else if (sensors.getTempCByIndex(0) > 27,12 && sensors.getTempCByIndex(0) <= 29) { 
    lcd.setCursor(0,3);  
    lcd.print("Fans: 66%");
    analogWrite(ventola,170);
}  

else if (sensors.getTempCByIndex(0) > 29,12) {  
    lcd.setCursor(0,3);  
    lcd.print("Fans: MAX");
    analogWrite(ventola,255);
}  

 }

Ciao questo è il mio codice per gestire il rabbocco automatico e le ventole per il mio acquario marino.
Cosa ne pensate?

Il punto decimale in C non é la virgola ma il punto.

Ciao cosa vuol dire quale punto?

Che stai usando la ‘,’ al posto del ‘.’ decimale …

else if (sensors.getTempCByIndex(0) > 26,12 && sensors.getTempCByIndex(0) <= 27) {

… quel valore decimale 26,12 in ‘C’ va scritto 26.12 o … fai cose completamente diverse (cerca ‘C comma operator’).

Guglielmo

Grazie. Ogni tanto si aziona il rele' attivato dal interruttore galleggiante e dopo un po'si spegne da solo qualcuno può darmi consigli?

else if (sensors.getTempCByIndex(0) > 26,12 && sensors.getTempCByIndex(0) <= 27)

Gae: Grazie. Ogni tanto si aziona il rele' attivato dal interruttore galleggiante e dopo un po'si spegne da solo qualcuno può darmi consigli?

Ma hai corretto lo sketch? Che valori legge il sensore? Ciao Uwe

Ciao ho corretto lo sketch le accensioni casuali si sono risolte grazie. ho comprato una pompa da 12v per il rabbocco che funziona anche a 5v devo usare un rele'?