scambio dati arduino - android

Ciao a tutti, mi serve capire se si può fare e come posso una funzione usando la condizione if/then. Allego Sketch arduino. Molto semplice da capire.
Allora mi spiego.
Questo Sketch si collega con un tablet android via bluetooth. il tutto mi fa funzionare un distributore del caffè usando il tablet come tastiera touch o a comandi vocali.

Al punto rilevazione presenza persona fa si che riconosce che c’è una persona vicino al distributore, se è vera la condizione a 50 cm mi parte s-voice sul tablet “con il valore 2500” dopo mi parte il comando vocale sempre sul tablet " con ll valore 3500" chiedendo che bevanda preferisce bere. Dopo che la persona dice la bevanda, parte la selezione però mi si crea nuovamente la condizione vera a 50cm di continuo. Io vorrei che si blocca fino a che il 50cm scompare o meglio deve essere superiore. In effetti dovrebbe funzionare che lo Sketch non deve eseguire la funzione if/then fin che la persona non è andata via da vicino al distributore.
Come posso fare ?
Grazie mille.

int trigger_Port = A3;
int echo_Port = A1;
int Sel1 = 11; //Collegato al relè - zucchero
int Sel2 = 12; //Collegato al relè + zucchero
int Sel3 = 8;  //Collegato al relè caffè espresso
int Sel4 = 6;  //Collegato al relè caffè lungo
int Sel5 = 13; //Collegato al relè caffè macchiato
int Sel6 = 9;  //Collegato al relè cappuccino
int Sel7 = 5;  //Collegato al relè mocaccino
int Sel8 = 7;  //Collegato al relè cappuccino cioccolato
int Sel9 = 4;  //Collegato al relè cioccolato
int Sel10 = 3; //Collegato al relè latte
int Sel11 = 10;//Collegato al relè latte macchiato
int Sel12 = 2; //Collegato al relè the

String readString;

void setup() {
  Serial.begin(9600);
  
  pinMode( trigger_Port, OUTPUT );
  pinMode( echo_Port, INPUT );
  
  pinMode(Sel1, OUTPUT); 
  pinMode(Sel2, OUTPUT);
  pinMode(Sel3, OUTPUT);
  pinMode(Sel4, OUTPUT);
  pinMode(Sel5, OUTPUT);
  pinMode(Sel6, OUTPUT);
  pinMode(Sel7, OUTPUT);
  pinMode(Sel8, OUTPUT);
  pinMode(Sel9, OUTPUT);
  pinMode(Sel10, OUTPUT);
  pinMode(Sel11, OUTPUT);
  pinMode(Sel12, OUTPUT);
  
  digitalWrite(Sel1, HIGH);
  digitalWrite(Sel2, HIGH);
  digitalWrite(Sel3, HIGH);
  digitalWrite(Sel4, HIGH);
  digitalWrite(Sel5, HIGH);
  digitalWrite(Sel6, HIGH);
  digitalWrite(Sel7, HIGH);
  digitalWrite(Sel8, HIGH);
  digitalWrite(Sel9, HIGH);
  digitalWrite(Sel10, HIGH);
  digitalWrite(Sel11, HIGH);
  digitalWrite(Sel12, HIGH);
}

void loop() {
  
  digitalWrite( trigger_Port, LOW );
  digitalWrite( trigger_Port, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( trigger_Port, LOW );
  long durata = pulseIn( echo_Port, HIGH );
  long r = 0.034 * durata / 2;
  
// FUNZIONE RILEVAMENTO PERSONA VICINO AL DISTRIBUTORE 

 if (r <= 50) {
    Serial.println("2500");
  delay(6000);  
    Serial.println("3500");
    delay(3000);
    
}
  //Serial.println( r );
  //delay( 1000 );
   
  while (Serial.available()) 
  {
    delay(3);  
    char c = Serial.read();
    readString += c; 
  }
  
  if (readString.length() >0) {
    Serial.println(readString);
    
    if (readString == "CaffeEspresso")     
    {
      digitalWrite(Sel3, LOW);
      delay(200);
      digitalWrite(Sel3, HIGH);
    }
    
    if (readString == "CaffeLungo")     
    {
      digitalWrite(Sel4, LOW);
      delay(200);
      digitalWrite(Sel4, HIGH);
    }
    
    if (readString == "CaffeMacchiato")     
    {
      digitalWrite(Sel5, LOW);
      delay(200);
      digitalWrite(Sel5, HIGH);
    }
    
    if (readString == "Cappuccino")     
    {
      digitalWrite(Sel6, LOW);
      delay(200);
      digitalWrite(Sel6, HIGH);
    }
    
    if (readString == "Mocaccino")     
    {
      digitalWrite(Sel7, LOW);
      delay(200);
      digitalWrite(Sel7, HIGH);
    }
    
    if (readString == "CappuccinoCiocco")     
    {
      digitalWrite(Sel8, LOW);
      delay(200);
      digitalWrite(Sel8, HIGH);
    }
    
    if (readString == "Cioccolato")     
    {
      digitalWrite(Sel9, LOW);
      delay(200);
      digitalWrite(Sel9, HIGH);
    }
    
    if (readString == "Latte")     
    {
      digitalWrite(Sel10, LOW);
      delay(200);
      digitalWrite(Sel10, HIGH);
    }
    
    if (readString == "LatteMacchiato")     
    {
      digitalWrite(Sel11, LOW);
      delay(200);
      digitalWrite(Sel11, HIGH);
    }
    
    if (readString == "The")     
    {
      digitalWrite(Sel12, LOW);
      delay(200);
      digitalWrite(Sel12, HIGH);
    }
    
    if (readString == "SenzaZucchero")     
    {
      digitalWrite(Sel1, LOW);
      delay(200);
      digitalWrite(Sel1, HIGH);
    }
    
    if (readString == "MoltoZucchero")     
    {
      digitalWrite(Sel2, LOW);
      delay(200);
      digitalWrite(Sel2, HIGH);
    }
    
    
    readString="";
  } 
}

Un distributore con comando vocale con il rumore che fanno le macchine e la gente dietro che parla mentre aspetta ..... "alloraaaaa zitti tutti che devo ordinare!!!"

Non per scoraggiarti, ma è un fallimento ancora prima di incominciare, fidati, è dal 1993 che ci provo e ho speso almeno 10.000.000 di £ di hardware e software più avanzato senza successo, tutto va bene se sei da solo sulla luna :slight_smile:

Ma veramente a me funziona, perchè la mattina con tutti i colleghi ci prendiamo il caffè. provato anche con la radio accesa in sottofondo. Certo che se uno ti urla mentre dici la bevanda è normale che s-voice non capisce. In più dice anche le barzellette se dopo un tot di tempo non rileva nessun movimento :-). comunque è solo un progetto in prova per passare il tempo nella pausa pranzo. il vero progetto è un altro, un po lungo da spiegare. questo del s-voice android è solo un più. e il bello che per fare il tutto ho solo speso 50 €.

Si, i miei erano altri tempi quando ho cominciato non esistevano i software free come ora si pagava tutto e caro, se devo essere sincero ho smesso pochi mesi fa perchè in ambiente normalmente vissuto da più persone il sistema smette di funzionare, per smette significa che io non devo ripetere 2 volte, per me la precisione è 1 volta, se devo dirlo 2 volte butto nel cestino tutto :slight_smile:

Tornando a te S-Voice è pittosto preciso anche con lievi disturbi ambientali te lo confermo, ma come pensi di far uscire il comando vocale "caffè macchiato" con un numero o una stringa? dato che quell'app non possiede API a parte quelle 4 applicazioni memorizzate? sei riuscito a far uscire script con S-Voice?

nemmeno google-voice (il famoso "OK GOOGLE") ha le API, ho letto da qualche parte che prossimamente google lo sviluppa rendendolo programmabile, al momento l'unico modo per usarlo e far uscire un comando tramite script è AUTOVOICE e TASKER che ho comprato giusto per provare ma che la precisione è sempre al 50% - 60% .... inacettabile, 100% se sono solo e non sono raffreddato, soprattutto se sono solo io a parlare (perchè l'app fa la calibrazione sulla tua voce)

Prima di tutto ti consiglio di usare un’apposita libreria, da’ molti meno errori, ad esempio Questa

poi, userei una variabile di stato, per sapere in quale condizione sei. Visto che con detta libreria puoi impostare una distanza max di lettura, quando il valore che riporta è zero, sai che davanti alla macchinetta non c’e’ nessuno
quindi aggiungi questo all’inizio nelle dichiarazioni

#include <NewPing.h>

#define trigger_Port  A3
#define echo_Port  A1
#define distanza_max 200 // distanza max in cm
boolean stato = false ;
NewPing sonar(trigger_Port, echo_Port, distanza_max);

e poi nel loop inizi cosi’

void loop() {
  int r = sonar.ping_cm();
  if ( r == 0 ) {
    stato = false ;
  }
  if (r > 0 && r <= 50 && stato == false) {
    stato = true ;
    Serial.println("2500");
    delay(6000);
    Serial.println("3500");
    delay(3000);
  }
 while (Serial.available())
  {
    delay(3);
    .......
    .......

e togli queste nel setup()

  pinMode( trigger_Port, OUTPUT );
  pinMode( echo_Port, INPUT );

Grazie brunello. ho modificato il programma è funziona bene.

In merito a Pablo, il tutto funziona cosi.
al momento che ti avvicini al distributore distanza < 50 cm il sensore ultrasuoni invia il segnale a arduino scrivendo sul seriale il valore 2500, questo valore viene letto dal tablet in seriale bluetooth che fa partire la voce " buon giorno desidera una bevanda ?" dopo 6 secondi arduino mi manda un altro segnale al tablet con il valore 3500 che letto dal tablet mi fa partire s-voice per ascoltare il cliente. al momento che il cliente dice la bevanda il tablet invia in seriale bluetooth a arduino la scritta della bevanda ascoltata. arduino in base a quello che legge sul seriale mi fa attivare il relè corrispondente alla selezione desiderata.
ho programmato il tablet in MIT APP inventor 2.
I valori 2500 e 3500 sono numerici perchè meglio riconosciuti con la funzione di App Inventor.
L’unica cosa che ti porta tempo e che bisogna programmare ogni tipo di richiesta del cliente.
Tipo: deve riconoscere caffè espresso , un espresso , un caffè ecc ecc per tutte le bevande.
Comunque c’è molto ancora da lavorare, il programma funziona bene con la modifica di Brunello, ma come mi è capitato oggi tipo che se ti abbassi per aprire lo sportello prelievo in automatico ti togli dai 50 cm del sensore e il tutto riparte. dovrei mettere un contatto allo sportello.
Adesso tutto questo posso configurarlo con il mio impianto domotico a casa con sintesi vocale e riconoscimnto .-).
Grazie a tutti

Non ti basta far attendere il sistema 10-15 sec dopo che la bevanda è scesa? nel frattempo l'omino si è alzato.... Un po' come fa il bancomat appena finisce un cliente ti fa aspettare prima di inserire la card, mai capito perchè!

ciao Brunello, perchè sul mio computer di casa mi da questo errore
Venezia:5: error: ‘NewPing’ does not name a type
Venezia.ino: In function ‘void loop()’:
Venezia:75: error: ‘sonar’ was not declared in this scope

che stupido che sono, scusa ho risolto. mia distrazione.