Buongiorno a tutti, sono nuovo della community e provo a spiegarvi brevemente il problema a cui non riesco a trovare soluzione.
Per ora ipotizzo sia software in quanto, sostituendo modulo per SD e microSD il problema rimane lo stesso.
Ho 2 arduino nano che comunicano tra di loro attraverso le porte RX-TX ed attraverso i monitor verifico che si passano i dati correttamente.
In particolare lo slave, trasmette data ed ora (DS3231) irraggiamento (GY-49) e misure ambientali (BME280) tutti connessi alle porte A4 e A5.
I dati vengono stampati su un display oled anch'esso connesso alle stesse porte.
Avendo finito lo spazio sul primo nano, sono costretto ad eseguire il salvataggio dei dati con un altro arduino, che una volta ricevuti i dati dallo slave, suddivide la stringa e bufferizza i dati in un array struttura. Infine scrive su microSD.
Il modulo connesso ai pin 10,11,12,13 supera il check di inizializzazione sul pin 10, ma restituisce l'errore in fase di apertura file.
Questo è l'output del monitor seriale di arduino-ide:
microSD - OK!
d:2024/05/07 t:13:48:02 R:0.09 T:22.74 H:67.48 p:997.51 A:131.88 0 bytes
d:2024/05/07 t:13:48:07 R:0.09 T:22.75 H:67.48 p:997.51 A:131.90 0 bytes
d:2024/05/07 t:13:48:12 R:0.09 T:22.74 H:67.52 p:997.51 A:131.86 0 bytes
d:2024/05/07 t:13:48:18 R:0.09 T:22.72 H:67.56 p:997.50 A:131.94 0 bytes
d:2024/05/07 t:13:48:23 R:0.09 T:22.69 H:67.57 p:997.50 A:131.98 0 bytes
d:2024/05/07 t:13:48:28 R:0.09 T:22.70 H:67.62 p:997.49 A:132.05 0 bytes
d:2024/05/07 t:13:48:33 R:0.09 T:22.71 H:67.63 p:997.49 A:132.07 0 bytes
d:2024/05/07 t:13:48:38 R:0.09 T:22.71 H:67.63 p:997.50 A:131.96 0 bytes
d:2024/05/07 t:13:48:43 R:0.09 T:22.70 H:67.63 p:997.47 A:132.25 0 bytes
d:2024/05/07 t:13:48:48 R:0.09 T:22.70 H:67.64 p:997.50 A:131.94 0 bytes
d:2024/05/07 t:13:48:53 R:0.09 T:22.69 H:67.65 p:997.47 A:132.20 0 bytes
d:2024/05/07 t:13:48:58 R:0.09 T:22.70 H:67.67 p:997.47 A:131.99 0 bytes d: t: R:0.00 T:0.00 H:0.00 p:0.00 A:-0.00 0 bytes
Errore apertura file dati.
d:2024/05/07 t:13:49:08 R:0.09 T:22.70 H:67.70 p:997.46 A:132.33 0 bytes
d:2024/05/07 t:13:49:13 R:0.09 T:22.69 H:67.71 p:997.47 A:132.17 0 bytes
...
Come si vede dai secondi, il master passa da 13:48:58 a 13:49:08 quindi ha perso i dati delle 13:49:03 (che lo slave ha acquisito) perché in quell'istante deve anche scrivere (è arrivato a 12 righe).
Potrebbe essere questa la causa?
Vi ringrazio intanto per i consigli che mi fornirete.
Resto in ascolto.
Ho modificato questa parte di codice per evitare la sovrapposizione della scrittura con il passaggio dati.
if (i<nRow) {
delay(5000);
} else {
delay(1000);
Ora non perde la stringa, ma da comunque errore di apertura file.
L'errore lo da solo in modalità WRITE, perchè con READ restituisce il size del file "data.txt"
Non ho idea del motivo per cui gli oggetti stringa sono sbagliati.
Magari se hai voglia, puoi spiegarmi il motivo o darmi dei link su cui apprendere.
Per esempi della libreria, a cosa ti riferisci ?
Se può aiutare a comprendere, il problema della scrittura è iniziato quando ho iniziato a bufferizzare i dati nell'array struttura.
Quando scrivevo su microSD ad ogni ciclo, tutto andava liscio.
Intanto vedo di capire qualcosa sulla ricezione asincrona di dati.
Questo è l'output se scrivo diretto senza allocare il dato nella array struttura:
microSD - OK!
i:1 c:1 d:2024/05/07 t:22:19:37 R:0.06 T:22.79 H:72.62 p:998.46 A:123.87 s:156bytes
Scrittura dati su microSD
i:2 c:2 d:2024/05/07 t:22:19:42 R:0.06 T:22.79 H:72.62 p:998.41 A:124.20 s:208bytes
Scrittura dati su microSD
i:3 c:3 d:2024/05/07 t:22:19:47 R:0.06 T:22.79 H:72.60 p:998.45 A:123.90 s:260bytes
Scrittura dati su microSD
apro il file per leggere
apro il file per scrivere (sempre nello stesso loop)
scrive
Per quanto riguarda il programma aggiornato, cioè quando mi chiedevi ti togliere la parte in cui legge per calcolare da dimensione del file, ho semplicemente commentato queste righe:
digita o incolla il codice qui // controlla la dimensione del file salvato
//dataFile = SD.open("data.txt", FILE_READ);
//dataFile = SD.open(fileName, FILE_READ);
Serial.print(" ");
Serial.print("s:");
//Serial.print(dataFile.size());
Serial.println("bytes");
//dataFile.close();
Più la ram che si prende la libreria SD forse arrivi a superare i 2048 byte, tieni conto che c'è anche lo stack che si riempie con quelle variabili locali.
Così per prova anziché nRow = 12, nRow = 2.
Se funziona prova ad aumentarlo fino a che smette di funzionare.
Con nRow=2 funziona. Ecco dove era il problema.
Grazie.
Per ora funziona e ringrazio tutti.
Se poi qualcuno vuole darmi lezioni di stile su come andrebbe fatta una comunicazione "canonica" io sono pronto ad ascoltare.
Buongiorno a tutti,
torno nuovamente sulla questione discussa, precedentemente.
Provo a spiegare brevemente la mia esigenza:
arduino slave legge i dati dai sensori e li passa al master
Serial.print(...); sullo slave -> String receivedData = Serial.readStringUntil('\n'); sul master
il master li scrive su un file txt e controlla la dimensione del file (lo uso per verificare l'avvenuta scrittura dei dati)
a questo punto vorrei chi la dimensione del file, venga passato allo slave che lo stampa sul display oled.
Se uso la stessa sintassi del punto 1. non visualizzo i dati.
Serial.println(...); sul master -> String receivedData = Serial.readStringUntil('\n'); sullo slave
Quindi ricapitolando:
slave passa i dati a master
master li elabora
master li ripassa a slave
Come si fa il punto 3? Grazie.
Dovrebbe funzionare in ambo i due sensi, forse può essere che dimentichi di aggiungere un serial.print('\n') alla fine, ma mi pare strano. Vedi se puoi scrivere uno sketch separato inserendo l'essenziale per la comunicazione (due sketch).
Serial.println(); credo sia equivalente a Serial.print('\n');
Proverò comunque uno sketch separato.
Se può aiutare, ho provato anche SoftwareSerial sui pin D2 e D3, ma senza risultati positivi.
SoftwareSerial mySerial(2, 3); // RX, TX
mySerial.begin(9600);
while (mySerial.available() == 0) {
// Attendi
}
// Leggi la stringa ricevuta
String receivedData = mySerial.readStringUntil('\n');
int sizeIndex = receivedData.indexOf("s:");
if (sizeIndex >= 0) {
// Estrarre la temperatura e convertirla in float
String sizeStr = receivedData.substring(sizeIndex + 2);
int size = sizeStr.toInt)
// Invia il dato elaborato ad Arduino 1
mySerial.println(size);