Sensor Sharp movimiento con contador

Hola amigos!

Amigos ocupo su ayuda, tengo un sensor sharp de movimiento el cual quiero que cuando detecto movimiento me encienda un rele, lo que pasa es que ocupo que se encienda un tiempo despues de que el sensor note que hay algo en el rango.
Deje una nota en el time3 que es donde quiero que empiece un timer.

#include <TimerOne.h>   

const int pirPin_2 = 3;
volatile long int Time2 = 0;
volatile long int Time3 = 0;

const int RELE =  4; 

void setup() {
 pinMode(pirPin_2, INPUT); 
 Serial.begin(9600); 
 digitalWrite(pirPin_2, LOW);

 Serial.print("Calibrating Sensor ");  
    for (int i = 0; i < calibrationTime; i++) {
      Serial.print(".");
      delay(1000);
    }
    Serial.println(" Done");
    Serial.println("SENSOR ACTIVE");
    delay(10);

   Timer1.initialize(1000000);      
   Timer1.attachInterrupt(Temporizador); 

   pinMode(RELE, OUTPUT);

}

void Temporizador(void) {
  Time++;
  //Serial.print("Time 1 = ");
  //Serial.println(Time);
  Time2++;
  Serial.print("Time 2 = ");
  Serial.println(Time2);  
  Time3++;
  Serial.print("Time 3 = ");
  Serial.println(Time3);


void loop() {
pirState = digitalRead(pirPin_2); 

  if(digitalRead(pirPin_2) == HIGH){
       Serial.println("Sensor Active");
       delay(80);
       Time2 = 0;

       if(Time2 <= 1){     
         Time3 = 0;
       }     
       if(Time3 == 0){
         Time3++; // Quiero que me cuente desde 0 de nuevo. Pero no empieza el contador
       } 
       if(Time3 <= 30){
         digitalWrite(RELE, HIGH);
       }
  }
    

  if(digitalRead(pirPin_2) == LOW){       
      digitalWrite(RELE, LOW);
       }

El primer problema es que en una rutiina de interrupción, sea la que sea no puedes incluir jamás Serial.print.
Asi que elimina eso para comenzar.
Crea banderas y luego cuando esas banderas esten o no habilitadas las muestras en el loop().

Luego veré la lógica de tu código que ahora no entiendo y no tengo tiempo.

Aparte de lo que te señaló @Surbyte y que es fundamental, hay varios problemas.

Para empezar el código no compila, faltan llaves, las variables Time, calibrationTime y pirState no están definidas, encima Time y pirState no se usan para nada útil y la lógica no tiene sentido (perdón pero es así).

Mira, cuando pirPin_2 es HIGH, pones Time2 en 0, si Time2 es <= a 1 (claro que lo es) pones Time3 en 0 y si es 0 (salvo que justo se dispare el timer, va a ser 0) la incrementas.
No tiene sentido.

Es más sencillo

Time2 = 0;
Time3 = 0;

y ya, pero ¿qué sentido tiene ahora Time2? Ninguno, igual que antes.

Ademas el timer se dispara cada 1 seg y en 1 seg tu loop() se va a ejecutar cientos (sino miles) de veces, entonces mientras pirPin_2 es HIGH continuamente Time3 se va a poner a 0, nunca va a superar 30 y cuando lo haga será porque pirPin_2 es LOW y ya no se va a chequear el valor porque no entra en el if() por HIGH.

Por otro lado

if(digitalRead(pirPin_2) == HIGH) {
...
}
if(digitalRead(pirPin_2) == LOW) {
...
}

si bien no es incorrecto, tampoco tiene sentido.
Si no es HIGH solo puede ser LOW, entonces

if(digitalRead(pirPin_2) == HIGH) {
...
}
else { // es LOW
...
}

es más lógico.

Hola amigo!

Muchas gracias por tu respuesta. Tengo una serie de preguntas y respuestas, para lo que me comentas, tratare de ponerlas en orden para no hacer una confusion.

Respuestas:

  1. Time 1 y PirPin estan ya que tengo otro sensor conectado y me hace la funcion de contador, pero no inclui esa parte del codigo, perdón.

Preguntas:

  1. Actualmente lo que quiero es que el sensor Pirpin_2 al detectar un objeto, se active, se quede activado y si pasan mas de 30seg, me active el rele, lo cual por eso el Time 3, lo que pasa es que no logro hacer que empiece el contador, porque el sensor se apaga y prende, entonces el valor siempre sera 0.
  2. No puedo ponerlo en LOW porque no me cumpliria la funcion de detetar si algo esta atravesado en el sensor, ya que esta apagado.

Que me recomiendas?
Saludos!

Tu explicación es poco clara.

Pon un link al producto para entender de qué sensor hablamos.
Y dinos con que placa trabajas (UNO, Nano, Mega, etc.)

¿Se active qué? ¿El sensor?
Se supone que el sensor está activo sino como detectaría algo.
Pinpir_2 no es un sensor, es un pin al cual está conectado el sensor.

Otra vez, ¿qué cosa quedaría activada?

Eso creo que es lo más simple de hacer.

¿Por qué el sensor se apagaría?

A Pinpir_2 no puedes ponerlo en LOW porque es una entrada.

Mejor pon un esquema de tus conexiones, creo que va a aclarar más las cosas.

Llegado a este punto, ¿cuándo se desactivaría el relé?

Y finalmente, ¿por qué usas las interrupciones de un timer para contar segundos?


Agrego:

Creo que capté la idea, a ver si es así...

Cuando el sensor detecta que pasa un objeto, el mismo debe pasar en menos de 30 seg., si no lo hace entonces se activa el relé.

Haría algo así

const int CALIBRATIONTIME = 5; // colocar valor correcto
const byte PIRPIN_2 = 2;
const byte RELEPIN = 4;

unsigned long tiempoFlanco; 
bool estadoAnteriorSensor = false;
bool releActivado = false;

void setup() {
  pinMode(RELEPIN, OUTPUT);
  digitalWrite(RELEPIN, LOW);
  pinMode(PIRPIN_2, INPUT); 
  digitalWrite(PIRPIN_2, LOW); 
  Serial.begin(9600);
  Serial.print("Calibrating Sensor ");
  for (int i = 0; i < CALIBRATIONTIME; i++) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println(" Done");
  Serial.println("SENSOR ACTIVE");
  delay(10);
}

void loop() {
  bool estadoSensor = (digitalRead(PIRPIN_2) == HIGH);
  if (estadoSensor) {  // si sensor HIGH
    if (!estadoAnteriorSensor) {  // y si antes LOW => flanco ascendente
      tiempoFlanco = millis();  // guarda tiempo
    }
    else {  // no es flanco
      if (!releActivado) {  // si el rele ya no esta activado
        if (millis() - tiempoFlanco >= 30000UL) { // si 30 segundos o mas en HIGH
          digitalWrite(RELEPIN, HIGH); // activa relé
          releActivado = true;
        }
      }
    }
  }
  else {  // es LOW
     if (releActivado){  // si rele activado
       releActivado = false;
       digitalWrite(RELEPIN, LOW);  // desactiva rele
     }
  }
  estadoAnteriorSensor = estadoSensor;
}

Simulación
https://wokwi.com/projects/360689656489265153
El pulsador simula al sensor y el LED al relé (para no aburrirte, tiempo de calibración 1 seg y tiempo en HIGH para activar relé es 5 seg)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.