Dubbio con Seriale

Ciao a tutti, ho bisogno del vostro aiuto…

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(2, 3);

void setup() {
  Serial.begin(9600); //set baud rate
  bluetooth.begin(9600); //set baud rate
 
 }

void loop() {

  if (bluetooth.available()) {
    input = bluetooth.read();
    Serial.println(input);
    
  }
 

  if (bluetooth.available()) {
    //codice
  }
}

Attualmente utilizzo questo codice e noto che il corpo del primo if viene eseguito tranquillamente, mentre nel secondo if Arduino non entra. Essendo un principiante sicuramente sto sbagliando qualcosa. Logicamente non mi sembra ci sia qualcosa di sbagliato, semplicemente ripeto il controllo sulla disponibilità della porta seriale.
Inoltre, se non chiedo troppo, potreste dirmi la differenza tra if (bluetooth.available()) e while(bluetooth.available())? Quando usare uno e quando usare l’altro?

Grazie…

Se non ci entra più è perché la condizione non è più verificata. In effetti nel primo if fai una read(), che svuota il buffer e dunque non ci sono più dati available.

Cosa vuoi fare di preciso? Non puoi mettere tutto nello stesso if?

Al momento potrei mettere tutto nello stesso if, ma successivamente potrei avere bisogno di più if. Sto realizzando un plastico di una casa domotica. Su un'applicazione android ci sono due pulsanti (al momento) che servono per comandare due punti luce. Io farei un if per ogni pulsante, all'interno di esso ci sarà la bluetooth.read() e in base all'input la lampadina sarà accesa o spenta. Spero di essermi spiegato. Quindi se ho ben capito posso fare un solo if(bluetooth.available()) nel loop?

La read() legge ogni volta un nuovo carattere. Se devi fare una serie di if sempre sullo stesso, la fai una volta, salvi il risultato in una variabile e fai tutti gli if che vuoi su tale variabile.

Grazie mille... Credo di avere capito, vi invio il codice sistemato appena posso.

Ho usato il seguente codice e funziona tutto a dovere. I punti luce vengono comandati sia da app che da pulsante fisico.

#include <SoftwareSerial.h>

// VARIABILI COMUNI PER ANTIRIMBALZO ---------------------------------------------------------
int attesaDebounce = 50;
//-----------------------------------------------------------------------
// LOCALE CUCINA ---------------------------------------------------------
const int pulsanteCucina = 8, releCucina = 9; //pin
//Variabili per antirimbalzo
int cucina_pulsanteStato, cucina_ultimaLettura = LOW;
unsigned long cucina_ultimoTempoDebounce = 0;
//-----------------------------------------------------------------------
// LOCALE SALA ---------------------------------------------------------
const int pulsanteSala = 7, releSala = 10; //pin
//Variabili per antirimbalzo
int sala_pulsanteStato, sala_ultimaLettura = LOW;
unsigned long sala_ultimoTempoDebounce = 0;
//-----------------------------------------------------------------------

int input;
SoftwareSerial bluetooth(2, 3);

void setup() {
  Serial.begin(9600); //set baud rate
  bluetooth.begin(9600); //set baud rate
  pinMode(releCucina, OUTPUT);
  pinMode(releSala, OUTPUT);
  pinMode(pulsanteCucina, INPUT);
  pinMode(pulsanteSala, INPUT);
  digitalWrite(releCucina, LOW);

}

void loop() {

  if (bluetooth.available()) {
    input = bluetooth.read();
    switch (input) {

      case 'M':
        digitalWrite(releCucina, !digitalRead(releCucina));
        if (digitalRead(releCucina) == HIGH)
          bluetooth.write("*LR0G247B0*");
        else
          bluetooth.write("*LR255G0B0*");
        break;

      case 'Y':
        digitalWrite(releSala, !digitalRead(releSala));
        if (digitalRead(releSala) == HIGH)
          bluetooth.write("*KR0G247B0*");
        else
          bluetooth.write("*KR255G0B0*");
        break;
    }//chiusura switch
  }//chiusura if


  //Accensione mediante pulsante fisico
  leggiPulsCucina();
  leggiPulsSala();


}


void leggiPulsCucina() {
  int lettura = digitalRead(pulsanteCucina);
  if (lettura != cucina_ultimaLettura)
    cucina_ultimoTempoDebounce = millis();
  if ((millis() - cucina_ultimoTempoDebounce) > attesaDebounce) {
    if (lettura != cucina_pulsanteStato and lettura == HIGH) {
      digitalWrite(releCucina, !digitalRead(releCucina));
      if (digitalRead(releCucina) == HIGH)
        bluetooth.write("*LR0G247B0*");//invio all'app il colore verde

      else
        bluetooth.write("*LR255G0B0*");//invio all'app il colore verde
    }
    cucina_pulsanteStato = lettura;
  }
  cucina_ultimaLettura = lettura;
}

void leggiPulsSala() {
  int lettura = digitalRead(pulsanteSala);
  if (lettura != sala_ultimaLettura)
    sala_ultimoTempoDebounce = millis();
  if ((millis() - sala_ultimoTempoDebounce) > attesaDebounce) {
    if (lettura != sala_pulsanteStato and lettura == HIGH) {
      digitalWrite(releSala, !digitalRead(releSala));
      if (digitalRead(releSala) == HIGH)
        bluetooth.write("*KR0G247B0*");

      else
        bluetooth.write("*KR255G0B0*");
    }
    sala_pulsanteStato = lettura;
  }
  sala_ultimaLettura = lettura;
}

Cosa ne dite? Ovviamente usando dei pulsanti come interruttori ho dovuto realizzare un antirimbalzo software. In base allo stato della luce (accesa o spenta) Arduino manda un feedback all’app sulla quale è presente un segnale luminoso (Verde=luce accesa Rosso=luce spenta).

Bravo, hai recepito il suggerimento e ne sei uscito con una soluzione elegante, che fa anche uso di switch, cosa buona e giusta.

Per il resto, a me non piacciono i costrutti del tipo:

digitalWrite(releCucina, !digitalRead(releCucina));

Io preferisco avere delle mie variabili (tipo boolean cucinaAcceso, che inverto e vado a scrivere sulle uscite all'occorrenza.

digitalWrite(releCucina, !digitalRead(releCucina));

non funziona su tutti gli Arduino. Sulla Due per esempio non funziona.

Ciao Uwe

Uwe, ho capito a cosa ti riferisci, ma invece credo che funzioni. Il core dovrebbe sopperire.

EDIT: Vedi qua.

Grazie... al momento non ho altri quesiti... il progetto prosegue e sicuramente mi farò sentire ancora.