Sensor pir p/ activar relay!

Hola, soy muy nuevito en Arduino y me preguntaba, después de haber visto varios códigos pero ninguno que tuviera lo que quería, es si se puede activar un rele cuando un sensor pir detecte movimiento, pero poder activar esa funcion de abrir el rele y luego a gusto volver a desactivarla ( con un teclado o control remoto, un boton etc)...
Se que el sensor pir HCSR501 manda una señal 0 cuando no detecta nada, y 1 cuando detecta movimiento..algo tambien lei de los flags para hacerlo funcionar...
Ojala me puedan dar una idea de como poder hacerlo gracias..

Como que no lo has visto, esta por todos lados claro no exactamente como lo planteas.

El PIR es como un switch que se activa por X tiempo y si quieres desactivarla a gusto solo necesitas que el control del rele este dado por un flag
Tu PIR activa el flag (variable SI/NO o booleana) y tu por teclado desactivas el flag. Como el falga controla que hará el relé entonces solucionado.

Hola surbyte, gracias por tu respuesta…si la verdad que es como me indicas…yo de código arduino (C ) no entiendo casi nada, programo en otros códigos como visual, y web php, html, cs3, etc pero de lo referente a arduino casi nada…aunque estoy familiarizado con lenguaje de programación…
el tema es que no se como empezar aun con códigos que tengo de la web…
tengo este codigo que anda bien para un pir, y tiene otro para agregar flasgs que encenderian por bluetooth, pero quiero hacerlo por lector de huella:

// Control de relé a partir de sensor PIR

int pirPin = 1;
int relePin = 2;

void setup()
{
 pinMode(pirPin, INPUT);
 pinMode(relePin, OUTPUT);
 digitalWrite(2, LOW); //rele 1 off
}

void loop()
{
 if (digitalRead(pirPin) == HIGH)
     digitalWrite(relePin, HIGH);
 else
   digitalWrite(relePin, LOW);

 delay(100);
}



//despues encontre este codigo que maneja 4 relays por bluetooth
//pero yo no quiero x BT, quisiera por lector de huellas


/* Control reles mediante bluetooth
usamos libreria SoftwareSerial


#include <SoftwareSerial.h>
SoftwareSerial Blue(4, 2); 
// RX, TX Blue nom de nuestra funcion y pines digitales donde conectar
// La variable state guarda los valores recibidos por el modulo HC-06
int state = 0;      
int flag = 0;      
void setup() {
   // configuramos pins de salida
   pinMode(8, OUTPUT);
   pinMode(9, OUTPUT);
   pinMode(10, OUTPUT);
   pinMode(11, OUTPUT);
   Blue.begin(9600);
   digitalWrite(8, LOW); // rele 8 off
   digitalWrite(9, LOW); // rele 9 off
   digitalWrite(10, LOW); // rele 10 off
   digitalWrite(11, LOW); // rele 11 off
}
void loop() {
//Leemos valor y guardamos en variable state
   if(Blue.available() > 0){
     state = Blue.read();
     flag=0; //ponemos bandera a 0
     Blue.println(" -------  ON / OFF -------");
   }
  // ----------------------------------------------------------
  // ------------- leds -------------------------------------
  //  si state = 0 rele off
   if (state == '1') {
       digitalWrite(8, LOW);
       if(flag == 0){
         Blue.println("LED 1: off");
         flag = 1;
       }
   }
  //  si state = 1 rele ON
   else if (state == '2') {
       digitalWrite(8, HIGH);
       if(flag == 0){
         Blue.println("LED 1: on");
         flag = 1;
       }
   }
   
//----------------------------------
  if (state == '3') {
       digitalWrite(9, LOW);
       if(flag == 0){
         Blue.println("LED 2: off");
         flag = 1;
       }
   }
   // state = 4 rele 2 ON
   else if (state == '4') {
       digitalWrite(9, HIGH);
       if(flag == 0){
         Blue.println("LED 2: on");
         flag = 1;
       }
   }
   /// ------------------------
     if (state == '5') {
       digitalWrite(10, LOW);
       if(flag == 0){
         Blue.println("LED 3: off");
         flag = 1;
       }
   }
   //  si state = 6 rele 3 ON
   else if (state == '6') {
       digitalWrite(10, HIGH);
       if(flag == 0){
         Blue.println("LED 3: on");
         flag = 1;
       }
   }
//--------------------- fi leds --------------------------------------------------------------
  if (state == '7') {
       digitalWrite(11, LOW);
       if(flag == 0){
         Blue.println("LED 4: off");
         flag = 1;
       }
   }
   // si state = 8 rele 4 ON
   else if (state == '8') {
       digitalWrite(11, HIGH);
       if(flag == 0){
         Blue.println("LED 4: on");
         flag = 1;
       }
   }
   //-----------------------------------------------------------------
   //-------------------- TODO OFF ----------------------------
     if (state == '0') {
       digitalWrite(11, LOW);
       digitalWrite(10, LOW);
       digitalWrite(9, LOW);
       digitalWrite(8, LOW);
       if(flag == 0){
         Blue.println("------LEDS : off--------");
         flag = 1;
       }
   }
}

*/

Holaa nadie que me tire una idea? Quiero usar flags para poder activar y desactivar a gusto..

No viste el privado que te envié para que edites tu post#2?
Y otra cosa ten paciencia, pusiste tu hilo el 25 y apenas han pasado unas horas.
Ese comentario

Holaa nadie que me tire una idea?

es porque no has leído las normas que te envié por privado.
Estan en el primer hilo de cada sección, asi que no hace falta que a cada nuevo le envíe y reclame que debe leerlas y aplicarlas.
Ahora hazme el favor, edita tu post y presta atención a que hacer con la ansiedad.
Ya te van a responder.
NOTA: Yo no lo hago hasta que la gente postea debidamente.
Asi que ahi tienes tu incentivo.

Gracias surbyte..corregido...yo al relay ya lo hago funcionar pero no a gusto, cierra y abre con un intervalo y en un ciclo infinito que logre adaptarlo para que solo lo repita 2 veces...la idea es con un LDR o sino mas simple..con un pulsador ( yo ahora conecte un boton de 2 posiciones)..poder activarlo y luego desactivarlo al volver a pulsar..entiendo que con flags podria interpretarlos para que al encender el ldr/ pulsador cambie a estado 1 y se active y despues al apagar ldr/pulsador cambie a estado 0 y se cierre el relay..
La idea esta pero trato de combinar codigos que encuentro en distintos post y no anda :confused: .

Bueno veo que llamé tu atención, jaja, por favor para los que me lean, eviten hacerme trabajar y usen las etiquetas.

Bien, estoy mirando tu código, mira por no poner etiquetas cuando le presto atención…

#include <SoftwareSerial.h>
SoftwareSerial Blue(4, 2); 
// RX, TX Blue nom de nuestra funcion y pines digitales donde conectar
// La variable state guarda los valores recibidos por el modulo HC-06
int state = 0;      
int flag = 0;      
void setup() {
   // configuramos pins de salida
   pinMode(8, OUTPUT);
   pinMode(9, OUTPUT);
   pinMode(10, OUTPUT);
   pinMode(11, OUTPUT);
   Blue.begin(9600);
   digitalWrite(8, LOW); // rele 8 off
   digitalWrite(9, LOW); // rele 9 off
   digitalWrite(10, LOW); // rele 10 off
   digitalWrite(11, LOW); // rele 11 off
}
void loop() {
//Leemos valor y guardamos en variable state
   if (Blue.available() > 0){
       state  = Blue.read();
       flag   = 0; //ponemos bandera a 0
       Blue.println(" -------  ON / OFF -------");
   }
    // ------------- leds -------------------------------------
  //  si state = 0 rele off
  switch (state) {
    case '1': //  si state = 1 rele ON
              accionLed(8, 1);
              break;
    case '2': //  si state = 1 rele OFF
              accionLed(8, 0);
              break;
    case '3': accionLed(9, 1);
              break;
    case '4': accionLed(9, 0);
              break;
    case '5': accionLed(10, 0);
              break;
    case '6': accionLed(10, 1);
              break;
    case '7': accionLed(11, 0);
              break;
    case '8': accionLed(11, 1);
              break;
    case '0': digitalWrite(11, LOW);
              digitalWrite(10, LOW);
               digitalWrite(9, LOW);
               digitalWrite(8, LOW);
               if (flag == 0){
                  Blue.println("------LEDS : off--------");
                  flag = 1;
               }
              break;
  }
}

void accionLed(const byte pin, bool estado) {
  digitalWrite(pin, estado);
  if (flag == 0){
      Blue.println("LED "+String(pin-7) + estado? " on":" off");
      flag = 1;  
  }
}

Esto hace lo mismo que el tuyo ahora dime que quieres además que haga?

Ok muchas gracias…

Hola Surbyte,gracias por tu respuesta..no en realidad el código que yo puse lo saque de la web..y anda con un bluetooth yo necesito que lo haga con un sensor de movimiento o un botón de 2 puntos..o sea lo presiono y apaga y lo presiono y enciende el botón..el tema que no se como adaptar ese código a algo sencillo, yo con este codigo:

void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);     
  blink();
  pinMode(13, OUTPUT); //esto apaga el pin 13 de la placa...para encenderlo pinMode(13, INPUT);
}

void loop() 
{}

void blink(){
  digitalWrite(2, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(2, LOW);    // set the LED off
  delay(1000);              // wait for a second
  digitalWrite(2, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(2, LOW);    // set the LED off
    delay(1000);              // wait for a second
    digitalWrite(2, HIGH);
}

lo hago encender/abrir 2 veces y que quede apagado/cerrado..
pero quiero hacerlo andar con flags para que el botón o el sensor ldr lo activen o desactiven según sus estados..

Hola, estoy probando distintas cosas y logre, aunque no lo crean (no postie en otro lado, ni me ayudo nadie, voy a las piñas pero solo aunque los codigos si salen de intenet :confused:) mas o menos lo que quería con este código:

const int inputPin = 7;

int value = 0;
 
void setup() {
  pinMode(2, OUTPUT);
  Serial.begin(9600);
  pinMode(inputPin, INPUT);
  digitalWrite(2, LOW);
}
 
void loop(){
  value = digitalRead(inputPin);  //lectura digital de pin
 
  //mandar mensaje a puerto serie en función del valor leido
  if (value == HIGH) {
      Serial.println("Encendido");
      digitalWrite(2, LOW);
  }
  else {
      Serial.println("Apagado");
      digitalWrite(2, HIGH);
  }
  delay(1000);
}

pero quiero agregarle un temporizador para que a la señal de encendido le de unos segundos antes de poner en high el pin 2..y ahi me quede por ahora...acepto cualquier idea gracias..

A ver si esto ayuda

bool estado, estadoAnt = false;
unsigned long start;
const byte outPin   = 2;
const byte inputPin = 7;

void setup(){
  Serial.begin(9600);
  pinMode(inputPin, INPUT);
  pinMode(outPin, OUTPUT);
}

void loop(){

  estado  = digitalRead(8);	
 
  if (estado && !estadoAnt) {  
  	  start = millis();
      digitalWrite(outPin, HIGH);
  }
  estadoAnt = estado;

  if (millis() - start > 1000UL) { // cambia 1000 en milesimas de segundo por tu valor
  	  Serial.println("Encendido");
  	  digitalWrite(outPin, HIGH);
  } 
  else {
      Serial.println("Apagado");
      digitalWrite(outPin, LOW);
  }
}

Hola Surbyte gracias por tu respuesta, no o yo no lo puedo hacer funcionar o no funciona…no respeta el estado del pulsador…igual haces un digitalread ( 8 ) en 8…y en 8 no hay nada…lo cambie a 7 y después a 2 pero igual no actúa en función de lo que espero…

este que puse antes anda genial con un botón, pero yo quiero q al presionar el botón cuente x tiempo (30 seg por ej) y recién ahi ejecute la acción de poner el pin 2 en high…pero bueno si lo interrumpo con el botón otra vez que lo apago que se quede como estaba…

const int inputPin = 7;

int value = 0;
 
void setup() {
  pinMode(2, OUTPUT);
  Serial.begin(9600);
  pinMode(inputPin, INPUT);
  digitalWrite(2, LOW);
}
 
void loop(){
  value = digitalRead(inputPin);  //lectura digital de pin
 
  //mandar mensaje a puerto serie en función del valor leido
  if (value == HIGH) {
      Serial.println("Encendido");
      digitalWrite(2, LOW);
  }
  else {
      Serial.println("Apagado");
      digitalWrite(2, HIGH);
  }
  delay(1000);
}

Buen opero si estas aprendiendo te daras cuenta que hay que poner la entrada ahi.
Intenta poner algo de tu parte.

cambia esto

estado  = digitalRead(8);

por esto

estado  = digitalRead(inputPin);

No es tan dificil, hasta es una cosa de sentido común. Copié un código de otro lado y lo corrijo en el aire

Y los 30 segundos por favor, te puse ahi que cambies el tiempo a tu gusto en milisegundos
30 x 1000 = 30000 y listo

Sin base de programación terminas haciendo solo COPY & PASTE o Copiar y Pegar y no aprendes nada.
Debes aprender, y solo con un libro y los ejemplos se hace.

En Documentación indice de temas tutoriales tienes clases de Youtube, sugerencia de libros, millis etc etc.

Ahi es un buen punto de partida.

De todos modos ya te di las dos soluciones posibles.

La verdad no se que entendiste, yo te dije que programo en otros lenguajes pero no en este, yo te podría enseñar un montón de cosas, pero me parece que tener conocimiento de algo y subirse al caballo a mi no me pasó nunca...si no queres ayudar no te preocupes, yo postie una duda si alguien le parece bien contestar y contesta constructivamente bienvenido sea, para contestar como vos, ayudando pero hablando como si fueras ingeniero de la NASA, me parece mala leche...
respecto de tu "COPY & PASTE" así aprendí todo lo que se de todo lo que hago, PHP html5 css3 javascript informatica albañileria mecanica automotriz etc etc etc, lo aprendí copiando códigos de la web de miles de post y usando y mezclando lo que me convenía me interesaba o me parecía que podía funcionar, y preguntando y preguntando salí aprendiéndolos y laburando de lo aprendido..
yo te agradezco pero si te parece que no se puede preguntar con mínimos conocimientos, no te tomes la molestia de responder mis consultas..

de cualquier manera insisto en que tu solución a mi no me funciona..gracias igual..

Ah bueno, vaya respuesta!!!
Esta todo dicho en tus palabras últimas tuyas y mi respuesta anterior. Cualquiera en esta comunicad lo va a afirmar.

Dejo a otro que lo haga ya que no puedes cambiar los dos errores menores que te indiqué y sales con esa respuesta, por favor!!

Te estoy dedicando tiempo como siempre lo hago y prueba de eso son las muchas pero muchas respuestas que tengo en este foro.

El tema es que dices que puedes enseñarme y no lo dudo pero si sabes otros lenguajes tienes el mismo criterio que en este que yo lo llamo sentido común, uno ve un código en C y salvo cuestiones propias del lenguaje muchas cosas se repiten en otros o se parecen.
Solo debes saber como se terminan las sentencias o si llevan o no llave. Y si no lo sabes usas Google como las normas te piden que hagas antes de preguntar.

Para eso no necesitas mas que un poco de ejercicio y un libro ayuda.

Esos dos cambios son suficientes. Si no funcionan es porque tienes mal tu botón/pulsador, pero como no dices como esta conectado tu botón yo debo imaginarme las cosas y lo mismo la comunidad.

Pero bueno, suerte @landom!