Porting software su altro Hardware

Normalmente utilizzo ArduinoUno, ma per il progetto che ho in mente, mi serve il collegamento WiFi e un po più di memoria.
Ho comperato un ESP12H (non lo ho ancora fisicamente).
Mi serve il collegamento a una schedina SD per poter scrivere dei files.
Visto che la schedina in questione è da 64 Gb, ho optato per la libreria SdFat.
Qui il problema:
Se compilo il programma di esempio (che allego) con processore ArduinoUno, non mi viene generato un errore, ma se lo compilo con il processore NodeMCU..., mi viene generato questo errore:

ReadWrite:26:1: error: 'File' does not name a type; did you mean 'SdFile'?
   26 | File myFile;
      | ^~~~
      | SdFile

Codice (esempio della libreria):

#include <SPI.h>
//#include <SD.h>
#include "SdFat.h"
SdFat SD;

#define SD_CS_PIN SS
File myFile;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(SD_CS_PIN)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop() {
  // nothing happens after setup
}

Ciao! Premettiamo che puoi avere quello che ti serve con le schede arduino, puoi avere schede con più memoria, con wifi e puoi utilizzare una sd.
Non puoi usare sempre lo stesso codice, le stesse librerie, su processori diversi. A volte le librerie lavorano a basso livello utilizzando caratteristiche specifiche del processore, se cambio processore cambiano le cose. Dovresti vedere se esistono librerie specifiche per la scheda che vuoi utilizzare, anche se vedi gli esempi di utilizzo, in pratica si usano allo stesso modo, le librerie possono essere scritte in modo molto diverso.

1 Like

Chiaro. Vedo di tornare sui miei passi (Arduino).
Grazie

#include <SPI.h>
//#include <SD.h>
#include "SdFat.h"
#include "sdios.h"
using namespace sdfat;

SdFat SD;
1 Like

Risolve molto, ma errori rimangono:

ReadWrite:49:42: error: no match for 'operator=' (operand types are 'fs::File' and 'sdfat::File32')
   49 |   myFile = SD.open("test.txt", FILE_WRITE);
      |                                          ^
C:\Users\...\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/FS.h:52:7: note: candidate: 'fs::File& fs::File::operator=(const fs::File&)'
   52 | class File : public Stream
      |       ^~~~

Su consiglio di Torn24 ho cercato nella libreria scaricata per l'ESP8266 un esempio "specifico" che carica le librerie per questo processore e funziona.

Includi anche il file FS.h (dove c'è la definizione della classe File)

#include <FS.h>

Il messaggio di errore rimane lo stesso.
Di fatto la sezione degli include è così:

#include <SPI.h>
//#include <SD.h>
#include "SdFat.h"
  #include "sdios.h"
  using namespace sdfat;
SdFat SD;

  #include <FS.h>
File myFile;

Corretto o ho capito male ?
(Grazie) :grinning:

Lo devi mettere prima perché la classe File viene usata nella classe che gestisce la SD.

In maniera molto "professionale" ho provato a spostarlo in tutte le posizioni, ma nulla cambia... Abbi pazienza, riducendo all'osso:

#include <SPI.h>

#include "SdFat.h"
  #include "sdios.h"
  using namespace sdfat;
  #include <FS.h>
File myFile;
SdFat SD;

#define SD_CS_PIN SS

void setup() {
  Serial.begin(9600);
  while (!Serial) { ; }

  if (!SD.begin(SD_CS_PIN)) {
    return;
  }

  myFile = SD.open("test.txt", FILE_WRITE);

  if (myFile) {
    myFile.println("testing 1, 2, 3.");
    myFile.close();
  }

Rimane:

ReadWrite:43:42: error: no match for 'operator=' (operand types are 'fs::File' and 'sdfat::File32')
   43 |   myFile = SD.open("test.txt", FILE_WRITE);
      |                                          ^

Stai mischiando pezzi di codice dalla libreria SD.h cercando di usare invece la libreria SdFat.h che ha metodi ed oggetti diversi! Per questo non trova l'oggetto File.

Scegline una e parti dagli esempi inclusi.
Come se non bastasse manca una parentesi graffa alla fine di setup e la funzione void loop() :wink: Arduino non compila senza.

#include <SPI.h>
#include "SD.h"
 
File myFile;

#define SD_CS_PIN SS

void setup() {
  Serial.begin(9600);
  while (!Serial) { ; }

  if (!SD.begin(SD_CS_PIN)) {
    return;
  }

  myFile = SD.open("test.txt", FILE_WRITE);

  if (myFile) {
    myFile.println("testing 1, 2, 3.");
    myFile.close();
  }
}

void loop () {
  
}

Perfetto. Il prb è che la libreria SD (se ho letto bene) non supporta schedine da 64 Gb e io ho quella... Per questo avevo scelto la libreria SdFat.
Coprerò una SD da 32 Gb...

Allora parti dagli esempi della libreria SdFat. Ce ne sono una vagonata inclusi nella libreria!

1 Like

Si.
:grinning: