Non sono riuscito ad afferrare bene il concetto.. ![]()
Si grazie,ora lo faccio
Fatto,mi trovo 0.. quindi l'errore dov'è? Se non qui
Mario77:
Non sono riuscito ad afferrare bene il concetto..
Quello che dice Patrick_M serve per "contare" a mano se apri e chiudi tutte le graffe.
Ma questo lo puoi già vedere se fai l'auto-indent dell'IDE (come detto, fai Ctrl-T e te lo fa automaticamente l'IDE!) in quanto se ci sono graffe non chiuse ti troverai indentazioni non compete o doppie graffe allo stesso livello.
In questo secondo caso però non è una graffa in più o in meno, è che forse è stata messa MALE. E se fai Ctrl-T te ne puoi accorgere secondo me... (non ho le stesse tue librerie quindi non posso provare lo sketch)
In ogni caso se già mentre scrivi il codice indenti allo stesso modo (le istruzioni apaprtenenti ad uno stesso blocco devono essere tutte allineate tra loro, ed ogni graffa aperta aumenti l'indentazione, ad ogni chiusa la diminuisci) ti verrà "normale" fare questi controlli. E in caso di necessità c'è sempre il Ctrl-T.. ![]()
Prova a indentare "bene", vedi cosa ne esce e facci sapere (posta nuovamente quindi il "nuovo" codice indentato!).
Hai fatto la formattazione automatica con ctrl-T ? ... hai provato a guardare ESATTAMENTE dove apri e chiudi le parentesi ? Io dico di NO !
Guglielmo
P.S.:docdoc mi ha preceduto ... ![]()
è una cosa che ho fatto anche già prima,il codice quindi è lo stesso,ho ordinato un po', però l'errore non credo provenga da quì.
#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);
}
}
Prova a vedere dove finisce loopC, poi dimmi
no guarda l'errore è qui
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);
}
e se controlli fino in fondo a queste righe te ne devi accorgere
e il conteggio ti garantisco che alla fine fa 1
Volevo chiedere un'altra cosa l'ultima parentesi che voi mi avete fatto togliere qui, mi serve per chiudere il loop B
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);
}
}
}
Però, appena la rimetto mi segna di nuovo l'errore di prima.
LockedPosition(false);
'LockedPosition' was not declared in this scope
ad ogni modo il prossimo errore sarà sulla funzione subito dopo
e poi anche la successiva
e la successiva ancora ![]()
ma lo vedi che queste sono allo stesso livello?
} <---------------- questa non chiude la funzione
delay(100);
void LockedPosition(int locked)
{ <------------------- questa apre una nuova funzione
Il pezzo di codice che hai allegato nell'ultimo post mi dice solo che la funzione loopB é aperta e chiusa (credo correttamente). Il problema é DOPO
Patrick_M:
Esce 1,ma il loop C non finisce lì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);
}
}[/]
Perché se si conta tutto il loop C esce 0, o mi sbaglio?
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin)
{
digitalWrite(ledPin, HIGH);
delay(delayLed);
digitalWrite(ledPin, LOW);
}
}
quindi questa funzione che come dice il commento serve per accendere e spegnere un led fa parte di loopC?
e anche questa?
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto) {
if (codiceLetto.equals(codiceAutorizzato)) {
return true;
} else {
return false;
}
}
se è così allora è tutto giusto e il programma funziona e compila a meraviglia ![]()
garantito al limone ![]()
Si,in pratica quando passo la tessera si accende il led, a me non va....... ![]()
te lo scrivo altrimenti non andiamo più avanti:
l'ultima parentesi graffa in fondo in fondo allo sketch devi cancellarla
e devi aggiungerne una (sempre di graffa chiusa intendo)
dopo le righe:
accendiLed(ledVerde); <-- questa è una chiamata ad una funzione
}
delay(delayRead);
}
che sono le ultime quattro del loopC
se sono FUNZIONI non devono/possono essere scritte ALL'INTERNO di altre FUNZIONI altrimenti non FUNZIONANO ![]()
Non va perchè le funzioni devono essere dichiarate FUORI da ogni altra funzione. Non può essere che una funzione "faccia parte p" di un'altra. Quindi quando dichiarinuna funzione accertati che sia fuori da tutte (che la formattazione automatica non metta spazi tra il suo nome è l'inizio della pagina. Nel caso in cui ne mettesse devi chiudere tutte le parentesi graffe rimaste aperte perché se non lo fai la funzione non viene considerata come tale e quindi ti compare l'errore.
Mi ha fatto compilare,l'ho testato e....funziona ![]()
Grazie per la pazienza ![]()
Stavo già da qualche settimana per risolvere questo problema