Go Down

Topic: Sensor pir añadir un nuevo pin con mas tiempo. (Read 208 times) previous topic - next topic

novelino



Un saludo y gracias por la ayuda que me podáis prestar.

Perdón por si la pregunta no esta en su lugar, aunque no sea excusa, es mi primera interacción en un foro.


Encender luces de la habitación, esto funciona como quiero.


Code: [Select]


#define PIR 2 //Establece el pin 2 para el sensor PIR
#define rele 3 //Establece el pin 3 para el relé
 
int tiempo = 15000; //Tiempo que suena la alarma
boolean sensor; //Variable que almacena el estado del sensor (activado/desactivado)
 
void setup()
{
  pinMode(PIR,INPUT); //Establece el pin del sensor como entrada
  pinMode(rele,OUTPUT); //Establece el pin del relé como salida
}
 
void loop()
{
  sensor=digitalRead(PIR); //Guarda el estado del sensor en la variable
  if(sensor==HIGH) //Si el sensor es activado entra en el bucle
  {
    digitalWrite(rele,HIGH); //Activa la alarma
    delay(tiempo); //Espera el tiempo definido en la variable "tiempo"
    digitalWrite(rele,LOW); //Desconecta la alarma
  }
}




Ahora quiero añadir un relé nuevo para que este mas tiempo, pero aunque al compilar no da error, una vez cargado no hace nada, ni tampoco ejecuta el que funciona.

Código que falla:

Code: [Select]


#define PIR 2 //Establece el pin 2 para el sensor PIR
#define rele1 3 //Establece el pin 3 para el relé1
#define rele2 4 //Establece el pin 4 para el relé2
 
int tiempo1 = 15000; //Tiempo que suena la alarma
int tiempo2 = 30000; //Tiempo que suena la alarma
boolean sensor; //Variable que almacena el estado del sensor (activado/desactivado)
 
void setup()
{
  pinMode(PIR,INPUT); //Establece el pin del sensor como entrada
  pinMode(rele1,OUTPUT); //Establece el pin del relé como salida
  pinMode(rele2,OUTPUT); //Establece el pin del relé como salida
}
 
void loop()
{
  sensor=digitalRead(PIR); //Guarda el estado del sensor en la variable
  if(sensor==HIGH) //Si el sensor es activado entra en el bucle
  {
    digitalWrite(rele1,HIGH); //Activa la alarma
    delay(tiempo1); //Espera el tiempo definido en la variable "tiempo"
    digitalWrite(rele1,LOW); //Desconecta la alarma
  }
  {
    digitalWrite(rele2,HIGH); //Activa la alarma
    delay(tiempo2); //Espera el tiempo definido en la variable "tiempo"
    digitalWrite(rele2,LOW); //Desconecta la alarma
  }
}



Gracias de nuevo.

surbyte

Hilo movido del foro en inglés donde solo se puede escribir en ese idioma al foro que corresponde.
Lee las Normas del foro.

ArduMyth

#2
Sep 23, 2018, 12:21 am Last Edit: Sep 23, 2018, 12:52 am by ArduMyth
Fíjate en tu código...

[...]
   if(sensor==HIGH)
  {
    digitalWrite(rele1,HIGH); //Activa la alarma
    delay(tiempo1); //Espera el tiempo definido en la variable "tiempo"
    digitalWrite(rele1,LOW); //Desconecta la alarma
  }
  {

    digitalWrite(rele2,HIGH); //Activa la alarma
    delay(tiempo2); //Espera el tiempo definido en la variable "tiempo"
    digitalWrite(rele2,LOW); //Desconecta la alarma
  }
[...]
Unas llaves abiertas y cerradas tras el if() pero sin una estructura. No da error de compilación pero es evidente que está mal.

Respecto a lo de usar dos delay para los relés a ver cómo lo planteas o qué necesitas porque veo en unos días nuevo post preguntando por qué se solapan y no funciona correctamente.
delay() no es una función de tiempo, delay es parar TODO tu arduino, el tiempo es sólo un parámetro de dicha función. Sé que eres nuevo pero es el error habitual de caaada día ¡Ojo con esto a la hora de programar!
Revisa la función millis() para el uso de timers.
En el foro además, en la documentación y luego tutoriales tienes un tema dedicado a ello.

Por cierto entiendo que estás empezando pero tienes que comprender la diferencia entre las variables locales y las globales, porque veo que para ti todo deben ser globales, aparte que sobra tanto código que te animo a ir leyendo y buscando más ejemplos de programación :)

Edito (adaptación de tu código):
Code: [Select]

#define PIR   2
#define rele1 3
#define rele2 4
 
#define tiempo1 15000
#define tiempo2 30000

void setup(){
  pinMode(PIR,   INPUT);
  pinMode(rele1,OUTPUT);
  pinMode(rele2,OUTPUT);
}
 
void loop(){
  bool sensor = digitalRead(PIR);
  digitalWrite(sensor ? rele1 : rele2, HIGH);
  delay(sensor ? tiempo1 : tiempo2);
  digitalWrite(sensor ? rele1 : rele2, LOW);
}


Un saludo.

novelino

Gracias por la respuesta.
 
Probare el código y seguiré investigando.

Para próximas consultas, que seguro las habrá, como posteo en el foro en español?

Gracias de nuevo.

ArduMyth

Google: "foro Arduino español"

Enlace directo: https://forum.arduino.cc/index.php?board=32.0

Desde la web: https://forum.arduino.cc/ >>International >> Español

novelino

Gracias por la info, administrador.

Supongo que como ya esta movido puedo seguir preguntando por aquí, si no es así me corregís.

ArduMyth, gracias por tu respuesta pero no hace nada, no se si tendré que modificar algún parámetro en tu esquetch, (seguro que por culpa mía) seguiré leyendo.

Mientras tanto he modificado el que tenia de antes que no funcionaba nada y he conseguido que se se encienda una' este 15 segundos y después se encienda la otra 30 segundos.

Code: [Select]


#define PIR 2 //Establece el pin 2 para el sensor PIR
#define rele1 3 //Establece el pin 3 para el relé1
#define rele2 4 //Establece el pin 4 para el relé2
 
int tiempo1 = 15000; //Tiempo que esta encendido el led
int tiempo2 = 30000; //Tiempo que esta encendido el led
boolean sensor; //Variable que almacena el estado del sensor (activado/desactivado)
 
void setup()
{
  pinMode(PIR,INPUT); //Establece el pin del sensor como entrada
  pinMode(rele1,OUTPUT); //Establece el pin del relé como salida
  pinMode(rele2,OUTPUT); //Establece el pin del relé como salida
}
 
void loop()
{
  sensor=digitalRead(PIR); //Guarda el estado del sensor en la variable
  if(sensor==HIGH) //Si el sensor es activado entra en el bucle
  {
    digitalWrite(rele1,HIGH); //Activa la alarma
    delay(tiempo1); //Espera el tiempo definido en la variable "tiempo"
    digitalWrite(rele1,LOW); //Desconecta la alarma
   
  if(sensor==HIGH) //Si el sensor es activado entra en el bucle
 
    digitalWrite(rele2,HIGH); //Activa la alarma
    delay(tiempo2); //Espera el tiempo definido en la variable "tiempo"
    digitalWrite(rele2,LOW); //Desconecta la alarma
  }
}



Como hago para que se enciendan a la vez?

ArduMyth

#6
Sep 23, 2018, 06:15 pm Last Edit: Sep 23, 2018, 06:17 pm by ArduMyth
Claro, por partes. Yo asumí que dado el error en las llaves lo que te faltaba era un ELSE, porque si cómo nos pones ahora lo que iba era exactamente la misma condición mucho sentido no hay ya que es el MISMO if()
No tiene sentido decir if(sensor){} if(sensor){} Es la misma condición, usa 1.

Lo del tiempo se veía venir. Cómo ya te dije se debe a que estás usando delay() Tienes que hacer un timer con la función millis().

Go Up