Termostato con arduino.

Antes de nada me presento, soy Daniel y estoy empezando en el mundo de arduino así que las preguntas igual son un poco básicas o tontas. Un saludo a todos. :slight_smile:

Estoy haciendo un termostato para controlar la puesta en marcha de un ventilador. De momento lo he montado con el arduino UNO y parece que funciona bien. Pongo aquí lo que he hecho hasta ahora porque me gustaría que algún ojo más experto que yo mire a ver que modificaría.

Sobre todo tengo la duda de si le pasará algo al ventilador porque el adaptador de corriente sea de 1 amperio ya que el solo consume 0,12. Seguro que es una tontería pero, ¿Se puede quemar o algo?

Otra cosa, me ha costado bastante pillar como funciona e interpretar el mosfet. Después de varios vídeos creo que lo he pillado mas o menos. En la hoja de características del IRF520 he he visto que pone VGS(th) = 2v min 4v max. Entiendo que esa es la tensión umbral y que en principio arduino manda 5v así que la cosa va bien. ¿me equivoco?

Por otra parte entiendo que con el voltaje de la señal de arduino y los 12v de alimentacion, el mosfet estaría trabajando en donde he señalado en la gráfica. ¿Es así? igual no estoy mirando donde hay que mirar y funcionar me funciona, pero quiero comprender bien lo que está pasando. Creo que tal vez no sea esa gráfica porque pone “pulse widht 20μs”, pero entonces no se donde mirar o como hago para calcularlo.

Esto es lo que he montado:

Y este el programa:

#include <DHT.h>
#define DHTTYPE DHT11  //Defino el tipo de sensor conectado

const int DHTPin = 5;  //Pin al que conectar el sensor
DHT dht(DHTPin, DHTTYPE); //crear el objeto DHT especificando pin y modelo

const float Tmax = 35; //Temperatura a la que se enciende el ventilador
const float Tparada = 30; //Temperatura en la que se apaga el ventilador
const int VentPin = 6;
const int LedPin = 7;
bool Ventilador = false;
int Periodo = 30000; //Tiempo que transcurre entre la toma de datos del sensor DHT (en milisegundos)
unsigned long TiempoActual = 0;
 

void setup() {
  pinMode(VentPin,OUTPUT);
  pinMode(LedPin,OUTPUT);
  Serial.begin(9600);
  dht.begin(); //Inicio el sensor
}

void loop() {
  if(millis() > TiempoActual + Periodo){
    TiempoActual = millis();
    float h = dht.readHumidity();  //Leer la humedad
    float t = dht.readTemperature(); //Leer la temperatura
  
    if (isnan(h) || isnan(t)) {
      digitalWrite(LedPin,HIGH);
      Serial.println("Fallo en la lectura del sensor DHT.");
    return; 
    }
    else{
      digitalWrite(LedPin,LOW);
    }
    Serial.print("Humedad: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperatura: ");
    Serial.print(t);
    Serial.println(" *C ");

    if (t>=Tmax && Ventilador==false){
      Ventilador = true;
      digitalWrite(VentPin, HIGH);
    }
    if (t<=Tparada && Ventilador==true){
      Ventilador = false;
      digitalWrite(VentPin, LOW);
    }
  }
}

No puedo creer, luego de tanto tiempo que alguien postee todo casi como es debido.
Se te escapó el código pero ya lo edito para que se visualice con las etiquetas para código y no con citas como has usado.
Gracias por postear un esquema a mano alzada explicando lo que haces.

Si no es la gráfica has estado mas o menos cerca.

En la gráfica que yo veo, la corriente es menor en torno a 2A.
La hoja de datos dice que la Id máx es de 9A a 25°C en modo continuo, no con pulsos de 20uS. Con pulsos la corriente a un Vgs adecuado llega a 37A

Acá hay un debate del tema, no se toca el tema de la corriente a 5V para Vgs pero sería bueno que lo mires a ver si aporta alguna idea. Link

Hola, no contesté en su día y ahora me he acordado. Lo primero muchas gracias surbyte por las aclaraciones y el enlace, me sirvieron.

Finalmente terminé el proyecto, aunque ese me funcionaba bien así, el definitivo quedó ligeramente diferente. Cambié el ventilador de 12v y el mosfet por un par de ventiladores a 230v y un relé para activarlos.

Un saludo y gracias por todo.

#include <DHT.h>
#define DHTTYPE DHT11  //Defino el tipo de sensor conectado

const int DHTPin = 5;  //Pin al que conectar el sensor
DHT dht(DHTPin, DHTTYPE); //crear el objeto DHT especificando pin y modelo

const float Tmax = 33; //Temperatura a la que se enciende el ventilador
const float Tparada = 28; //Temperatura en la que se apaga el ventilador
const int VentPin = 3;
const int LedPinRojo = 7;
const int LedPinVerde = 12;
const int Selector = 10;
int EstadoSelector = 0 ;
bool Ventilador = false;
int Periodo = 10000; //Tiempo que transcurre entre la toma de datos del sensor DHT (en milisegundos)
unsigned long TiempoActual = 0;
 

void setup() {
  pinMode(VentPin,OUTPUT);
  pinMode(LedPinRojo,OUTPUT);
  pinMode(LedPinVerde,OUTPUT);
  pinMode(Selector,INPUT);
//  Serial.begin(9600);
  dht.begin(); //Inicio el sensor
}

void loop() {
  EstadoSelector = digitalRead(Selector);
  if(EstadoSelector == LOW){
    if(millis() > TiempoActual + Periodo){
      TiempoActual = millis();
      float h = dht.readHumidity();  //Leer la humedad
      float t = dht.readTemperature(); //Leer la temperatura
    
      if (isnan(h) || isnan(t)) {
        digitalWrite(LedPinRojo,HIGH);
        digitalWrite(VentPin, LOW); //Asegurar el paro del ventilador en caso de fallo del sensor
        Ventilador=false;
        t = 0;
        digitalWrite(LedPinVerde,LOW);
//        Serial.println("Fallo en la lectura del sensor DHT.");
      return; 
      }
      else{
        digitalWrite(LedPinRojo,LOW);
      }
/*      Serial.print("Humedad: ");
      Serial.print(h);
      Serial.print(" %\t");
      Serial.print("Temperatura: ");
      Serial.print(t);
      Serial.println(" *C ");*/
  
      if (t>=Tmax && Ventilador==false){
        Ventilador = true;
        digitalWrite(VentPin, LOW);
        digitalWrite(LedPinVerde,HIGH);
      }
      if (t<=Tparada && Ventilador==true){
        Ventilador = false;
        digitalWrite(VentPin, HIGH);
        digitalWrite(LedPinVerde,LOW);
      }
    }
  }
  else{
    digitalWrite(VentPin, LOW);
    digitalWrite(LedPinVerde,HIGH);
  }
  delay(5000);
}

Veo en tu código un

  delay(5000);

pero tmb veo que cuentas tiempo usando millis() y tener ambos en el loop es un contrasentido.

Tu código funciona pero ese delay(5000) limita TODO tu código a solo dos pasadas y obliga a que si pones el switch Selector en LOW demores 5 seg en prestarle atención.
Tal vez no sea importante ahora pero a futuro lo será porque no vas a dejar de hacer cosas.

Deja ese delay(5000) o mejor dicho elimínalo.

Si haces ese cambio tu sensor seguirá leyendo cada 1 seg y la reacción de tu switch será inmediata.

Buenas surbyte, tienes razón. Ahora que lo veo no sé que hace ahí ese delay. Igual se me quedó colgando cuando estuve haciendo pruebas. Eliminado queda, gracias una vez más :wink: