Ciao ,sono nuovo e ho bisogno d’aiuto

Buonasera,mi presento mi chiamo Mario,frequento l'ultimo anno di una scuola tecnica,con indirizzo ''automazione''. Premetto di non avere una grande capacità di programmare con arduino,ma me la cavo.
Come detto sopra,sono all'ultimo anno di scuola e per fine anno dovrei presentare un progetto, però purtroppo ho un problema. Nel mio programma sono inclusi un KEYPAD(3x4) e un RFID-RC522, il problema consiste nel funzionamento dei miei dispositivi, mi spiego meglio: in base al programma che io inserisco mi funziona solo uno dei due dispositivi, ovvero che mi funziona sempre e solo la prima cosa presente nel mio void loop. Per farvi capire,se io nel mio void loop inserisco prima il programma del KEYPAD,mi funziona esso ma non l'RFID-RC522, oppure viceversa.
Ho cercato anche su internet,ma purtroppo non sono riuscito a trovare il problema.. ho chiesto anche ai miei professori ma nemmeno loro hanno individuato l'errore,loro credono che ci sia conflitto tra le librerie.
Spero che qualcuno di voi individui il problema. (uso un arduino uno)
Grazie in anticipo.

#include "SPI.h"
#include "MFRC522.h"



#define SS_PIN 10
#define RST_PIN 9
#define LED_PIN A3

MFRC522 rfid(SS_PIN, RST_PIN);

MFRC522::MIFARE_Key key;




//pressione
int pressurePin = A5;
int force;
int LEDpin = A4;

//keypad
#include <Servo.h>
#include <Keypad.h>
Servo ServoMotor;
char* password = "456"; 
int position = 0;
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = { 8, 7, 6, 5 };
byte colPins[COLS] = { 4, 3, 2 };
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
    Serial.begin(9600);
    SPI.begin();
    rfid.PCD_Init();
    pinMode(LED_PIN, OUTPUT);
  pinMode(LEDpin, OUTPUT);
  ServoMotor.attach(A2);
LockedPosition(true);
}
 
 void loop() { 
force = analogRead(pressurePin);

if(force < 50 )
{
  digitalWrite(LEDpin, HIGH);
}
else
{
  digitalWrite(LEDpin, LOW);
  }

  Serial.println(("INSERIRE CHIAVE.."));
 delay(10);
   if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) 
    return;
 
 
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  
  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Il tuo tag non è di tipo MIFARE Classic."));
    return;
  }

  String strID = "";
  for (byte i = 0; i < 4; i++) {
    strID +=
    (rfid.uid.uidByte[i] < 0x10 ? "0" : "") +
    String(rfid.uid.uidByte[i], HEX) +
    (i!=3 ? ":" : "");
  }
  strID.toUpperCase();

  Serial.print("Tocca il tasto della carta: ");
  Serial.println(strID);

  
  if (strID.indexOf("15:3E:25:C3") >= 0) {
    digitalWrite(LED_PIN, HIGH);
    delay(1700); //attendo 500 ms
digitalWrite(LED_PIN,LOW);  //spengo il LED
    
  }

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();

       char key = keypad.getKey();
if (key == '*' || key == '#')
{
position = 0;
LockedPosition(true);
}
if (key == password[position])
{
position ++;
}
if (position == 3)
{
LockedPosition(false);
}
delay(100);
}
void LockedPosition(int locked)
{
if (locked)
{

ServoMotor.write(42);
}
else
{
ServoMotor.write(130);
}  
  }

Prima di tutto vai a leggere il regolamento del forum e a presentarti nell'apposito threed. Non ti dico dove sono, perché é facile trovarli.
Già che ci sei gira un po per il forum a vedere se riesci a trovare qualcosa che ti può essere utile.
Inoltre confesso di non aver compreso appieno quale sarebbe lo scopo del tuo progetto. Potresti aiutarmi a comprenderlo?
Infine una domanda: a che livello sei con Arduino? Quanto "te la cavi"? Così ci adeguiamo a darti consigli. Non rispondere qui. Includilo nella presentazione

Il mio progetto consiste nel programmare un impianto di antifurto del caveau di una banca,questa è solo una parte di programma,poiché è presente un altro arduino ed anche un logo.
Il KEYPAD mi servirebbe per aprire la porta,mentre l'RFID per attivare e disattivare l'allarme(il led che fa accendere l'RFID mi va in ingresso al logo).
Spero di essere stato sufficientemente chiaro.

Ciao, hai detto che comunque i due programmi funzionano separatamente ma se uniti no.

Premetto che esistono più librerie per uno stesso componete, prima di scegliere una libreria guardare gli esempi di alcune librerie.

Non solo esistono diversi modi per fare una cosa, ad esempio esistono diversi modi per riconoscere una
password da keypad, anche qui guardare diversi esempi prima di sceglierne uno.

Torniamo al tuo codici, la lettura della tessera, ci sono istruzioni con return,

 if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) 
    return;

In questo modo se non stai usando la tessera, il loop() termina e rincomincia, questo se devi usare solo la tessera non ti crea problemi, ma vuol dire che se non stai usando la tessera il programma non prosegue.

Prova a vedere se questo codice può funzionare col tuo componente NON SO
[http://ismanettoneblog.altervista.org/blog/lezione-11-come-utilizzare-rfid-reader-per-carte-magnetiche/]http://ismanettoneblog.altervista.org/blog/lezione-11-come-utilizzare-rfid-reader-per-carte-magnetiche/]http://ismanettoneblog.altervista.org/blog/lezione-11-come-utilizzare-rfid-reader-per-carte-magnetiche/](http://ismanettoneblog.altervista.org/blog/lezione-11-come-utilizzare-rfid-reader-per-carte-magnetiche/)

E' anche pensabile, per maggior "ordine" del codice, inserire il codice per un compito in una funzione personalizzata Esempio funzione1(), funzione2(), e poi nella funzione loop() richiamare semplicemente le due funzioni.

Ho provato col programma da lei mandato,ma è lo stesso, non va bene.
Riguardo all'esempio delle funzioni,già provai,visto che la vidi come cosa adeguata al mio problema però non sono riuscito nel programma,mi dava sempre errore,non so bene come impostare il programma.

questi mi sa che così non funzionano se vuoi usarli come pin digitali

#define LED_PIN A3
int LEDpin = A4;
...
...
pinMode(LED_PIN, OUTPUT);
pinMode(LEDpin, OUTPUT);

devi chiamarli
A0 = 14
A1 = 15
A2 = 16
A3 = 17
A4 = 18
A5 = 19
se non vado errato

stessa cosa per questo
ServoMotor.attach(A2);

Ho provato di nuovo a fare delle funzioni nel loop,ma mi da sempre errore, sapreste dirmi il perchè?

#include <SPI.h>
#include <MFRC522.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define delayLed 2000 
#define ledVerde A0

/* Viene creata una istanza della RFID libreria */
MFRC522 RC522(SDA_DIO, RESET_DIO); 

String codiceAutorizzato = "00000";





//pressione
int pressurePin = A5;
int force;
int LEDpin = A4;

//keypad
#include <Servo.h>
#include <Keypad.h>
Servo ServoMotor;
char* password = "456"; 
int position = 0;
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = { 8, 7, 6, 5 };
byte colPins[COLS] = { 4, 3, 2 };
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


void setup() {
   Serial.begin(9600);
   SPI.begin();
     RC522.PCD_Init();
   Serial.println("Setup");
   pinMode(ledVerde,OUTPUT);

 pinMode(LEDpin, OUTPUT);
ServoMotor.attach(A1);
LockedPosition(true);

}

void loop() { 
 loopA();
 loopB();
 loopC();
}

void loopA() { 
force = analogRead(pressurePin);

if(force < 50 )
{
 digitalWrite(LEDpin, HIGH);
}
else
{
 digitalWrite(LEDpin, LOW);
 }
}

void loopB() {
   char key = keypad.getKey();
if (key == '*' || key == '#')
{
position = 0;
LockedPosition(true);
}
if (key == password[position])
{
position ++;
}
if (position == 3)
{
LockedPosition(false);
}
delay(100);
}
void LockedPosition(int locked)
{
if (locked)
{

ServoMotor.write(42);
}
else
{

ServoMotor.write(130);
}
}
}


void loopC() {

 
 /* Temporary loop counter */
 byte i;
 // Se viene letta una tessera
  if (RC522.PICC_IsNewCardPresent())
 {
   // Viene letto il suo codice 
   RC522.PICC_ReadCardSerial();
   String codiceLetto ="";
   Serial.println("Codice delle tessera letto:");

   // Viene caricato il codice della tessera, all'interno di una Stringa
   for(i = 0; i <= 4; i++)
   {
     codiceLetto+= String (RC522.uid.uidByte[i],HEX);
     codiceLetto.toUpperCase();
   }
   Serial.println(codiceLetto);
 if(verificaCodice(codiceLetto)){
     Serial.println("Tessera autorizzata");
     accendiLed(ledVerde);
   }
 delay(delayRead);  
 }


// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto){
 if(codiceLetto.equals(codiceAutorizzato)){
   return true;
 }else{
   return false;
 }  
} 
   
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
 digitalWrite(ledPin,HIGH);
 delay(delayLed);
 digitalWrite(ledPin,LOW);
} 
}

I tag [code] e [/code] DEVONO essere senza spazi dentro !! Ho corretto io il tuo post :wink:

Guglielmo

Si giusto,ho corretto,anche se comunque il problema non è quello.

Mario77:
Si giusto,ho corretto,anche se comunque il problema non è quello.

NO, ho corretto IO :smiley: :smiley: :smiley: ... ed è ovvio che il problema del codice NON è quello dei tag eh ! :wink:

Guglielmo

rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();

queste che fanno.... visto che dopo c'è il controllo del keypad...

p.s.
ma l'errore che ti da qualìè??
di compilazione o non funziona...

Si lo so :smiley: , intendevo di aver corretto a ciò che ha detto Patrick_M.
Ora che ho inserito queste funzioni mi da errore di compilazione su questa riga:

loopC();

'loopC' was not declared in this scope

Ok, allora, primo: indenta per bene! Non è una questione "estetica" ma l'indentazione è importante per poter analizzare anche ad occhio il codice e capire più rapidamente il funzionamento (e gli eventuali errori).

Per farlo, apri il codice nell'IDE e premi Ctrl-T.

A quel punto controlla bene le graffe che hai messo, se sono tutte al punto giusto. Se vedi bene, dovresti trovare il problema... :wink:

se usassi la formattazione automatica che ti mette un po d'ordine troveresti questo

void loopB() {
   char key = keypad.getKey();
   if (key == '*' || key == '#') {
      position = 0;
      LockedPosition(true);
   }
   if (key == password[position]) {
      position ++;
   }
   if (position == 3) {
      LockedPosition(false);
   }
   delay(100);
}
void LockedPosition(int locked) {
   if (locked) {

      ServoMotor.write(42);
   } else {

      ServoMotor.write(130);
   }
}
}

che come vedi ha una graffa di chiusura di troppo ed è questo l'errore reale, eliminandola la compilazione funziona...

docdoc... ci siamo sovrapposti :smiley:

Si grazie,avete ragione entrambi,solo che ora ho un'altro errore (sempre di compilazione).
Un errore che nel programma dell'rfid usato singolarmente non mi segna,mentre qui si,sapreste indicarmi il motivo?

 if (verificaCodice(codiceLetto)) {
'verificaCodice' was not declared in this scope

Patrick_M:
docdoc... ci siamo sovrapposti :smiley:

Si ma non gli avevo detto tutto perché avrei preferito che lo scoprisse da solo, specie all'inizio serve "fare esperienza" nel debugging no?... :wink:

Mario77:
Un errore che nel programma dell'rfid usato singolarmente non mi segna,mentre qui si,sapreste indicarmi il motivo?

Primo, posta il NUOVO codice ossia quello che hai modificato (con l'indentazione giusta e con la graffa corretta) e che ti da QUESTO errore.
Secondo, come hai già notato, a volte l'errore va "compreso" ossia perché non trova quella funzione, se l'hai definita? Tu HAI indentato il codice, vero?? C'è qualcosa che dà fastidio al compilatore PRIMA della definizione, o che interpreta in modo errato?

Il conto delle parentesi graffe si perde facile. Metti la formattazione automatica del codice e guarda se segue queste regole:
1)mia due parentesi consecutive in prima riga (così:

}
}
  1. tutto quello che vuoi fare in una funzione deve essere più distante dal bordo rispetto alla sua dichiarazione
  2. ogni dichiarazione di funzione deve essere attaccata al bordo

Questo è il programma:

#include <SPI.h>
#include <MFRC522.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define delayLed 2000
#define ledVerde 14

/* Viene creata una istanza della RFID libreria */
MFRC522 RC522(SDA_DIO, RESET_DIO);

String codiceAutorizzato = "00000";





//pressione
int pressurePin = A5;
int force;
int LEDpin = 18;

//keypad
#include <Servo.h>
#include <Keypad.h>
Servo ServoMotor;
char* password = "456";
int position = 0;
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = { 8, 7, 6, 5 };
byte colPins[COLS] = { 4, 3, 2 };
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


void setup() {
  Serial.begin(9600);
  SPI.begin();
  RC522.PCD_Init();
  Serial.println("Setup");
  pinMode(ledVerde, OUTPUT);

  pinMode(LEDpin, OUTPUT);
  ServoMotor.attach(15);
  LockedPosition(true);

}

void loop() {
  loopA();
  loopB();
  loopC();
}

void loopA() {
  force = analogRead(pressurePin);

  if (force < 50 )
  {
    digitalWrite(LEDpin, HIGH);
  }
  else
  {
    digitalWrite(LEDpin, LOW);
  }
}

void loopB() {
  char key = keypad.getKey();
  if (key == '*' || key == '#')
  {
    position = 0;
    LockedPosition(true);
  }
  if (key == password[position])
  {
    position ++;
  }
  if (position == 3)
  {
    LockedPosition(false);
  }
  delay(100);
}
void LockedPosition(int locked)
{
  if (locked)
  {

    ServoMotor.write(42);
  }
  else
  {

    ServoMotor.write(130);
  }
}



void loopC() {


  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.PICC_IsNewCardPresent())
  {
    // Viene letto il suo codice
    RC522.PICC_ReadCardSerial();
    String codiceLetto = "";
    Serial.println("Codice delle tessera letto:");

    // Viene caricato il codice della tessera, all'interno di una Stringa
    for (i = 0; i <= 4; i++)
    {
      codiceLetto += String (RC522.uid.uidByte[i], HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if (verificaCodice(codiceLetto)) {
      Serial.println("Tessera autorizzata");
      accendiLed(ledVerde);
    }
    delay(delayRead);
  }


  // Questa funzione verifica se il codice Letto è autorizzato
  boolean verificaCodice(String codiceLetto) {
    if (codiceLetto.equals(codiceAutorizzato)) {
      return true;
    } else {
      return false;
    }
  }

  // Questa funzione permette di accendere un LED per un determinato periodo
  void accendiLed(int ledPin) {
    digitalWrite(ledPin, HIGH);
    delay(delayLed);
    digitalWrite(ledPin, LOW);
  }
}

Questo è l'errore:

if (verificaCodice(codiceLetto)) {
'verificaCodice' was not declared in this scope

docdoc:
Si ma non gli avevo detto tutto perché avrei preferito che lo scoprisse da solo, specie all'inizio serve "fare esperienza" nel debugging no?... :wink:

Primo, posta il NUOVO codice ossia quello che hai modificato (con l'indentazione giusta e con la graffa corretta) e che ti da QUESTO errore.
Secondo, come hai già notato, a volte l'errore va "compreso" ossia perché non trova quella funzione, se l'hai definita? Tu HAI indentato il codice, vero?? C'è qualcosa che dà fastidio al compilatore PRIMA della definizione, o che interpreta in modo errato?

si hai ragione.... infatti c.v.d. non è stato messo a posto lo sketch seguendo i consigli tuoi e l'esempio mio ed eccoci ancora qui a ripetere esattamente lo stesso commento...

fai così:

comincia dalla riga loop()

e comincia a contare +1 ogni pgraffa aperta e -1 ogni graffa chiusa
alla fine del loop devi essere a zero
fai così per ogni funzione presente dopo
e alla fine devi sempre avere zero...