Como se envian comandos a un arduino uno mediante bluetooth

Hola, Tengo un problema.
Quiero hacer un código que cuando yo escriba, por ejemplo, "si" en el monitor en serie, este active un void especifico y cuando escriba "no" no active nada.
Hasta ahora tengo el código de un servo pero al escribir en el monitor en serie no pasa nada.

Este es el código:

#include <Servo.h>

Servo Servo_Shoot;
float distancia = 0;
int pos = 0; 

int option;

void setup() {
  Servo_Shoot.attach(9);  // Es para decir que el servo va en el pin 9
  Servo_Shoot.write(0); //El servo empieza en la posicion 0°
  Serial.begin(9600); // // Serial Communication is starting with 9600 of baudrate speed
  Serial.println("Torreta..."); // print some text in Serial Monitor
  delay(6000);
  Serial.println("Iniciando sensor:");
  delay(6000);  
}

void loop() {
  if (Serial.available()>0){
    option=Serial.read();
    if(option=='Si'){
     servo1(pos);
     Serial.println("Disparando");
    }
    if(option=='No'){
      Serial.println("Apagando");
    }
  }
}

void servo1 (float pos){
    for (pos = 0; pos  <= 110; pos += 1) {
    Servo_Shoot.write(pos); 
    delay(20); 
  }
    for (pos = 110; pos >= 0; pos -= 110) { 
    Servo_Shoot.write(pos);  
    delay(3);     
  }
  }

También tengo otra parte del código que tiene distintos void, pero al momento de agregarlos todos al void loop() el arduino va leyendo uno por uno los void, cuando necesito que lea todos los void al mismo tiempo.

Hola, tienes un error al declarar la variable option como entero, ya que por el puerto serie solo trasmites caracteres o strings, simplificando tu codigo, prueba el siguiente ejemplo y ves como se puede hacer.

char option;

void setup() {

  Serial.begin(9600); // // Serial Communication is starting with 9600 of baudrate speed
  Serial.println("Torreta..."); // print some text in Serial Monitor
  delay(2000);
  Serial.println("¿comando S / N ?");
  delay(1000);
}

void loop() {
  if (Serial.available() > 0) {
    option = Serial.read();
    if (option == 'S') {
      Serial.println("Disparando");
    }
    if (option == 'N') {
      Serial.println("Apagando");
    }
  }
}

Saludos.

Gracias, me funciono bien y ahora creo que se como añadir mas comandos.

Aparte de este problema tenia otro problema con este código:

#include <Servo.h>
#include "ESC.h"
#define Vel_Min (1000) 
#define Vel_Max (2000)

Servo Servo_Shoot;
float distancia = 0;
int pos = 0;

Servo Servo_Rotate;


ESC myESC (10, Vel_Min, Vel_Max, 500);   
int oESC;  

long Duracion;
int dist; 

int cm = 0;

float Leerdistancia(int triggerPin, int echoPin){ 

  pinMode(triggerPin, OUTPUT);  
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  return 0.01723 * pulseIn(echoPin, HIGH);
}

void setup() {
  Servo_Shoot.attach(9);  
  Servo_Shoot.write(0);
  Servo_Rotate.attach(11);  
  Servo_Rotate.write(90); 
  myESC.arm(); 
  Serial.begin(9600);
  Serial.println("Torreta...");
  delay(2000);
}

void loop() {
  distancia = Leerdistancia(2, 3);
  Serial.print (distancia); 
  Serial.println("cm");
  delay(10);
  servo2(pos);
  servo1(pos);
  motor1(oESC);
}

void servo1 (float pos){
  if (dist < 90){
    for (pos = 0; pos  <= 110; pos += 1) {
    Servo_Shoot.write(pos); 
    delay(20); 
  }
    for (pos = 110; pos >= 0; pos -= 110) { 
    Servo_Shoot.write(pos);  
    delay(3);     
  }
  }
  else if (dist > 91){
    for (pos = 0; pos <= 1; pos +=1){
      Servo_Shoot.write(pos);
      delay(1);
    }
  }
}

void servo2 (float pos) {
  for (pos = 90; pos  <= 180; pos += 1) {
    Servo_Rotate.write(pos); 
    delay(20); 
  }
  for (pos = 180; pos >= 0; pos -= 1) { 
    Servo_Rotate.write(pos);  
    delay(20);      
  }
  for (pos = 0; pos <= 90; pos +=1) {
    Servo_Rotate.write(pos);
    delay(20);
  }
}


void motor1 (float dis) {
  for (oESC = Vel_Min; oESC <= Vel_Max; oESC += 1) { 
    myESC.speed(oESC); 
    delay(10);
  }
  delay(1000);
  for (oESC = Vel_Max; oESC >= Vel_Min; oESC -= 1) { 
    myESC.speed(oESC);
    delay(10);   
   }
  delay(50); 
}

El problema es que al subir el codigo al arduino, se enciende primero el sensor y se apaga, luego se enciende el servo2 y se apaga, y asi pasa con todos los componentes.

¿Hay alguna forma de hacer que el sensor este siempre encendido o que todo este encendido al mismo tiempo?

Hola. Vamos a ver el programa funciona correctamente pero lo que pasa es que es un programa de prueba para el harware que estas usando.
Si no me equivoco ahora mismo cada cierto tiempo te escribe una distancia en pantalla, despues marea de un lado a otro un servo, despues el otro, y despues el motor va de 0 a maxima velocidad y a pararse otra vez, ¿no es cierto?,
Bien ahora te toca a ti programar como quieres que se comporte cada elemento en función de la distancia medida y supongo que del resultado del comando recibido según la anterior pregunta.
Pero si quieres pararlo de momento, comenta las lineas que llaman a los servos y motor:

  //servo2(pos);
  //servo1(pos);
  //motor1(oESC);

Y se quedara funcionando solo el sensor mostrandote la distancia en el PC.
Saludos

Logre que funcionaran los servos y el motor con el sensor. Ahora se enciende el sensor e imprime la distancia, luego se enciende el servo 1 si detecta algo menor a 75cm y después el motor1 con el mismo parámetro.
Ahora necesito que se quede encendido el motor1 cuando detecte algo menor a 75cm y luego, con el motor1 aun encendido, se active el código del servo1.
No se como lograr esto, he probado con distintos códigos pero nunca funcionan simultáneamente.

Este es el código que estoy usando ahora:

#include <Servo.h>
#include "ESC.h"
#define Vel_Min (1000) 
#define Vel_Max (2000)

Servo Servo_Shoot;
float distancia = 0;
int pos = 0; 

Servo Servo_Rotate;


ESC myESC (10, Vel_Min, Vel_Max, 500);                 
int oESC;   

long Duracion; 
int dist; 

char option;
int cm = 0;

float Leerdistancia(int triggerPin, int echoPin){ 

  pinMode(triggerPin, OUTPUT);  
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  return 0.01723 * pulseIn(echoPin, HIGH);
}

void setup() {
  Servo_Shoot.attach(9); 
  Servo_Shoot.write(0);
  Servo_Rotate.attach(11); 
  Servo_Rotate.write(90);
  myESC.arm();  
  Serial.begin(9600); 
  Serial.println("Encendiendo torreta"); 
  delay(2000);
  Serial.println("¿Quieres disparar? S / N");
  delay(5000);  
}

void loop() {
  if (Serial.available()>0){
    option=Serial.read();
    if(option=='S'){
    distancia = Leerdistancia(2, 3);
    Serial.print (distancia); 
    Serial.println("cm"); 
    delay(100);
    //servo2(pos);
    servo1(pos);
    motor1(oESC);
    //Serial.println("¿Disparar de nuevo? S / N");
    } 
    if(option=='N'){
      Serial.println("Apagando");
    }
  }
}


void servo1 (float pos){
  if (distancia <= 75){
    Serial.println("Objetivo Encontrado"); 
    for (pos = 0; pos  <= 110; pos += 1) {
    Servo_Shoot.write(pos); 
    delay(20); 
  }
    for (pos = 110; pos >= 0; pos -= 110) { 
    Servo_Shoot.write(pos);  
    delay(3);     
  }
  }
  else if (distancia > 76){
    for (pos = 0; pos <= 1; pos +=1){
      Servo_Shoot.write(pos);
      delay(1);
    }
  }
}

void servo2 (float pos) {
  for (pos = 90; pos  <= 180; pos += 1) {
    Servo_Rotate.write(pos); 
    delay(20); 
  }
  for (pos = 180; pos >= 0; pos -= 1) { 
    Servo_Rotate.write(pos);  
    delay(20);      
  }
  for (pos = 0; pos <= 90; pos +=1) {
    Servo_Rotate.write(pos);
    delay(20);
  }
  }


void motor1 (float dis) {
  if (distancia <= 75){
    Serial.println("Disparando");
  for (oESC = Vel_Min; oESC <= Vel_Max; oESC += 1) { 
    myESC.speed(oESC); 
    delay(10); 
  }
  delay(1000);
  for (oESC = Vel_Max; oESC >= Vel_Min; oESC -= 1) {
    myESC.speed(oESC); 
    delay(10); 
   }
  delay(50); 
  }
  else if (distancia > 76){
    Serial.println("No hay objetivos");
  }
}

Si ya, se mueven, ¿pero es asi como quieres que se muevan?.
Mira en primer lugar tienes un tremendo lio entre variables locales y globales asi como llamar a las funciones. Tal como lo tienes, por ejemplo: servo1(pos); llamas a la funcion servo pasandole la variable pos para que haga algo con ella, bien... pero es global... la has definido al principio, la funcion servo1 ya la conoce.
void servo1 (float pos) . Fabuloso, recoges lo que le mandas, le cambias el formato de int a float y haces con ella lo que te da la gana en los for sin considerar lo que le has mandado.!!!¡¡¡
Ahora en serio, mirate esos temas de variables y llamadas a funciones que andas un poco flojo en ellos.
A ver si esto es lo que quieres hacer, fijate en como trato lo anteriormente dicho, cambia lo que he comentado en el codigo y pregunta lo que no entiendas, (por cuestiones personales estoy muy interesado en el tema) y te contestare a lo que sea .



#include <Servo.h>
//#include "ESC.h"
#define Vel_Min (1000)
#define Vel_Max (2000)

Servo Servo_Shoot;
float distancia = 0;
int pos;

Servo Servo_Rotate;


//ESC myESC (10, Vel_Min, Vel_Max, 500);
int oESC;
int triggerPin = 2;
int echoPin = 3;
long Duracion;
int dist;
char option;
int cm = 0;

float Leerdistancia() {  
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);  
  return 0.01723 * pulseIn(echoPin, HIGH);
}

void setup() {
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Servo_Shoot.attach(9);
  Servo_Rotate.attach(11);  
  Servo_Rotate.write(0);  
  //  myESC.arm();
  Serial.begin(9600);
  Serial.println("Encendiendo torreta");
  delay(2000);
  Servo_Shoot.write(60);
  Servo_Shoot.write(120);
  Servo_Shoot.write(90);
}

void loop() {  
  Serial.println("¿Quieres disparar? S / N");
  delay(5000);
  if (Serial.available() > 0) {
    option = Serial.read();
    if (option == 'S') {
      servo1();
      //servo2(pos);      
      //motor1(oESC);
      //Serial.println("¿Disparar de nuevo? S / N");
    }
    if (option == 'N') {
      Serial.println("Apagando");
      delay (10000);//O lo que quieras
    }
  }
}

  
  void servo1(){    
    for (int x = 90; x <= 180; x ++) {
      Servo_Shoot.write(x);
      distancia = Leerdistancia();
      if (distancia <= 75) {pos = x;}
      delay(3);
    }
    Servo_Shoot.write(90);
    for (int x = 90; x >= 0; x --) {      
      Servo_Shoot.write(x);
      distancia = Leerdistancia();
      if (distancia <= 75) {pos = x;}
      delay(3);
    }
   Servo_Shoot.write(pos); 
   Serial.println("Objetivo Encontrado");
   //Preguntas, disparas o lo que quieras
  }
/*
void servo2 (float pos) {
  for (pos = 90; pos  <= 180; pos += 1) {
    Servo_Rotate.write(pos);
    delay(20);
  }
  for (pos = 180; pos >= 0; pos -= 1) {
    Servo_Rotate.write(pos);
    delay(20);
  }
  for (pos = 0; pos <= 90; pos += 1) {
    Servo_Rotate.write(pos);
    delay(20);
  }
}


void motor1 (float dis) {
  if (distancia <= 75) {
    Serial.println("Disparando");
    for (oESC = Vel_Min; oESC <= Vel_Max; oESC += 1) {
      myESC.speed(oESC);
      delay(10);
    }
    delay(1000);
    for (oESC = Vel_Max; oESC >= Vel_Min; oESC -= 1) {
      myESC.speed(oESC);
      delay(10);
    }
    delay(50);
  }
  else if (distancia > 76) {
    Serial.println("No hay objetivos");
  }
}
*/

Lo que va comentado es porque no tengo un esc y solo me he limtado a menear la torreta.
Saludos.

char option;

void setup() {

Serial.begin(9600); // // Serial Communication is starting with 9600 of baudrate speed
Serial.println("Torreta..."); // print some text in Serial Monitor
delay(2000);
Serial.println("¿comando S / N ?");
delay(1000);
}

void loop() {
if (Serial.available() > 0) {
option = Serial.read();
if (option == 'S') {
Serial.println("Disparando");
}
if (option == 'N') {
Serial.println("Apagando");
}
}
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.