Invio dati SD Arduino a cellulare tramite bluetooth

Ciao a tutti,
visto che più di qualcuno mi ha chiesto info su come avevo implementato l’invio di dati da SD di Arduino a cellulare tramite bluetooth posto i codici: quello di Arduino salva i dati acquisiti tramite accelerometro e li salva su SD (una versione più complessa preleva anche data e mac address del bluetooth dal cellulare e li scrive nel file ma la devo prendere da altro pc), quello per connettersi al cell e trasmettere i dati è un’app sviluppata con AppInventor. Il file creato sul cellulare è molto grande perchè salva un byte per ogni riga perchp la comunicazione tramite bluetooth è seriale, ma si può sistemare semplicemente da AppInventor (io non ci ho più “giocato” quindi è rimasto così)… o se qualcuno riesce a migliorare il codice meglio ancora!!
Spero vi possa essere utile come voi avete sempre aiutato me :wink:

Mic

#include <SPI.h>
#include <SD.h>
#include <SoftwareSerial.h>
///storage/sdcard0/Bluetooth
// dichiarazione variabili accelerometro
int pinX = A0;
int pinY = A1;
int pinZ = A2;
// frequenza aggiornamento accelerometro 400Hz-> 2.5ms
// valori accelerometro: max 760 min 263 midi 512

int X;
int Y;
int Z;

// settaggi per bluetooth
int rxPin = 2;
int txPin = 3;
SoftwareSerial bluetooth(rxPin, txPin);

// settaggio per SD
const int chipSelect = 10; // CS su pin 10
File dataFile;

//settato a 1 per richiedere password ed avviare la scrittura (alla prima accensione)
int sw = 0;

// menu
char swMenu = 'h';
//Serial.println("Writing...");

// password per settaggio bluetooth
String passwd = "Tommaso2011";

// contatore di secondi da accensione
//unsigned long sec = millis();  // i dati di tipo int utilizzano 2 byte con primo bit dedicato al segno quindi quando si arriva 1111111111111110 diventa numero negativo, il long utilizza 4 byte

void setup(){

    // SERIAL MONITOR
    Serial.begin(9600);
    analogReference(EXTERNAL);
  
    // SDCard
    if (!SD.begin(chipSelect)) {
        //Serial.println("Card failed or not present"); // LED BLU per indicare il failed
        swMenu = 'a';
        bluetooth.println(swMenu);
        return;
    }

	if (SD.exists("DATALOG.LOG")) {
		SD.remove("DATALOG.LOG");
	}

    // BLUETOOTH
    bluetooth.begin(9600); // 9600 baud rate -> 1s
                            // 1200 baud rate -> 833micros (1/1200)
}
  
void loop() {
	
	bluetooth.println(swMenu);
	readSensor();

	if (sw == 0) {
		passWD();
	} else {
		if (bluetooth.available() > 0) {

			byte command = bluetooth.read();

			if (command == '0') {
				swMenu ='b';
				bluetooth.println(swMenu);
				//Serial.println("Reading datalog.log...");
				readSD();
			} else if (command == '1') {
				sw = 0; // si disabilita il download dei dati quando si disconnette il dispositivo
				// altrimenti restano attivi
			}
		}
	}

    delay(1000); // il bluetooth riceve un comando al secondo

} // fine loop

int passWD() { // richiede la password, se ok avvia la scrittura (per il primo avvio)
    
    ////////////////bluetooth.println("Insert the password for starting the software.");
    //Serial.println("Insert the password for starting the software.");
    String stringApp = "";

	if (bluetooth.available()) {
	///////////if (Serial.available()) {
        
        byte command;
        do {
          command = bluetooth.read();
          //////////////command = Serial.read();
          if (command != 255 and command != 64) { 
            //Serial.println(char(command));
            stringApp += char(command);
          }
        } while (command != '@');

        //bluetooth.println(stringApp); solo per leggere la password inserita
        //Serial.println(stringApp);

        if (stringApp == passwd) {

			sw = 1; // se la password corrisponde avvia la scrittura su SD
            //Serial.println("Password ok...");
            swMenu = 'w';
            bluetooth.println(swMenu);

        } else {
            swMenu = 'i';
            bluetooth.println(swMenu);
            //Serial.println("Sorry, bad password.");
			sw = 0;
        }
		
		//bluetooth.println(stringApp);
	}

	swMenu = 'h';
	//Serial.println("Writing...");
}

void readSensor() {

	//swMenu = 'h';
	//bluetooth.println(swMenu);

    // letture accelerometro
    X = analogRead(pinX);
    Y = analogRead(pinY);
    Z = analogRead(pinZ);

    String dataStringForBluetooth = "";
    dataStringForBluetooth += String(X);
    dataStringForBluetooth += " ";
    dataStringForBluetooth += String(Y);
    dataStringForBluetooth += " ";
    dataStringForBluetooth += String(Z);
    dataStringForBluetooth += " ";
    //dataStringForBluetooth += String(millis()/1000);
	dataStringForBluetooth += String(millis());
    dataStringForBluetooth += "&";

    writeSD(dataStringForBluetooth);
	//Serial.println(dataStringForBluetooth);

}

void writeSD(String str) {
        // scrittura della data su SD
        File dataFile = SD.open("datalog.log", FILE_WRITE);

        // if the file is available, write to it:
        if (dataFile) {
            dataFile.println(str);
            //dataFile.println(dataString, BIN);
            dataFile.close();
            //Serial.println(stringApp);
        } else {
            //Serial.println("Card failed or not present.");
            swMenu = 'a';
            bluetooth.println(swMenu);
        }
}

void readSD() {

	swMenu ='b';
	bluetooth.println(swMenu);

	dataFile = SD.open("datalog.log"); //Riapro il file

	if (dataFile) {//Se il file è stato aperto correttamente
		//Serial.println("#");
		bluetooth.println("#");
		while (dataFile.available()) {
			bluetooth.println(char(dataFile.read()));
		}
		//Serial.println("|");
		bluetooth.println("|");
		//sw = bluetooth.read();
		//Serial.println("End reading datalog.log.");
		swMenu = 'c';
		bluetooth.println(swMenu);

		dataFile.close();

		if (SD.exists("DATALOG.LOG")) {
			SD.remove("DATALOG.LOG");
		}

	} else {
		//Serial.println("Error in opening datalog.log");
		swMenu = 'd';
		bluetooth.println(swMenu);
		//Serial.println(menu);
	}

	swMenu = 'h';
	//Serial.println("Writing...");
} // fine readSD()