Inviare una stringa da seriale

Ciao a tutti, sto facendo la mia tesina per la maturità e una possibiltà(che dovevo appunto collaudare) era quella di semicontrollare un braccio robot attraverso la voce. Il programma da utilizzare mi è venuto in mente mentre studiavo italiano l altro giorno (dragon naturally speaking) così mi sono precipitato a programmare un po' ed effettivamente è una cosa possibile che non pensavo fosse così intuitiva. il mio problema sta nell' inviare ad arduino da computer, attraverso il serial monitor una parola, o meglio una stringa in modo che a seconda della parola lui faccia una serie di azioni. ho provato ad inviare un solo carattere e funziona ma appena ne metto due eccco che non capisce più nulla(si sa che non è colpa dell ardu ma del programmatore che è una enorme pippa :cold_sweat: ).
in ogni caso vi chiedo gentilmente se conoscete un metodo per inviare una stringa all' arduino via serial.read o non so ,magari anche a pacchetti non so prima il 1°carattere poi il 2° e così via , ad esempio max 6 caratteri e arduino legge sempre quei sei caratteri. Vi ringrazio in anticipo.
questo è un codice che si trova in giro e al posto di a dovrei metterci una stringa

int led=101;
int a;

void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
}

void loop()
{
if (Serial.available() > 0) {
a = Serial.read();
if (a == '1') {
digitalWrite(led, HIGH);
}
}
if (a == '2') {
digitalWrite(led, LOW);
}
}

Lucailvec:
Ciao a tutti, sto facendo la mia tesina per la maturità e una possibiltà(che dovevo appunto collaudare) era quella di semicontrollare un braccio robot attraverso la voce. Il programma da utilizzare mi è venuto in mente mentre studiavo italiano l altro giorno (dragon naturally speaking) così mi sono precipitato a programmare un po' ed effettivamente è una cosa possibile che non pensavo fosse così intuitiva. il mio problema sta nell' inviare ad arduino da computer, attraverso il serial monitor una parola, o meglio una stringa in modo che a seconda della parola lui faccia una serie di azioni. ho provato ad inviare un solo carattere e funziona ma appena ne metto due eccco che non capisce più nulla(si sa che non è colpa dell ardu ma del programmatore che è una enorme pippa :cold_sweat: ).
in ogni caso vi chiedo gentilmente se conoscete un metodo per inviare una stringa all' arduino via serial.read o non so ,magari anche a pacchetti non so prima il 1°carattere poi il 2° e così via , ad esempio max 6 caratteri e arduino legge sempre quei sei caratteri. Vi ringrazio in anticipo.
questo è un codice che si trova in giro e al posto di a dovrei metterci una stringa

int led=101;
int a;

void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
}

void loop()
{
if (Serial.available() > 0) {
a = Serial.read();
if (a == '1') {
digitalWrite(led, HIGH);
}
}
if (a == '2') {
digitalWrite(led, LOW);
}
}

ciao,
GINGARDU aveva ovviato al problema, cerca il topic (è recente).
Mi potresti passare il codice che hai fatto per dragon naturally speaking (10.1??? è la versione che ho) visto che volevo fare un progettino carino.....

a grazie mille adesso cerco meglio perchè prima ho cercato in quelli recenti ma non avevo trovato nulla che mi interessasse , per dragon comunque la parta "intuitiva" sta nel fatto che basta parlare lui scrive e poi dici accapo e lui lo invia (poi vedrò di non utilizzare l' ide d'arduino per colloquiare via seriale ma magari un programmino in python dove non serve dire "invio" per inviare sulla seriale.
Se riesci a mettermi il link del topic mi fai un immenso favore grazie in anticipo.

Lucailvec:
a grazie mille adesso cerco meglio perchè prima ho cercato in quelli recenti ma non avevo trovato nulla che mi interessasse , per dragon comunque la parta "intuitiva" sta nel fatto che basta parlare lui scrive e poi dici accapo e lui lo invia (poi vedrò di non utilizzare l' ide d'arduino per colloquiare via seriale ma magari un programmino in python dove non serve dire "invio" per inviare sulla seriale.
Se riesci a mettermi il link del topic mi fai un immenso favore grazie in anticipo.

al momento non trovo il topic e devo fare pure i compiti :frowning:

Prova con questo:

int led=101;
int a;
const unsigned long TimeOut = 10;                    // timeout 10 ms
unsigned long T = 0;                                 // timer

String SerRx;                                        // buffer ricezione

void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}

void loop() {

SerRx = "";                                     // azzera buffer ricezione

  T = millis();                                   // timer partito

  while (millis() - T < TimeOut) {                // attesa timeout
    while (Serial.available() > 0) {              // ricezione da Serial Monitor
      SerRx += char(Serial.read());               // aggiungi carattere al buffer
      T = millis();                               // reset timer 
    }
  }

  SerRx.trim();                                   // elimina spazi iniziali e finali
  SerRx.toUpperCase();                            // converti in maiuscolo

  if (SerRx == "ON") digitalWrite(led, HIGH);
  else if (SerRx == "OFF") digitalWrite(led, LOW);
  else if (SerRx == "XXX") <altra azione>;
  else if (SerRx == "ABC") <altra azione>;


}

Ettore Massimo Albani

Grazie mille troppo gentile :slight_smile: pero non ho capito una cosa perché quando metti i caratteri dentro la stringa di ricezione fai += ? Ponendolo uguale non fai la stessa cosa ? Ma soprattutto perché eliminiamo gli spazi iniziali e finali ? =( piango ancora della mia ignoranza ....

x += y è una forma contratta per x = x+y
Usando le stringhe la somma equivale alla concatenazione, per cui "A" + "B" = "AB"

Gli spazi iniziali e finali vengono eliminati perché " A" (nota lo spazio iniziale) non è uguale a "A". La prima è una stringa composta dai caratteri ASCII 32 e 65, la seconda solo dal carattere ASCII 65.

aaaaaaaaaaaa ecco perchè leggendo i valori inviati mi dava quei numeri li D: grazie ancora tanto fra un po' tornerò sicuro hahaha