Go Down

Topic: Error Sensor PIR de movimiento y LED (Read 467 times) previous topic - next topic

Santydayalac

Sep 24, 2019, 05:59 pm Last Edit: Sep 26, 2019, 01:39 am by surbyte Reason: No usar mayúsculas para titulos o para el cuerpo del mensaje.
Code: [Select]

#include <NewPing.h>

#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200


const int LEDPin=10;
const int PIRPin= 2;

int pirState = LOW;           // de inicio no hay movimiento
int val = 0;                  // estado del pin

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup(){
  
  pinMode(LEDPin, OUTPUT);
  pinMode(PIRPin, INPUT);
  Serial.begin(9600);
}

void loop (){
  // Esperar 1 segundo entre mediciones
  delay(1000);
  // Obtener medicion de tiempo de viaje del sonido y guardar en variable uS
  int uS = sonar.ping_median();
  // Imprimir la distancia medida a la consola serial
  Serial.print("Distancia: ");
  // Calcular la distancia con base en una constante
  Serial.print(uS / US_ROUNDTRIP_CM);
  Serial.println("cm");
  
  //sensor de movimiento
 val = digitalRead(PIRPin);
 if (val == HIGH)   //si está¡ activado
  {
    digitalWrite(LEDPin,HIGH);  //LED ON
    if (pirState == LOW)  //si previamente estaba apagado
    {
      Serial.println("Sensor activado");
      pirState = HIGH;
    }
  }
  else   //si esta desactivado
  {
    digitalWrite(LEDPin, LOW); // LED OFF
    if (pirState == HIGH)  //si previamente estaba encendido
    {
      Serial.println("Sensor parado");
      pirState = LOW;
    }
  }
}






Hola soy nuevo en el mundo arduino esta es la programacion que tengo
Tengo problemas con esta programacion porque deseo que el led solo se encienda cuando detecte algun movimiento y luego se apague pero este sigue prendido y titila

Mikms

Veo que hay dos cosas un sensor Pir que te activa un led y uno de ultrasonidos (TRIGGER_PIN -ECHO_PIN). Con el ultrasonidos solo mides y no haces nada más, y con el Pir enciendes o apagas un led no?.

Sin saber que Pir usas ni tu esquema de conexion...  has probado en poner una R de 10k a masa (pulldown) en el pin 2? asi  evitas residuales.

Esto sin saber como ya te dije tipo de Pir etc, pero evitas residuales o falsos contactos

Mikms

Recuerda que el Pir necesita de un tiempo de arranque sin trabajar para que "se caliente" y se ponga a la temperatura del ambiente que necesita medir, aproximadamente será 1 minuto el que se pondrá sin trabajar una vez que arranque SOLO la primera vez.

surbyte

He modificado tu programa para que no tenga delay por un lado y que mire el flanco de tu PIR y no su estado.

Cuando cambie de 0 a 1 es porque hay un objeto y cuando vuelva de 1 a 0 es porque se terminó el tiempo o no lo detecta mas.

Prueba a ver.

Code: [Select]
#include <NewPing.h>

#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200


const int LEDPin=10;
const int PIRPin= 2;

bool pirState, pirStateAnt = false;           // de inicio no hay movimiento
unsigned long start;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup(){
 
  pinMode(LEDPin, OUTPUT);
  pinMode(PIRPin, INPUT);
  Serial.begin(9600);
}

void loop (){

// Esperar 1 segundo entre mediciones
if (millis() - start > 1000UL) {
// Obtener medicion de tiempo de viaje del sonido y guardar en variable uS
int uS = sonar.ping_median();
// Imprimir la distancia medida a la consola serial
Serial.print("Distancia: ");
// Calcular la distancia con base en una constante
Serial.print(uS / US_ROUNDTRIP_CM);
Serial.println("cm");
start = millis();
}
 
//sensor de movimiento
pirState = digitalRead(PIRPin);
if (pirState && !pirStateAnt) {  // si pasó de 0 a 1 está activado
digitalWrite(LEDPin,HIGH);   // LED ON
Serial.println("Sensor activado");
}
if (!pirState && pirStateAnt) {  // si pasó de 1 a 0 entonces terminó
Serial.println("Sensor desactivado");
digitalWrite(LEDPin, LOW); // LED OFF
}
pirStateAnt = pirState;
}

Go Up