Processare dati attraverso seriale

Salve ragazzi,
sono alle prese con un problema: uno script Python manda dei dati attraverso l’interfaccia seriale di Arduino.
Questi dati devono essere trattati separatamente, alcuni servono a far attivare/disattivare un LED, altri devono essere visualizzati su schermo LCD.
Sto provando a realizzare lo sketch ma non va, potreste gentilmente aiutarmi?
Eccovi il codice:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);
char parola[6];
int numero[6];
char index[5]="pnec";
void setup() {  
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor(0,1);
  

}  
  
void loop() {  
  if (Serial.available()){
    char comp=Serial.read();
    if (comp==index[0]){
      for(int i=0; i<7; i++){
        parola[i]=Serial.read();}}
    if (comp==index[1]){
      for(int j=0; j<7;j++){
        numero[j]=Serial.read();}}
    if (comp==index[2]){
      Serial.print(parola);
      lcd.print(numero[4]);
    }
    if (comp==index[3]){
      lcd.clear();
    }
       }}

Per adesso ho mandati delle stringhe di prova tramite monitor seriale tipo:

pmamma
n12345
e

Ma nulla, dove sbaglio?

perche non fai un passettino alla volta?
fagli leggere come primo passo, una sola stringa (che siano numeri o parle non importa) e rimandala sulla seriale.

poi se vuoi mettere più cose mi sa che devi implementare un piccolo protocollo di comunicazione, ma questo è il secondo passo, all’inizio accontentati di una sola stringa :wink:

non son un espertissimo di software ma dubito d sarà mai verò:
if (comp==index[0]){
for(int i=0; i<7; i++){

questo esempio è qualcosa di estremamente basico, ma credo utile per iniziare:

void setup() {
        pinMode(11, OUTPUT);
        pinMode(10, OUTPUT);
 Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop() {

        int pippo = 0;
 // send data only when you receive data:
 if (Serial.available() > 0) {
 // read the incoming byte:
 pippo = Serial.read();
                
               // Serial.println (pippo);
              

 if (pippo == 'a') {Serial.println ("Attivo Led 1");digitalWrite (11, HIGH);}
                if (pippo == 'b') {Serial.println ("Disattivo Led 1");digitalWrite (11, LOW);}
                if (pippo == 'c') {Serial.println ("Attivo Led 2");digitalWrite (10, HIGH);}
                if (pippo == 'd') {Serial.println ("Disattivo Led 2");digitalWrite (10, LOW);}
 }
}

poi se hai bisogno di esempi anche piu complessi di comunicazione tra (QT)python e arduino, ne ho di pronti e funzionanti :slight_smile:

Grazie Martinix,
ci lavoro su!

con questo a suo tempo avevo cominciato a capire il funzionamento..poi tutto diventa chiaro :wink:

e ovviamente puoi complicarlo all'infinito!!

il programmino di cui sopra accetta SOLO singoli caratteri a , b, c.....

il prssimo passo saranno le frasi :slight_smile:

Al codice da te postato ho dichiarato un array di 4 elementi e provo a cambiarlo, quando premo il tasto n.
Ma quando dico ad Arduino di mostralo tramite seriale (tasto b), mi da -1-1-1-1.

int numero[4]={1,2,3,4};

void setup() {
        pinMode(11, OUTPUT);
        pinMode(10, OUTPUT);
 Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop() {

        int pippo = 0;
 // send data only when you receive data:
 if (Serial.available() > 0) {
 // read the incoming byte:
 pippo = Serial.read();
                
               // Serial.println (pippo);
              

 if (pippo == 'a') {Serial.println ("Attivo Led 1");digitalWrite (11, HIGH);}
                if (pippo == 'b') {Serial.println ("Disattivo Led 1");digitalWrite (11, LOW); 
                  for(int j=0; j<4;j++) {
                    Serial.print(numero[j]);}
                    Serial.println();}
                if (pippo == 'c') {Serial.println ("Attivo Led 2");digitalWrite (10, HIGH);}
                if (pippo == 'd') {Serial.println ("Disattivo Led 2");digitalWrite (10, LOW);}
 if (pippo == 'n') {for (int f=0; f<5;f++){numero[f]=Serial.read();}}
 }
}

Non riesco a capire, concettualmente, dove sbaglio.

int pippo = 0;
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
pippo = Serial.read();<------ questo diventa un array!!!

se vuoi “riepire” un array devi riempirlo prima ovvero dove ce la “variabile” pippo che deve essere un array!
ovviamente con tutti i cicli for del caso…questo era il passo 2 :wink:

void setup() {
        pinMode(11, OUTPUT);
        pinMode(10, OUTPUT);
 Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop() {

        int pippo = 0;
        int numero[4];
 // send data only when you receive data:
 if (Serial.available() > 0) {
 // read the incoming byte:
 pippo = Serial.read();
               
               // Serial.println (pippo);
              

 if (pippo == 'a') {Serial.println ("Attivo Led 1");digitalWrite (11, HIGH);}
                if (pippo == 'b') {Serial.println ("Disattivo Led 1");digitalWrite (11, LOW); 
                  for(int j=0; j<4;j++) {
                    Serial.print(numero[j]);}
                    Serial.println();}
                if (pippo == 'c') {Serial.println ("Attivo Led 2");digitalWrite (10, HIGH);}
                if (pippo == 'd') {Serial.println ("Disattivo Led 2");digitalWrite (10, LOW);}
 if (pippo == 'n') {for (int f=0; f<4;f++){numero[f]=Serial.read();}}
 }
}

Anche in questo modo non riesco a riempire il vettore numero con 4 cifre che immetto dopo la lettera n.
Forse sarebbe adatto usare in ciclo while, che si interrompe quando immetto una lettera e non un numero, per popolare l’array desiderato?

if si interronpe (false) appena il buffer è vuoto se tu mandi "1234" dopo 4 il buffer è vuoto ed esece dall if ...