Extractor humedad controlado por sensor de presencia

Hola a todos.

Soy un novatillo en este mundo, y de vez en cuando entro a consultar por aquí.

Tenía un proyecto de un extractor de humedad controlado por un sensor DHT11 de humedad y temperatura, pero me ha fallado y estoy trabajando para sustituirlo por un sensor de presencia mh sr505.

Quería compartirlo con vosotros, y si alguien es tan amable de aportar alguna sugerencia, le estaré muy agradecido :slight_smile:

//ESTE PROGRAMA VA A IDENTIFCAR SI HAY UNA PRIMERA DETECCION. A LA SEGUNDA DETECCION, PASADO UN MINUTO, ARRANCARA EL VENTILADOR.

//CONFIGURAR AQUI LAS VARIABLES
int sensor = 11; // PIN donde va conectado el sensor de presencia
int rele = 12; // PIN donde va conectado el rele
//int LEDOK = 6; // LED verde - todo OK //
//int LEDERR = 7; // LED rojo - ERROR //
int vent_on = 0; // Estado del ventilador (1= en marcha ; 0 = parado)
int detectado = 0; // Indica si es la primera deteccion (1= detectado ; 0 = parado)
int activa = 0; // Indica si se debe activar (1= en marcha ; 0 = parado)
long tiempo = 60000; // en milisegundos, el intervalo entre mediciones
int pir = 0;  // Valor de lectura del sensor de presencia

void enciende() {
  digitalWrite(rele, LOW);
  vent_on = 1;
}
void apaga() {
  digitalWrite(rele, HIGH);
  vent_on = 0;
}
void lee() {
  pir = digitalRead(sensor)
  return;
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(rele, OUTPUT); // Activamos el PIN rele como salida para el rele
  pinMode(sensor, INPUT); // Activamos el PIN sensor como entrada para el sensor
  //digitalWrite(rele, HIGH); // Desactivamos el rele // ESTO NO DEBE ESTAR COMENTADO ANTES DE SUBIRLO A LA PLACA
  detectado = 0;
  activa = 0;
  pir = 0;
  delay(2000);
}

void loop() {

  lee(); // Lee el sensor de presencia

  // COMIENZAN LAS COMPROBACIONES

  if (pir == 0) { // Si el sensor de presencia no detecta nada
    detectado = 0;  // Indicamos que no ha detectado una primera vez
    activa = 0; // Indicamos que no debe activarse el ventilador
  }
  else if ((detectado == 1) && (pir == 1)) { // Si ha detactado una primera vez, y una segunda
    if (vent_on == 1) {  // Si el ventilador esta en marcha
      // NO HACER NADA
    }
    else {  // Si el ventilador esta parado y se cumple lo anterior
      activa = 1; // Ordenamos que se active
    }
  }
  else { // Si ha detectado algo el sensor, pero no ha habido una deteccion previa
    detectado = 1; // Indicamos que es la primera deteccion
  }

  // ACABAMOS LAS COMPROBACIONES Y PASAMOS A CONTROLAR EL VENTILADOR

  if ( activa == 1) { // Si hemos decidido activar el ventilador
    enciende()  ; // Mandamos encender
  }
  else { // Si no
    apaga(); // Mandamos apagar
  }
  /*Serial.print("PIR=");
  Serial.println(pir);
  Serial.print("activa=");
  Serial.println(activa);
  Serial.print("detectado=");
  Serial.println(detectado);*/

  delay(tiempo);
}

Gracias.
Un saludo

En líneas generales no esta mal.
Si pides optimizarlo hay tela para cortar.

Movido a Software!

Hola raulm21

Ya que lo solicitas, este es mi comentario sobre optimizar tu sketch:

#define TIEMPO 60000
#define sensor  11  // PIN usado para el sensor de presencia
#define rele    12  // PIN usado para el rele del ventilador

int vent_on;   // Estado del ventilador (1 = marcha, 0 = paro)
int detectado; // Indica si hay permanencia o no (1 = permanencia, 0 = nadie)
int pir;       // indicacion de presencia/ausencia

void setup()
{
  Serial.begin(9600);
  pinMode(rele, OUTPUT);    // PIN del rele como salida
  pinMode(sensor, INPUT);   // PIN del sensor como entrada
  digitalWrite(rele, HIGH); // Comenzamos con rele = OFF
  vent_on=0;                // Actualizamos estado del ventilador
  detectado=0;              // Nadie
}

void loop()
{
	pir = digitalRead(sensor);  // Comprueba el sensor
	
	if(!pir)     // No hay nadie
	{
		if(vent_on)   // Estaba el ventilador en marcha
		{
			digitalWrite(rele, HIGH);  // Ventilador OFF
			vent_on = 0;               // Actualiza estado ventilador
		}
		detectado = 0;                 // Inicializa indicador
	}
	else if(pir && detectado && !vent_on) // Doble deteccion y ventilador OFF
	{
		digitalWrite(rele, LOW);   // Ventilador ON
		vent_on = 1;               // Actualiza estado ventilador
	}
	else
	{
		detectado = 1;         // Marca primera deteccion
	}
	delay(TIEMPO);
}

Si quieres comentar las modificaciones, las comentamos

Hola

Disculpad por no haber contestado, pero no me llegó la notificación y he estado estos días fuera.

Por casualidad, he perdido todos los datos y me ha venido a la memoria que colgué aquí el código, y al menos no tendré que reprogramarlo. Aunque no sea demasiado complejo, je je je.

Gracias por vuestra ayuda. Voy a echar un vistazo, Alfaville, y lo pruebo en la placa.

Un saludo