Ciao a tutti, ho bisogno del vostro aiuto.
Questo è un codice per gestire una sbarra automatizzata (tipo parcheggio) con relativa fotocellula (è un modellino). La sbarra è mossa da un piccolo servomotore.
#include <Servo.h>
#include <SoftwareSerial.h>
Servo myservo;
int input = 'n';
int pos = 0;
int giu = 75, su = 160;
int pinFoto = 14;
boolean discInterrotta = false;
unsigned long tempoDiscesa = 0;
SoftwareSerial ser(2, 3);
void setup() {
Serial.begin(9600);
ser.begin(9600);
pinMode(12, OUTPUT);
pinMode(pinFoto, INPUT);
digitalWrite(12, HIGH);
digitalWrite(pinFoto, LOW);
myservo.attach(11);
myservo.write(giu);
delay(2000);
}
void loop() {
if (Serial.available()) {
input = Serial.read();
}
if (ser.available()) {
input = ser.read();
}
while (input == 'y' ) {
if (discInterrotta == false){
salita(giu);
delay(5000);
}
if (digitalRead(pinFoto) == LOW) {
while (digitalRead(pinFoto) == LOW) {}
tempoDiscesa = millis();
delay(4000);
}
discInterrotta = discesa();
if (discInterrotta == false)
input = 'n';
else
delay(4000);
}
}
void salita(int posIniziale) {
for (pos = posIniziale; pos <= 160; pos++) {
myservo.write(pos);
delay(15);
}
}
boolean discesa() {
pos = 160;
while (pos >= 75 and digitalRead(pinFoto) == HIGH) {
myservo.write(pos);
delay(15);
pos--;
Serial.println(digitalRead(pinFoto));
}
if (digitalRead(pinFoto) == LOW){
salita(pos);
return true;
}
else
return false;
}
Cerco di spigare... in sostanza il while gestisce la sbarra: quando si entra nel while la sbarra si alza ecc... e Arduino rimane nel while fino a quando la sbarra non è ritornata alla posizione di riposo. Non vi descrivo la logica perchè non è rilevante.
Come vedete, il comando per azionare il cancello, è in realtà una lettura da seriale. Al momento utilizzo sia la Serial0 che una seriale software, che di fatto è un modulo HC05. Il problema è il seguente: se digito il carattere 'y' da tastiera o lo invio via bluetooth la sbarra si alza (fin qui tutto ok); se mentre la sbarra è ancora in azione (Arduino è nel while) invio ancora il carattere 'y', dopo che la sbarra è tornata in posizione di riposo, subito si rialza ed effettua tutta la procedura un altra volta.
In sostanza vorrei che, quando la sbarra è in azione, il "telecomando" venga ignorato. Sinceramente credevo di avere già gestito questo caso, lasciando if(Serial.available()) fuori dal while.
Spero di avere esposto bene il problema... sapete darmi qualche dritta?
Grazie come sempre.