Olá pessoal! Tudo bem?
Gostaria da ajuda de vocês. Estou criando um projeto de um elevador que o comando será via Monitor Serial. A ideia é que quando digitar o valor "a" ele vai para o térreo, quando digitar o valor "b" ele vai para o primeiro andar e quando digitar o valor "c" ele vai para o segundo andar.
O problema no código abaixo é que preciso digitar duas vezes no monitor serial o valor para que funcione, gostaria de digitar apenas uma única vez. O que devo fazer? Qual o erro no código? Obrigado!
//
/Projeto Elevador com Arduino
/
//
/DEFINIÇÕES DE PINOS*/
//Define os pinos utilizados no Drive Motor L298
#define motorB1 5 //Pino 5 no B1 do L298
#define motorB2 3 //Pino 3 no B2 do L298//Define os pinos utilizados no Sensor Reed Switch
#define reed1 8 //Pino 8 - Térreo
#define reed2 7 //Pino 7 - Andar 1
#define reed3 6 //Pino 6 - Andar 2int velMotor = 200; //Define a velocidade do motor
byte botaoandar = 3; //Define andar base (Mudar para 4)
byte andar(); //Chama o valor da variável andar
unsigned long delayTempo;
String comando, botao, botAnt, comandoAnt;
/**********************************************/
/FUNÇÕES/
//Função de configurações
void setup() {
// Define os pinos do Drive Motor como saída
pinMode(motorB1, OUTPUT);
pinMode(motorB2, OUTPUT);//Define os pinos do Reed Switch como entrada
pinMode(reed1, INPUT);
pinMode(reed2, INPUT);
pinMode(reed3, INPUT);
// pinMode(reed4, INPUT);Serial.begin(9600);
}void loop() {
while (Serial.available() > 0) { //se estiver recebendo alguma coisa pela serial
Serial.println("Digite a,b ou c");
tratarSerial();//ler os dados recebido
Serial.println("Comando: " + comando);
Serial.println("Botão: " + botao);
//tratamento dos dados recebidos
if (comando == "a") {
andares();
} else if (comando == "b") {
andares();
} else if (comando == "c") {
andares();
}
}}
void tratarSerial() {
comando = ""; // reseta o valor de comando
char letra;//armazena o valor incidvual de cada caracter recebido pela serial
while (Serial.available() > 0) { //enquanto estiver recebendo algo pela serial
letra = Serial.read(); //grava a letra atual na variavel letra
if (letra != '\n') { //se a letra não for uma quebra de linha
comando.concat(letra); //junta o valor de letra à variável comando
}
delay(50);//tempo para nova leitura
}
}
void andares() {
//Andar base
if (botaoandar == 3) {
if (comando == "a") {
botaoandar = 0;
delayTempo = millis();
Serial.println("Está indo para o Térreo");
} else
if (comando == "b") {
botaoandar = 1;
delayTempo = millis();
Serial.println("Está indo para o 1 Andar");
} else
if (comando == "c") {
botaoandar = 2;
delayTempo = millis();
Serial.println("Está indo para o 2 Andar");
} else
//Se o andar for diferente de 3 o motor fica parado
if (andar() != 3) {
parado();
}
}
else {
//Se o Andar for diferente de 3...
if (andar() != 3) {
//E o botão do andar maior que o andar
if (botaoandar > andar()) {
while (botaoandar != andar()) {
sobe();
}
}//E o botão do andar menor que andar
if (botaoandar < andar()) {
while (botaoandar != andar()) {
desce();
}
}// E o botão do andar igual ao andar
if (botaoandar == andar()) {
parado();
botaoandar = 3;
}
}
}
delay(100);
}//Função de verificação do Andar atual
byte andar() {
if (digitalRead(reed1) == LOW) {
return 0;
} else if (digitalRead(reed2) == LOW) {
return 1;
} else if (digitalRead(reed3) == LOW) {
return 2;
} else {
return 3;
}
}//Função para descer o motor
void desce() {
analogWrite(motorB1, velMotor);
analogWrite(motorB2, 0);
}//Função para subir o motor
void sobe() {
analogWrite(motorB1, 0);
analogWrite(motorB2, velMotor);
}//Função com o comando de parada
void parado() {
analogWrite(motorB1, 0);
analogWrite(motorB2, 0);
}