Lettura seriale dati su arduino Aiuto

Quello che stavi facendo secondo me va bene. Puoi inviare sequenze fisse di 5 caratteri, dove il primo è una lettera che identifica il sensore e i restanti sono la temperatura in centesimi di grado, tipo:

A1234 -> Sensore A 12.34 °C
D5678 -> Sensore D 56.78 °C

Il "problema" è che sulla seriale hai uno stream continuo di caratteri, senza inizio né fine. Ma se manteniamo la lunghezza delle stringhe fissa la gestione è semplice: tieni un buffer di 5 caratteri, lo riempi e quindi lo processi con il codice che ti ho detto prima, o usando strtol() o atoi() come suggerito da nid. In questo caso però il buffer deve essere di 6 caratteri e l'ultimo deve essere sempre '\0'.

Se non ti è chiaro qualcosa sulla gestione delle stringhe, cerca un tutorial e dagli un'occhiata. Poi chiedi per quel che ancora resta ancora oscuro, eventualmente.

Prova ad abbozzare uno sketch che fa questo e postalo.

Allora ritorniamo al tuo esempio:

io ricevo dalla seriale a111 b222 c333 d444

salvo in una variabile che si chiama: dr
poi ò str1 la variabile che memorizza la lettera e str2 la variabile che memorizza la cifra

mi puoi sviluppare il tuo esempio con il nome di queste variabili

char str2[MAX_STR];

if (str1[0] == 'a') {
strncpy (str2, str1 + 1, 5);
}

Tutto dipende dal tipo di dr. Assumo che sia una stringa stile C, quindi:

#define MAX_STR 4

char dr[MAX_STR];

Abbiamo quindi array di dimensione fissa di 4 caratteri, che dovrai riempire con quel che arriva dalla seriale. Una volta riempiti:

char str1, str2[MAX_STR] = {0};

str1 = dr[0];
strncpy (str2, dr + 1, MAX_STR - 1);

Nota che str1 è un singolo carattere, non una stringa. str2 è invece una stringa, e sarà anche terminata col classico '\0';

Sarebbe così:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define MAX_STR 4
char dr[MAX_STR];

int str2 ;
int vr; 
void setup() {
  
Serial.begin(9600);
}

void loop() {
 
 vr = Serial.read();
 

char str1, str2[MAX_STR] = {0};
str1 = dr[0];

if (str1 == "a") {
strncpy (str2, dr + 1, MAX_STR - 1);

  
  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.setCursor(3, 0);
  lcd.print(str2);
}
  
  

char str1, str2[MAX_STR] = {0};

str1 = dr[0];

if (str1 == "b") {


strncpy (str2, dr + 1, MAX_STR - 1);

  lcd.setCursor(0, 2);
  lcd.print("T2:");
  lcd.setCursor(3, 2 );
  lcd.print(str2);
  }  
}

Ci sono un po' di errori... Hai provato a compilare?

  1. La lettura della seriale è totalmente sballata. Dai un'occhiata qua.

  2. str2 è dichiarata due volte con due tipi diversi.

  3. Quando confronti str1 devi usare apici singoli, essendo un singolo carattere e non una stringa.

  4. L'indentazione e la formattazione fanno schifo, usa la formattazione automatica dell'IDE.

corretto alcuni errori ho provato a compilare ma mi da:

Arduino:1.6.7 (Windows 7), Scheda:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

C:\Users\Server\AppData\Local\Temp\arduino_389944218c90a290adf55133051df5e7\sketch_apr11a.ino: In function 'void loop()':

sketch_apr11a:31: error: redeclaration of 'char str1'

char str1, str2[MAX_STR] = {0};

^

sketch_apr11a:16: error: 'char str1' previously declared here

char str1, str2[MAX_STR] = {0};

^

sketch_apr11a:31: error: redeclaration of 'char str2 [4]'

char str1, str2[MAX_STR] = {0};

^

sketch_apr11a:16: error: 'char str2 [4]' previously declared here

char str1, str2[MAX_STR] = {0};

^

C:\Users\Server\AppData\Local\Temp\arduino_389944218c90a290adf55133051df5e7\sketch_apr11a.ino: At global scope:

sketch_apr11a:46: error: expected declaration before '}' token

}

^

exit status 1
redeclaration of 'char str1'

Questo report potrebbe essere più ricco di informazioni con
"Mostra un output dettagliato durante la compilazione"
abilitato in "File > Impostazioni"

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define MAX_STR 4
char dr[MAX_STR];
int vr;
void setup() {

  Serial.begin(9600);
}

void loop() {

  vr = Serial.read();


  char str1, str2[MAX_STR] = {0};
  str1 = dr[0];

  if (str1 == 'a') {
    strncpy (str2, dr + 1, MAX_STR - 1);


    lcd.setCursor(0, 0);
    lcd.print("T1:");
    lcd.setCursor(3, 0);
    lcd.print(str2);
  }



  char str1, str2[MAX_STR] = {0};

  str1 = dr[0];

  if (str1 == 'b') {


    strncpy (str2, dr + 1, MAX_STR - 1);

    lcd.setCursor(0, 2);
    lcd.print("T2:");
    lcd.setCursor(3, 2 );
    lcd.print(str2);
  }
}
}

Ascoltami: metti un attimo da parte questa cosa, e investi un po' di tempo a studiarti il C e le sue basi. Senza offesa, ma sicuramente così farai prima ad ottenere qualcosa, piuttosto che mettendo insieme cose a caso di cui capisci poco o niente.

Si sicuramente lo farò ma adesso ho urgentemente bisogno di questo progetto te ne sarei grato se mi aiuti a finirlo.. sono disperato veramente mi serve con urgenza.
Grazie

Una via più semplice:

int a;
int b;

if (Serial.available())
 {
    a = Serial.read();
    b = Serial.parseint(); 
 }

// a questo punto hai in a il codice del carattere ed
// in b il valore numerico


if (a == 'a')
  {
    faiqualcosa (b);
    a =0;
  }

if (a == 'b')
 {faiqualcosaltro (b);
   a = 0;
  }

ecc 
ecc

Ok grazie mille veramente paulus1969 sono riuscito a trovare la soluzione con il tuo esempio.
Grazie a tutti per la pazienza :slight_smile:

Soluzione in:

adesso provo a trasformarlo per vedere se và..