problema con codigo

Estoy agregandole un sensor pir a mi proyecto para hacer una alarma simple.
el codigo me funciono, el problema es que quiero activar la alarma con un boton. Ahora estoy probando con el monitor serial. por ejemplo quiero mandar una "a" o un numero y que recien empieze a detectar movimiento y encienda un led al detectar. este es el codigo.

const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
int option;

// variables will change:
int buttonState = 0; // variable para leer el estado del boton

void setup() {
  Serial.begin(9600);
// led como salida:
pinMode(ledPin, OUTPUT);
// sensor como entrada:
pinMode(buttonPin, INPUT);
}

void loop(){
option=Serial.read();
    if(option=='a') {
buttonState = digitalRead( buttonPin);

if (buttonState == HIGH) {

digitalWrite(ledPin, HIGH);
}
else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
    }
}

Alguna ayuda? Alguna respuesta?

hola lucas, si lo habia visto pero vi tal desorden en el código que esperaba que alguien lo atacara primero. Dejame ver y lo posteo acá mas tarde.

No entiendo, dices que funciona, pero no entiendo lo que quieres hacer. Cuando envias 'a' se debe activar el funcionamiento?

const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
int option;

// variables will change:
int buttonState = 0; // variable para leer el estado del boton
boolena Alarma = false;
void setup() {
  Serial.begin(9600);
  // led como salida:
  pinMode(ledPin, OUTPUT);
  // sensor como entrada:
  pinMode(buttonPin, INPUT);
}

void loop(){
 
  if (Serial.available() > 0) {
     option = Serial.read();
        if (option == 'a') {
            Alarma = true;
        }
        // agregar codigo que apague Alarma por ejemplo
        if (option == 'b') {
            Alarma = false;
        }
        if (Alarma) 
            detectarMovimeinto();
  }
} 

void detectarMovimiento () {
     buttonState = digitalRead( buttonPin);
     if (buttonState == HIGH) {
        digitalWrite(ledPin, HIGH);
     } else {
        // turn LED off:
        digitalWrite(ledPin, LOW);
     }
}

Asi es surbyte, quiero que se active el uso del sensor al enviar un codigo. Como cualquier alarma. no quiero encender el arduino y que empieze a detectar, quiero que detecte cuando se active digamos la alarma

Acabo de probar tu codigo y no me funciona amigo, mando la 'a' y el led 13 del arduino queda encendido siempre

Intente muchas cosas! no puedo lograr y parece algo tan simple, lo unico que quiero es que el ensor de movimiento trabaje cuando yo lo determine, como cualquier alarma, uno pone el codigo y se activan todos los sensores, o la uelve a poner y se desactiva todo.
Surbyte no me funciona el codigo que me mandaste

const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
char option;

// variables will change:
int buttonState = 0; // variable para leer el estado del boton
boolean Alarma = false;
void setup() {
  Serial.begin(9600);
  // led como salida:
  pinMode(ledPin, OUTPUT);
  // sensor como entrada:
  pinMode(buttonPin, INPUT);
}

void loop(){
 
  if (Serial.available() > 0) {
     option = Serial.read();
        if (option == 'a') {
            Alarma = true;
        }
        // agregar codigo que apague Alarma por ejemplo
        if (option == 'b') {
            Alarma = false;
        }
        if (Alarma) 
            detectarMovimiento();
  }
} 

void detectarMovimiento () {
     buttonState = digitalRead( buttonPin);
     if (buttonState == HIGH) {
        digitalWrite(ledPin, HIGH);
     } else {
        // turn LED off:
        digitalWrite(ledPin, LOW);
     }
}

Y que es lo que no funciona, si presionas a funciona el detector de acuerdo a lo que detecte, y si presionas b deja de funcionar
Tenias razón, leve error.

Code: [Select]


const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
char option;

// variables will change:
int buttonState = 0; // variable para leer el estado del boton
boolean Alarma = false;
void setup() {
  Serial.begin(9600);
  // led como salida:
  pinMode(ledPin, OUTPUT);
  // sensor como entrada:
  pinMode(buttonPin, INPUT);
}

void loop(){
 
  if (Serial.available() > 0) {
     option = Serial.read();
        if (option == 'a') {
            Alarma = true;
        }
        // agregar codigo que apague Alarma por ejemplo
        if (option == 'b') {
            Alarma = false;
        }
  }
  if (Alarma)  // debe estar fuera de la consulta del serial.read
     detectarMovimiento();

}

Ahora si funciona, pero b no hace nada, cual era el leve error?

le agregue digitalWrite(ledPin,LOW); y quedo funcionando, muchas gracias!

 if (option == 'b') {
            Alarma = false;
            digitalWrite (ledPin,LOW);
        }
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
char option;

// variables will change:
int buttonState = 0; // variable para leer el estado del boton
boolean Alarma = false;
void setup() {
  Serial.begin(9600);
  // led como salida:
  pinMode(ledPin, OUTPUT);
  // sensor como entrada:
  pinMode(buttonPin, INPUT);
}

void loop(){
 
  if (Serial.available() > 0) {
     option = Serial.read();
        if (option == 'a') {
            Alarma = true;
        }
        // agregar codigo que apague Alarma por ejemplo
        if (option == 'b') {
            Alarma = false;
            digitalWrite (ledPin,LOW);
        }
  }
  if (Alarma)  // debe estar fuera de la consulta del serial.read
     detectarMovimiento();

} 
void detectarMovimiento () {
     buttonState = digitalRead( buttonPin);
     if (buttonState == HIGH) {
        digitalWrite(ledPin, HIGH);
     } else {
        // turn LED off:
        digitalWrite(ledPin, LOW);
     }
}

Cuando debe prender el LED? Donde lo pusiste no esta bien, o al menos no me parece
El LED no prende apaga con el PIR? porque lo apagas con una tecla?
O es para asegurarse que quede apagado?

el led enciende cuando hay movimiento, con el boton b no deberia detectar pero me quedaba encendido el led13, por eso le agregue eso para que si queda encendido lo apague

no es eso lo que hice.
a activa el pir y en el PIR tu tenias esto, que prendiera o apagara si leia un HIGH

buttonState = digitalRead( buttonPin);
     if (buttonState == HIGH) {
        digitalWrite(ledPin, HIGH);
     } else {
        // turn LED off:
        digitalWrite(ledPin, LOW);
     }

O sea, si el PIR no esta en HIGH y esta en LOW debe apagar el LED.
Confirma eso.
Presiona 'a' y prueba a ver si prende y apaga, si no apaga tenemos algo mal.

Solo debe prender al detectar movimiento pero luego debe apagar, de lo contrario tu PIR no trabaja como piensas, y tal vez sea un LATCH.

si prende y apaga, pero si esta prendido y lo apago se quedaba encendido,si esperaba a que se apague y apretaba b quedaba apagado, para asegurarme puse el digitalwrite

ahh bueno.. ahora comprendo. y estaba bien que asi lo hiciera. Y esta bien que le agregaras eso.

aqui agregue al codigo completo. le quise agregar la libreria del servo para controlar el servo, y se relantiza todo, saco la libreria y la configuracion correspondiente del servo y anda de 10.

#include <SoftwareSerial.h> //Librería que permite establecer comunicación serie en otros pins
#include <Servo.h>   
//Aquí conectamos los pins RXD,TDX del módulo Bluetooth.
SoftwareSerial BT(52,53); //10 RX, 11 TX.
Servo miservo; 
int angulo=0; 
int ledred=3; //Pin LED Red
int ledgreen=5;//Pin LED Green
int ledblue=6; //Pin LED Blue
boolean Alarma = false;
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
char option;
int buttonState = 0; // variable para leer el estado del boton
int pinSpeaker = 10;
 
void setup()
{
 
   BT.begin(9600);  //Velocidad del puerto del módulo Bluetooth
   miservo.attach(9);
   pinMode(pinSpeaker, OUTPUT);
   pinMode(12,OUTPUT);
   pinMode(11,OUTPUT);   
   pinMode(9,OUTPUT);
   pinMode(8,OUTPUT);
   pinMode(7,OUTPUT);
   pinMode(ledblue,OUTPUT);
   pinMode(ledgreen,OUTPUT);
   pinMode(4,OUTPUT);
   pinMode(ledred,OUTPUT);
   pinMode(ledPin, OUTPUT);
   pinMode(buttonPin, INPUT);
}
 
void loop()
{
        
    char c=BT.read();
        if(c=='2') {
        Alarma = true;
        }
        // agregar codigo que apague Alarma por ejemplo
        if (c== '3') {
        Alarma = false;
        digitalWrite (ledPin,LOW);
        } 
         if(c=='4'){ 
         miservo.write(angulo);
         delay(5000);
         miservo.write(90);
         angulo=constrain(angulo,0,90);
         }
         if(c=='5'){
         digitalWrite(11,HIGH);
         }
         if(c=='6'){
         digitalWrite(10,HIGH);
         }
         if(c=='7'){
         digitalWrite(9,HIGH);
         }
         if(c=='8'){
         digitalWrite(8,HIGH);
         }     
         if(c=='9'){
         digitalWrite(7,HIGH);
         } 
         if(c=='a'){
         digitalWrite(4,HIGH);
         } 
         if(c=='b'){
         digitalWrite(4,LOW);
         } 
         if(c=='c') {
         digitalWrite(13,LOW);
         }
         if(c=='d') {
         digitalWrite(12,LOW);
         }
         if(c=='e'){
         digitalWrite(11,LOW);
         }
         if(c=='f'){
         digitalWrite(10,LOW);
         }
         if(c=='g'){
         digitalWrite(9,LOW);
         }
         if(c=='h') {
         digitalWrite(8,LOW);
         }
         if(c=='i') {
         digitalWrite(7,LOW); 
         }
         if(c=='j') {
         digitalWrite (ledred,LOW);
         digitalWrite (ledgreen,LOW);
         digitalWrite (ledblue,LOW);
         }
         if(c=='k'){
         digitalWrite (ledred,HIGH);
         digitalWrite (ledgreen,LOW);
         digitalWrite (ledblue,LOW);
         }
         if(c=='l'){
         digitalWrite (ledred,LOW);
         digitalWrite (ledgreen,HIGH);
         digitalWrite (ledblue,LOW);
         }
         if(c=='m') {
         digitalWrite (ledred,LOW);
         digitalWrite (ledgreen,LOW);
         digitalWrite (ledblue,HIGH);
         }
         if(c=='n'){
         digitalWrite (ledred,HIGH);
         digitalWrite (ledgreen,LOW);
         digitalWrite (ledblue,HIGH);
         }
         if(c=='o'){
         digitalWrite (ledred,HIGH);
         digitalWrite (ledgreen,HIGH);
         digitalWrite (ledblue,LOW);
         }
         if(c=='p'){
         digitalWrite (ledred,LOW);
         digitalWrite (ledgreen,HIGH);
         digitalWrite (ledblue,HIGH);
         }
         if(c=='q') {
         digitalWrite (ledred,HIGH);
         digitalWrite (ledgreen,HIGH);
         digitalWrite (ledblue,HIGH);
         }
         if (Alarma)  // debe estar fuera de la consulta del serial.read
     detectarMovimiento();
        
    
}

Hola.
Si no vas a necesitar el monitor serial, tal vez agilizará el funcionamiento usar el serial hardware (pines 0 y 1), en lugar del software para conectar el bluetooth. Ten en cuenta que tanto softwareserial como servo van a inducir bastantes interrupciones en la ejecución, y creo que además ambas utilizan timers del arduino, con lo que no sé si no estarán interfiriéndose mutuamente.

lo que necesito usar es el modulo de bluetooth, estoy usando un arduino mega

Razón de más para no usar softwareserial. El arduino mega tiene Serial: 0 (RX) and 1 (TX); Serial1: 19 (RX) and 18 (TX); Serial2: 17 (RX) and 16 (TX); y Serial3: 15 (RX) and 14 (TX). Quita el #include y el SoftwareSerial BT(52,53), conecta el bluetooth a los pines de Serial1, 2 o 3, y sustituye todos los "BT" de tu código por Serialx (x es el número de serial que hayas elegido. Puedes utilizar buscar y reemplazar).
Prueba y cuenta :wink: