Dunque,un miglioramento c'e ' (il problema della selezione dello switch era dovuto a problemi di connessione hardware) che ho risolto.Ho dichiarato le variabili all'inizio dello sketch (e' stata una mia svista,in effetti non me ne ero accorto che le avevo dichiarato 2 volte).
startTime = millis() ,l'ho dichiarato appena viene riconosciuta la simcard:
Ho pero' 2 problemi:
1. Al secondo inserimento della CARD,il pulsante di selezione materiale non funziona e va subito in timeout.
Ecco un esempio
- Arduino appena resettato:
Inserire la simcard prego........OK
SIMCARD VALIDA
Effettua la scelta del materiale da conferire entro 10 secondi..
Scelta effettuata : PET
PREGO CONFERIRE PET
Estrarre la SIMCARD,Grazie...
Operazione conclusa
------------------------------------------
Al secondo tentativo,togliendo e reinserendo la SIMCARD
Inserire la simcard prego........OK
SIMCARD VALIDA
Effettua la scelta del materiale da conferire entro 10 secondi..
Estrarre la SIMCARD,Grazie...
Operazione conclusa
-------------------------------------------------------
Va in timeout!Per farlo funzionare di nuovo devo resettare arduino.
Inoltre la void contaPet() non viene eseguita,al conteggio lo sketch si blocca e poi dopo 10 secondi va in timeout
Ecco lo sketch completo con le ultime modifiche:
// includi libreria Smartcard:
#include <Smartcard.h>
// includi la libreria del sensore SHARP GP2Y0A21YK:
#include <DistanceGP2Y0A21YK.h>
// include libreria SPI:
#include <SPI.h>
// initialize the library with address of slave select pin
Smartcard smartcard(7);
//Definizione dei PIN dei pulsanti che simulano i controlli CTRL1 e CTRL2
const int CTRL1 = 3;
const int CTRL2 = 4;
//Definizione dei PIN dei pulsanti di scelta materiale:
const int PET = 5;
const int PS = 6;
const int ALU = 8;
const int Rele_PET = 9;
//convert from hexadecimal to ASCII for display the result
void HexToAsc(char *c){
if (((*c&0x0F)>=0)&&((*c&0x0F)<=9))
*(c+1) = (*c&0x0F)+0x30;
else
*(c+1) = (*c&0x0F)+0x37;
if ((((*c&0xF0)>>4)>=0)&&(((*c&0xF0)>>4)<=9))
*c = ((*c&0xF0)>>4)+0x30;
else
*c = ((*c&0xF0)>>4)+0x37;
}
int VAL_CTRL1=0;
int VAL_CTRL2=0;
int VAL_PET=0;
int VAL_PS=0;
int VAL_ALU=0;
// Setup relativo al sensore IR GP2Y0A21YK q
DistanceGP2Y0A21YK Dist;
int distance;
unsigned long Timer = 0;
unsigned int Contatore = 0;
const unsigned long Timeout = 10000; // Costante di timeout= 10 secondi
boolean giaPremuto = false;
boolean premuto=false;
boolean impulso_mandato = false;
long startTime;
long duration;
int stato = 0;
///////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
// start the serial library:
Serial.begin(9600);
pinMode(2, OUTPUT); // LED DI STATO ON -> CARD RICONOSCIUTA
// Definizione dei pin relativi ai controlli del compattatore:
pinMode(CTRL1,INPUT_PULLUP);
pinMode(CTRL2,INPUT_PULLUP);
// Definizione dei pin relativi al materiale da conferire:
pinMode(PET,INPUT_PULLUP);
pinMode(PS,INPUT_PULLUP);
pinMode(ALU,INPUT_PULLUP);
// Definizione dei pin dei RELE' Relativi all' apertura delle bocche:
pinMode (Rele_PET,OUTPUT);
///////////////////////////////////////////////////////////////////////
// Pin analogico a cui è collegato il sensore IR,che gestisce la presenza del materiale PET:
Dist.begin(A0);
// Pin analogico a cui è collegato il sensore IR,il quale misura il riempimento del contenitore PET:
Dist.begin(A1);
} // Fine setup
////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned char data[16];
char ascii_data[2];
Serial.print("Inserire la simcard prego........");
//wait smartcard
while(!smartcard.IsCardPresent(1)){
delay(500);
}
Serial.println("OK");
Serial.println();
//reset smartcard
smartcard.PowerOnATRSC(data);
// Serial.println(">> ReadByte4442 <<");
// Serial.println();
ascii_data[0] = smartcard.ReadByte4442(0x20);
HexToAsc(ascii_data);
if((ascii_data[0] == '5')&&(ascii_data[1] == '0'))
{
// Se la simcard è riconosciuta,accendi il led
digitalWrite(2, HIGH); // LED CHE INDICA IL RICONOSCIMENTO DI UNA SIM CARD VALIDA
Serial.println("SIMCARD VALIDA");
Serial.println();
startTime = millis();
VAL_CTRL1=digitalRead(CTRL1);
VAL_CTRL2=digitalRead(CTRL2);
// Verifica se ci sono malfunzionamenti nel compattatore:
if ((VAL_CTRL1==LOW) || (VAL_CTRL2==LOW)) { // simulazione errori tramite i pulsanti
Serial.println("Attenzione!Errore compattatore!");
}
else {
Serial.println ("Effettua la scelta del materiale da conferire entro 10 secondi..");
// Parte il conto alla rovescia per la scelta del materiale da conferire:
while (stato <1)
{
duration =millis() - startTime;
// Serial.print(duration);
// Serial.println();
if ( duration > Timeout)
{
stato = 1;
// Manda l'impulso solo se non l'ha già mandato prima
if (impulso_mandato == false)
{
Serial.println("BLOCCATO");
impulso_mandato = true;
}
}
else
{
//CurrentDurata=millis();
if (pulsantePremuto(PET) == true && giaPremuto == false)
{
stato = 1;
giaPremuto = true;
Serial.println("Scelta effettuata : PET");
apriportelloPET();
Contatore=0;
contaPET();
}
}
}
}
}
// CHIUSURA PARENTESI if ascii
else
{
//Se la simcard non e' riconosciuta,spegni il led
digitalWrite(2, LOW);
Serial.println("Simcard non valida!");
Serial.println();
}
Serial.print("Estrarre la SIMCARD,Grazie...");
Serial.println();
smartcard.PowerOffSC();
//wait smartcard extraction
while(smartcard.IsCardPresent(1)){
delay(500);
}
chiudiportelloPET(); // Chiude portello PET quando si estrae la scheda.
Serial.println("Operazione conclusa");
Serial.println();
} // Fine LOOP
///////////////////////////////////////////////////////////////////////
void apriportelloPET () // Procedura per l'apertura del portello PET
{
digitalWrite (Rele_PET,HIGH); // pin 9
Serial.print("PREGO CONFERIRE PET");
Serial.println();
}
void chiudiportelloPET ()
{
digitalWrite (Rele_PET,LOW); // pin 9
}
void contaPET()
{
Timer = millis(); // PARTE IL TIMER
while((millis() - Timer) < Timeout) { // Mentre t < timeout
distance = Dist.getDistanceCentimeter(); // Acquisisci dati dal sensore
if (distance>=7) { // Se la distanza e' maggiore di 7,non contare
premuto = false;
}
if ((distance<7) && premuto == false) { // Se la distanza e'minore di 7 comincia a contare
Contatore ++; // incrementa contatore
Timer = millis(); // timer partito/resettato
premuto = true;
Serial.print("Contatore: ");
Serial.println(Contatore);
}
}
}
bool pulsantePremuto(int pinPulsante)
{
// pulsante premuto
if (digitalRead(pinPulsante) == LOW)
{
delay(20); // ritardo antiribalzo
// conferma pulsante premuto
if (digitalRead(PET) == LOW )
{
//Pulsante premuto, ritorna true e ferma la funzione
return true;
}
}
//Nessun pulsante è stato premuto, la funzione ritorna false
return false;
}