ARDUINO COM MÓDULO BLUETOOTH

Pessoal o seguinte,

Estou desenvolvendo um projeto de automação residencial via bluetooth, para isso estou utilizando o Arduino Uno com o módulo bluetooth e o celular.

Quando realizo acionamentos dos leds pelo celular o programa logo responde, mas ao tentar girar um motor simulando o portão automático, o motor começa a funcionar mas não obedece a parada no sensor de fim de curso, e continua acionado sem deixar o programa fazer mais nada.

Segue meu código:

int controlevelocidade = 3;//variável que irá controlar o motor PWM
int readBluetooth;//Variável que irá receber o valor enviado do celular para o bluetooth
int lamp1 = 7;
int lamp2 = 6;
int lamp3 = 5;
int lamp4 = 4;
int motor1 = 8;
int motor2 = 9;
int sensor1 = 10;
int sensor2 = 11;
int estado_motor1;
int estado_motor2;
int e;
int f;

boolean statelamp1 = false;
boolean statelamp2 = false;
boolean statelamp3 = false;
boolean statelamp4 = false;
void fechar (void);
void abrir (void);
void setup() {
Serial.begin(9600);//Inicia Comunicação Serial e a velocidade de comunicação.
pinMode(lamp1, OUTPUT);
pinMode(lamp2, OUTPUT);
pinMode(lamp3, OUTPUT);
pinMode(lamp4, OUTPUT);
pinMode(controlevelocidade, OUTPUT);
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);

}

void loop()
{

int velocidade = 500;
analogWrite(controlevelocidade, velocidade);
estado_motor1 = digitalRead(sensor1);
estado_motor2 = digitalRead(sensor2);

if (Serial.available() > 0) { //Obtém o número de bytes disponíveis para leitura na porta serial
readBluetooth = Serial.read(); //Valor lido na Serial será guardado na variável readBluetooth
if (readBluetooth == 'a') {
if (statelamp1) {
digitalWrite(lamp1, LOW);
statelamp1 = false;
}
else {
digitalWrite(lamp1, HIGH);
statelamp1 = true;
}
}

if (readBluetooth == 'b') {
if (statelamp2) {
digitalWrite(lamp2, LOW);
statelamp2 = false;
}
else {
digitalWrite(lamp2, HIGH);
statelamp2 = true;
}
}
if (readBluetooth == 'c') {
if (statelamp3) {
digitalWrite(lamp3, LOW);
statelamp3 = false;
}
else {
digitalWrite(lamp3, HIGH);
statelamp3 = true;
}
}
if (readBluetooth == 'd') {
if (statelamp4) {
digitalWrite(lamp4, LOW);
statelamp4 = false;
}
else {
digitalWrite(lamp4, HIGH);
statelamp4 = true;
}
}

if (readBluetooth == 'e') {
e = readBluetooth;

}

if (readBluetooth == 'f') {
f = readBluetooth;

}
}

if (e == 'e')
{
abrir();
}

if (f == 'f')
{
fechar();
}

}

void abrir() {

while (!estado_motor1 == HIGH)
{
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
}
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
}

void fechar() {

while (!estado_motor2 == HIGH)
{
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
}
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
}

O teu problema é que colocas o teu código dentro dum while até que a variável estado_motor mude. No entanto, não tens código nenhum para mudar o estado dessa variável...

Já se fizesses algo como:

void abrir() {

  while (( estado_motor1 = digitalRead(sensor1)) == LOW)
  {
    digitalWrite(motor1, LOW);
    digitalWrite(motor2, HIGH);
  }
    digitalWrite(motor1, LOW);
    digitalWrite(motor2, LOW);
  }


void fechar() {

  while ((estado_motor2 = digitalRead(sensor2)) == LOW)
  {
    digitalWrite(motor1, HIGH);
    digitalWrite(motor2, LOW);
  }
    digitalWrite(motor1, LOW);
    digitalWrite(motor2, LOW);
  }

No entanto, eu acho que essa maneira de programar o que pretendes não é boa.

Porque não chamar a função abrir que apenas muda o estado das saídas e activa uma variável a notificar que o motor está ligado e depois meteres uma condição que se o motor estiver activado e o fim de curso também, o motor pára.

humm...

Vou tentar aqui

Obrigado!