Riconoscere parole su seriale

Ciao a tutti,vorrei che arduino riconoscesse delle parole inviate sulla seriale e che in base alla parola letta faccia diverse cose come accendere led diversi,come posso fare?Grazie in anticipo

Guarda, se fai un po' di ricerche, sia qui che su Google, trovi decine di esempi, altrimenti ...
... devi ricevere tutta la stringa in un "buffer" e farne il "parsing".

In pratica devi imparare ad usare le stringhe classiche del C ... ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h>.

Un indizio ... la migliore funzione per fare il parsing è la strtok() assieme alla strcmp() :wink:

Guglielmo

Grazie,le studierò un pò☺

Potresti utilizzare anche la libreria textfinder.
Ecco il link della libreria.

Guarda se tiri fuori qualcosa da questo esempio

/*
  Example of processing incoming serial data without blocking.
  Author:   Nick Gammon
*/

const unsigned int MAX_INPUT = 30; // Numero Max di caratteri della stringa

byte ricevuto = 0 ;
unsigned long start_lampeggio ;
int lampeggio = 0 ;
byte led_state = 0 ;

// Stringhe da digitare
const char str1[] = "lampeggia veloce" ;
const char str2[] = "lampeggia piano" ;
const char str3[] = "accendi luce" ;
const char str4[] = "spegni luce" ;


void setup ()  {
  Serial.begin (9600);
  pinMode(13 , OUTPUT);
  digitalWrite(13, LOW);
}

// Questo processo viene eseguito quando la stringa è stata ricevuta
void process_data (const char * data) {
  Serial.print (">>  ");
  Serial.println (data);
  if (strcmp (data, str1 ) == 0 ) ricevuto = 1 ;
  if (strcmp (data, str2 ) == 0 ) ricevuto = 2 ;
  if (strcmp (data, str3 ) == 0 ) ricevuto = 3 ;
  if (strcmp (data, str4 ) == 0 ) ricevuto = 4 ;
} 

void processIncomingByte (const byte inByte)
{
  static char input_line [MAX_INPUT];
  static unsigned int input_pos = 0;
  switch (inByte)  {
    case '\n':   // end of text
      input_line [input_pos] = 0;  // terminating null byte
      // terminator reached! process input_line here ...
      process_data (input_line);
      // reset buffer for next time
      input_pos = 0;
      break;
    case '\r':   // discard carriage return
      break;
    default:
      // keep adding if not full ... allow for terminating null byte
      if (input_pos < (MAX_INPUT - 1))
        input_line [input_pos++] = inByte;
      break;
  }
}

void loop()  {
  if (Serial.available () > 0)
    processIncomingByte (Serial.read ());

  switch (ricevuto) {
    case 1 :
      Serial.println("Lampeggio veloce");
      lampeggio = 200 ;
      start_lampeggio = millis();
      ricevuto = 0 ;
      break;
    case 2 :
      Serial.println("Lampeggio lento");
      lampeggio = 1000 ;
      start_lampeggio = millis();
      ricevuto = 0 ;
      break;
    case 3 :
      digitalWrite(13, HIGH);
      Serial.println("Luce accesa");
      lampeggio = 0 ;
      ricevuto = 0 ;
      break;
    case 4 :
      digitalWrite(13, LOW);
      Serial.println("Luce spenta");
      lampeggio = 0 ;
      ricevuto = 0 ;
      break;
    default:
      ricevuto = 0 ;
  }

  if (lampeggio > 0 ) {
    if ( millis() - start_lampeggio > lampeggio ) {
      led_state = !led_state ;
      digitalWrite(13, led_state) ;
      start_lampeggio = millis();
    }
  }
}

Questo video ti potrebbe chiarire un po di idee oltre ovviamente ai consigli dati da gpb01 :slight_smile:

link video