La Programmazione ad Oggetti interferisce con l'RFID ?

Buondì,
Sto effettuando delle prove in vista dell’esame di Lab. Automatica e mi trovo dinanzi ad un errore davvero particolare. Solitamente, quando voglio studiare l’ avanzamento di un programma inserisco delle “stampe di prova”, così da verificare che una o più variabili possiedano i giusti valori in determinati istanti di vita del programma.

Con C++, Java, Python , ecc. non ho mai avuto problemi con questa “strategia”, ma con Arduino sto diventando matto!

Il codice contiene un riconoscimento tramite RFID di una tessera/tag magnetica e, in determinati casi, si deve attivare un servomotore, un motore passo-passo, ecc. Nessun problema! Dichiaro questi cinque codici-stringa(uno per tessera), effettuo le prove, sono contento!

Ora voglio fare di più: voglio rendere il programma più leggibile! Quindi passo alle classi ed oggetti.
Creo la classe utente, con l’attributo stringa codice, e vari attributi che mi serviranno in vista del progetto finale(es. angolo di rotazione del servo, nome del possessore della tag, ecc.)
E qui l’RFID smette di funzionare! Avvicino le tessere, ma non ottengo alcuna risposta: nè fisica, nè in seriale!

Il codice è il seguente (caricato su una scheda Arduino Uno R3)

#include <SoftwareSerial.h>
#include <Servo.h>

Servo myservo;

class utente{
  public:
  String nome;
  String tag;
  int razione_day;
  int angolo;
  utente();
  void set(String, String,int,int);
};

utente::utente()
{
  nome="ID";
  tag="000";
  razione_day=0;
  angolo=90;
}

void utente::set(String n,String t,int r,int a)
{
  nome=n;
  tag=t;
  razione_day=r;
  angolo=a;
}

utente people[5];


 
SoftwareSerial rfid = SoftwareSerial(5,6);

String msg;
char gate;
int fase;
int posizione_servo;
int FSR_Pin = A0;
const int motorpin=10;



void setup()  
{
  posizione_servo=90;

  Serial.begin(9600);
  Serial.println("Serial Ready");

  rfid.begin(9600);
  Serial.println("RFID Ready");
  
  myservo.attach(9);
  
  pinMode(motorpin,OUTPUT);
   //people[0].set("Simone","030077F58706",200,0);
  //people[1].set("Jennifer","03007842645D",100,179);
  //people[2].set("Umbreon","280015EE6CBF",300,30);
  //people[3].set("Shampu","08000B02F9F8",400,150);
  //people[4].set("Nihal","08000B008E8D",500,90);

}

void loop(){
 
  msg="";
  fase=0;
  int FSRReading = analogRead(FSR_Pin); 
  while((rfid.available()>0)&&(fase<15)){
    gate=rfid.read();
    msg+=gate;
    fase+=1;
    Serial.print("Gate: ");
    Serial.print(gate);
    Serial.print("Messaggio: ");
    Serial.print(msg);
    Serial.print("Peso: ");
    Serial.println(FSRReading);
  }
  if (fase==14)
  {
   msg=msg.substring(1,13);
   int result=-1;
   Serial.print("Tessera ");
    for(int i=0;i<5;i++)
    {
      //if (msg==people[i].tag) result=i;
    }
    if (result==-1) {
      //myservo.write(people[result].angolo);      
       digitalWrite(motorpin,HIGH);
      delay(200);
      digitalWrite(motorpin,LOW);
      Serial.print("di ");
      //Serial.println(people[result].nome);
     }
     else {
       Serial.println("non riconosciuta!");
    }
  delay(1000);
 } 
}

Le istruzioni-allarme sono state commentate! Se carico il codice così come lo vedete, il programma funziona (naturalmente non è giusto dal punto di vista logico…), se inserisco le istruzioni commentate, non funziona più nulla.

Laendor:
Con C++, Java, Python , ecc. non ho mai avuto problemi con questa "strategia", ma con Arduino sto diventando matto!

Nel programmare in C++ su Arduino bisogna stare molto attenti: non puoi paragonare un Pc col microcontrollore di Arduino: 8bit, 32K di flash e 2K di Ram.
Hai controllato la memoria residua?

Ricorda che anche String è una classe.

Allora, in fase di compilazione ottengo la seguente risposta:
Dimensione del file binario dello sketch: 8.414 bytes (su un massimo di 32.256 bytes)
come posso ottenere la memoria residua? Mi devo calcolare a mano il peso di ogni campo dell'oggetto? Oppure c'è una funzione apposita da eseguire in fase di test?

Da integrare nello sketch e richiamare quando necessario
--> Arduino Playground - AvailableMemory