Seriale lenta.

Salve a tutti, ho realizzato lo sketch di seguito. Il mio problema è che passa circa mezzo secondo dal momento in cui gli invio il comando, al momento in cui il carattere viene visualizzato sul display del MAX 7219. Suggerimenti ?

Grazie a tutti.

#include "LedControl.h"
/*
 pin 12 connesso a DataIn 
 pin 11 connesso a CLK 
 pin 10 connesso a LOAD 
*/

LedControl barraLed=LedControl(12,11,10,1); // CREA L'OGGETTTO "barraLed" E LO INIZIALIZZA

/* we always wait a bit between updates of the display */
//unsigned long delaytime=250;

void setup() 

{
  Serial.begin (57600);
      
  barraLed.shutdown(0,false);//ESCE DALLA MODALITA' POWER-SAVING E SI ATTIVA
  barraLed.setIntensity(0,8); // SETTAGGIO LUMINOSITA'
  barraLed.clearDisplay(0); // PULISCE IL DISPLAY  
}

void loop() 

{ 
   while (Serial.available())
   {
    int a= Serial.parseInt();
    barraLed.setDigit(0,0,a,false);
   }
    
}

Prova a sostituire quel while con if

nid69ita: Prova a sostituire quel while con if

Provato, non cambia nulla, o se è cambiato è impercettibile!!!

http://arduino.cc/en/Serial/Available

if(Serial.available()>0)

nid69ita: http://arduino.cc/en/Serial/Available

if(Serial.available()>0)

Niente :drooling_face:

cosa fa barraLed.setDigit(0,0,a,false); ? Ciao Uwe

uwefed: cosa fa barraLed.setDigit(0,0,a,false); ? Ciao Uwe

Invia un numero ad un display 7-segment controllato da un MAX 7219, utilizzando la libreria LedControl. Nel caso specifico utilizza solo il primo DIGIT del display.

Ciao

Per tagliare la testa al toro, pingati indietro il valore che metti nella barra led:

void loop() { 
   while (Serial.available())  {
    int a= Serial.parseInt();
    Serial.println(a);
    barraLed.setDigit(0,0,a,false);
   } 
}

Così spedisci indietro il dato non appena lo hai ricevuto. E controlla dal ricevimento sulla seriale quanto passa prima che si accendano i led.

leo72: Per tagliare la testa al toro, pingati indietro il valore che metti nella barra led:

void loop() { 
   while (Serial.available())  {
    int a= Serial.parseInt();
    Serial.println(a);
    barraLed.setDigit(0,0,a,false);
   } 
}

Così spedisci indietro il dato non appena lo hai ricevuto. E controlla dal ricevimento sulla seriale quanto passa prima che si accendano i led.

Niente, il tempo è sempre quello. Mah, non riesco a trovare una soluzione.

Che vuol dire che il tempo è sempre quello? La scritta appare in concomitanza con la modifica ai led o cosa? Perché se così è, allora potrebbe essere la parseInt a rallentare? Prova a leggere i dati senza usare quella funzione.

Effettivamente senza il Parse il valore viene pingato immediatamente. Adesso come converto il dato inviato dalla seriale in un valore decimale: se invio "1" mi deve tornare "1" e non il suo ASCII.

Ciao e grazie.

Ho risolto così:

void loop() { 
   while (Serial.available())  
   
   { 
     
    char a = Serial.read();;
    int A = a - '0';
    //int a= Serial.read();
    Serial.println(A);
    barraLed.setDigit(0,0,A,false);
   } 
}

se ci sono soluzioni alternative tecnicamente più valide fatemelo sapere.

Ciao

Quella perseInt() per me non riceve nulla, attende tutto il tempo e poi va in timeout. Le varei parsexxx() funzionano così, aspettano (e quindi si bloccano) finchè non arriva un dato del tipo che si aspettano oppure finchè non scade il tempo di timeout (che puoi cambiare) http://arduino.cc/en/Serial/ParseInt

Dal tuo codice nulla ti dice se parseInt() a letto qualcosa.

Inoltre, in generale, la loop() è già del codice che viene ripetuto all'infinito, perciò a che diavolo serve quella while() ?

E' vero:

If no valid integer is found within one second (adjustable through Serial.setTimeout() ) a default value of 0 will be returned.

Non usandola, non mi ponevo il problema di come funzionasse ma mi era sorto il dubbio che avesse un qualche tempo minimo di attesa.