Buonasera, ho provato a cercare nel forum e altrove ma non ho trovato nulla di a me comprensibile o che facesse pienamente al caso mio.
Illustro il problema: voglio creare una centralina di acquisizione dati, ho letture da vari sensori che salvo su SD tramite OpenLog (SparkFun OpenLog - DEV-13712 - SparkFun Electronics) quindi scrivendo i valori tramite Serial.print.
Inoltre vorrei visualizzare i valori su uno schermo LCD TFT però per velocizzare il ciclo e aumentare il numero di letture dei sensori, lo schermo deve essere gestito da un altro Arduino che dovrebbe leggere i valori tramite la comunicazione che invio a OpenLog e scriverli.
Come devo impostare lo sketch sia sull'Arduino che scrive sia su quello che riceve?
Ho provato anche utilizzando l'esempio"ReadASCIIString" dell'IDE di arduino, con ParseInt() e ParseFloat() riesco a fare quello che mi serve ma solo se scrivo da monitor seriale, se provo a fare l'invio da un altro Arduino non mi appare nulla.
l'arduino che riceve i dati:
void setup() {
Serial1.begin(9600);
Serial.begin(9600);
}
void loop() {
while (Serial1.available() > 0) {
float red = Serial1.parseFloat();
int green = Serial1.parseInt();
int blue = Serial1.parseInt();
if (Serial1.read() == '\n') {
Serial.print(red);
Serial.print(",");
Serial.print(green);
Serial.print(",");
Serial.println(blue);
}
}
}
l'Arduino che manda i dati:
float a = 22.23;
int b = 24;
int c = 25;
void setup()
{
Serial.begin(9600); // connessione con il monitor seriale
}
void loop()
{
Serial.print(a);
Serial.print(",");
Serial.print(b);
Serial.print(",");
Serial.print(c);
Serial.println();
delay(2000);
}
Penso di aver risolto così (per ora mi funziona, devo provare non appena riesco a montare il tutto
ARDUINO RICEVENTE
float red;
int green;
int blue;
void setup() {
Serial.begin(9600);
}
void loop() {
// if there's any serial available, read it:
while (Serial.available() > 0) {
if (Serial.find("a") == true) {
red = Serial.parseFloat();
green = Serial.parseInt();
blue = Serial.parseInt();
}
// look for the newline. That's the end of your sentence:
if (Serial.read() == '\n') {
Serial.print(red);
Serial.print(",");
Serial.print(green);
Serial.print(",");
Serial.println(blue);
}
}
}
ARDUINO che invia
float a = 22.23;
int b = 24;
int c = 25;
void setup()
{
Serial.begin(9600); // connessione con il monitor seriale
}
void loop()
{
Serial.print("a");
Serial.print(a);
Serial.print(",");
Serial.print(b);
Serial.print(",");
Serial.print(c);
Serial.print('\n');
}
Tu "spari" sulla seriale continuamente sempre gli STESSI valori, senza alcuna pausa! Se proprio vuoi farlo, o ci metti un delay o li mandi una volta all'inizio ossia solo nel setup().
Quarto, tu mandi solamente '\n' come separatore, e dato che il monitor seriale manda invece '\r' '\n' è sempre consigliabile restare nello standard:
Il Serial.available() non è necessario se usi Serial.find() in quanto se trova la "a" significa che "qualcosa" c'è nel buffer e se trova la "a" restituisce true, ma dipende se a te interessa "fermarti" in attesa dell'input o meno.
Poi " == true" è superfluo comunque, basta fare quindi: