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.