#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
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
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.
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.
#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;
}