[Risolto] Connessione seriale non va sotto gli 800ms

mikelefree:
Ho lasciato così il timeout di default e la reattività non è cambiata di una virgola. Sembra abbia raggiunto la soluzione grazie al vostro prezioso aiuto. Ribadisco che prima di considerare chiusa la questione attendo vostro parere. :wink:

A funzionare dovrebbe funzionare, comunque mi sento di darti qualche altro piccolo suggerimento secondario. Nella parte Java tu fai:

int velocita = Math.round(speed);
byte velo = (byte) velocita;
char v = (char) velo;
arduino.serialWrite(v);

Quindi dalla variabile "speed" (di che tipo è?) fai una conversione in "long" (la Math.round() fa questo) questo long lo salvi in una variabile "int", poi la "int" la casti in un'altra variabile byte, che a sua volta riconverti in char. Non è che tu per andare da Roma a Napoli passi per Vicenza e poi Reggio Calabria, spero.. :wink:
Quindi fai prima a passare per la A1, ossia ad esempio penso tu possa fare così (non conosco bene Java, ma ci provo, e comunque non sapendo il tipo della variabile "speed" devo mantenere la round):

arduino.serialWrite((byte)Math.round(speed));

Passiamo ad Arduino:

void loop() {
  if (Serial.available() > 0) {
    V = Serial.read();
    if(V > 0 ){
      if(V > 12 ){
        digitalWrite(r1,HIGH);
        digitalWrite(r2,LOW);
      } else{
        if(V > 2 ){
          digitalWrite(r1,LOW);
          digitalWrite(r2,HIGH);
        } else {
          digitalWrite(r1,HIGH);
          digitalWrite(r2,HIGH);
        }
      }
    } 
  }
}

La variabile "V" (ma abituati ad applicare la convenzione di usare nomi che iniziano con le minuscole, le maiuscole sono in genere per le costanti e le #define :wink: ) è di tipo "byte" ossia una "unsigned" di un byte che quindi avrà valori che vanno da 0 a 255, per cui la prima if() credo che si possa ignorare.

Per le condizioni, vanno bene gli if() ovviamente ma, per pura accademia, visto che i relè funzionano a logica inversa e sapendo che per la digitalWrite LOW e HIGH sono equivalenti a 0 e 1, o anche a false e true, credo che il tuo codice sia equivalente a cose come queste (l'operatore "!" serve per la logica inversa, il resto sono le condizioni in chiaro):

byte v;

void loop() {
  if (Serial.available() > 0) 
  {
    v = Serial.read();
    // Attiva il relè 1 se v è tra 3 e 12
    digitalWrite(r1,!(v >= 3 && v <= 12));
    // Attiva il relè 2 se v è maggiore di 12
    digitalWrite(r2,!(v > 12));
    // Entrambi disattivati se v è tra 0 e 2
  }
}