Probleem met een sketch

Projecten die niet passen in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 66
Geregistreerd: 02 Okt 2015, 22:31

Probleem met een sketch

Berichtdoor bossie » 26 Apr 2016, 12:24

Hallo allemaal,
ik liep al een tijdje met een idee om een met RFID tags uitgeruste toegangscontrole te maken.
Ben en aantal dagen op het internet aan het zoeken geweest naar iets bruikbaars, met de bedoeling dat aan mijn eigen wensen aan te passen.
Op een gegeven moment liep ik tegen de bijgevoegde sketch aan.
Waarom deze?
Nou een paar voordelen, de valide tags worden opgeslagen op een SD kaartje en d.m.v een master tag éérst te scannen is het mogelijk om gedurende een aantal seconden een bestaande tag te verwijderen of een nieuwe tag op te voeren.

Deze opties vind ik nuttig, omdat dan een 'sleutel' beheerder zonder ICT kennis zijn werk kan doen.

Maaarrrrr je voelt het al, het werkt niet.
Ik krijg de volgende compilatie fout.

Arduino: 1.6.5 (Windows 8.1), Board:"Arduino/Genuino Uno"

doorlock:26: error: 'cardSize' was not declared in this scope
doorlock:26: error: 'cardArrSize' was not declared in this scope
'cardSize' was not declared in this scope


25: const int cardSize = 4;
26: byte cardArr[cardArrSize][cardSize];
27: byte masterCard[cardSize] = {86,187,140,117};

Ik begrijp deze error niet, want in regel 25 is cardSize wel degelijk als integer constant gedeclareerd.
Als Arduino gebruik ik een UNO maar ook bij de grotere Mega2560 krijg ik de zelfde foutboodschap.

Ik zit nu al een paar dagen als een aap in een horloge te gluren, maar kan de fout niet vinden.

Wie helpt me uit de brand?

grt Piet.


cpp code
#include <SPI.h>
#include <Wire.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#include <SdFat.h>

#define MFRC_RST_PIN 9
#define MFRC_SS_PIN 10
#define SD_SS_PIN 8

#define STATE_STARTUP 0
#define STATE_STARTUP_ERROR 1
#define STATE_STARTING 2
#define STATE_WAITING 3
#define STATE_SCAN_INVALID 4
#define STATE_SCAN_VALID 5
#define STATE_SCAN_MASTER 6
#define STATE_ADDED_CARD 7
#define STATE_REMOVED_CARD 8

#define REDPIN 6
#define GREENPIN 7
#define RELAYPIN 5

const int cardSize = 4;
byte cardArr[cardArrSize][cardSize];
byte masterCard[cardSize] = {86,187,140,117};
//byte masterCard[cardSize] = {178,140,117,20};
byte readCard[cardSize];

// Create MFRC522 instance
MFRC522 mfrc522(MFRC_SS_PIN, MFRC_RST_PIN);
// Set the LCD I2C address
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

SdFat sd;

byte currentState = STATE_STARTUP;
unsigned long LastStateChangeTime;
unsigned long StateWaitTime;

char cardFile[] = "cards.txt";
char cardTempFile[] = "cardsTemp.txt";

//------------------------------------------------------------------------------------
void PrintCard(byte printCard[cardSize])
{
int index;

Serial.print("Card - ");
for(index = 0; index < 4; index++)
{
if (index > 0)
{
Serial.print(",");
}
Serial.print(printCard[index]);
}
Serial.println(" ");
}

//------------------------------------------------------------------------------------
boolean findCard()
{
byte currentCard[cardSize];
char text[10];
char c1;
int index;
int value;

//Serial.print("find ");
//PrintCard(readCard);

// open input file
ifstream readStr(cardFile);

// check for open error
if (!readStr.is_open())
{
return false;
}

index = 0;
// read until input fails
while (!readStr.eof())
{
readStr >> value >> c1;

if (readStr.fail())
{
break;
}

currentCard[index] = value;

index++;
if (index > 3)
{
//Serial.print("file read ");
//PrintCard(currentCard);
if ((memcmp(currentCard, readCard, 4)) == 0)
{
return true;
}
index = 0;
}
}

return false;
}

//------------------------------------------------------------------------------------
void addCard()
{
int index;
SdFile writeFile;

//Serial.print("add ");
//PrintCard(readCard);
if (writeFile.open(cardFile, O_RDWR | O_CREAT | O_AT_END))
{
for(index = 0; index < 4; index++)
{
writeFile.print(readCard[index]);
writeFile.print(",");
}
writeFile.close();
}
return;
}

//------------------------------------------------------------------------------------
void removeCard()
{
byte currentCard[cardSize];
char text[10];
char c1;
int readIndex, writeIndex;
int value;
SdFile writeFile;

//Serial.print("remove ");
//PrintCard(readCard);

// open input file
ifstream readStr(cardFile);

// check for open error
if (!readStr.is_open())
{
return;
}

if (writeFile.open(cardTempFile, O_RDWR | O_CREAT | O_AT_END))
{
readIndex = 0;

while (!readStr.eof())
{
readStr >> value >> c1;

if (readStr.fail())
{
break;
}

currentCard[readIndex] = value;

readIndex++;
if (readIndex > 3)
{
//Serial.print("file write ");
//PrintCard(currentCard);
if (!((memcmp(currentCard, readCard, 4)) == 0))
{
for (writeIndex = 0; writeIndex < 4; writeIndex++)
{
writeFile.print(currentCard[writeIndex]);
writeFile.print(",");
}
writeFile.close();
}
}
readIndex = 0;
}
}

sd.remove(cardFile);
sd.rename(cardTempFile, cardFile);

return;
}

//------------------------------------------------------------------------------------
int readCardState()
{
int index;

for(index = 0; index < 4; index++)
{
readCard[index] = mfrc522.uid.uidByte[index];
}
//Serial.print("State ");
// PrintCard();

//Check Master Card
if ((memcmp(readCard, masterCard, 4)) == 0)
{
return STATE_SCAN_MASTER;
}

if (findCard() == true)
{
return STATE_SCAN_VALID;
}

return STATE_SCAN_INVALID;
}

//------------------------------------------------------------------------------------
void DisplayInfo(char *Line1Str, char *Line2Str, int RedPinState, int GreenPinState)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(Line1Str);
lcd.setCursor(0,1);
lcd.print(Line2Str);
digitalWrite(REDPIN, RedPinState);
digitalWrite(GREENPIN, GreenPinState);
}

//------------------------------------------------------------------------------------
void updateState(byte aState)
{
if (aState == currentState)
{
return;
}

// do state change
switch (aState)
{
case STATE_STARTING:
DisplayInfo("RFID Scanner", "Starting up", HIGH, HIGH);
StateWaitTime = 1000;
break;

case STATE_STARTUP_ERROR:
DisplayInfo("Error", "SD card", HIGH, HIGH);
StateWaitTime = 1000;
break;

case STATE_WAITING:
digitalWrite(RELAYPIN, LOW);
DisplayInfo("Waiting for Card", "to be swiped", LOW, LOW);
StateWaitTime = 1000;
break;

case STATE_SCAN_INVALID:
if (currentState == STATE_SCAN_MASTER)
{
addCard();
aState = STATE_ADDED_CARD;

DisplayInfo("Card Scanned", "Card Added", LOW, HIGH);
StateWaitTime = 2000;
}
else if (currentState == STATE_REMOVED_CARD)
{
return;
}
else
{
DisplayInfo("Card Scanned", "Invalid Card", HIGH, LOW);
StateWaitTime = 2000;
}
break;

case STATE_SCAN_VALID:
if (currentState == STATE_SCAN_MASTER)
{
removeCard();
aState = STATE_REMOVED_CARD;

DisplayInfo("Card Scanned", "Card Removed", LOW, HIGH);
StateWaitTime = 2000;
}
else if (currentState == STATE_ADDED_CARD)
{
return;
}
else
{
digitalWrite(RELAYPIN, HIGH);
DisplayInfo("Card Scanned", "Valid Card", LOW, HIGH);
StateWaitTime = 2000;
}
break;

case STATE_SCAN_MASTER:
DisplayInfo("Master Card", "", LOW, HIGH);
StateWaitTime = 5000;
break;
}

//Serial.print("Current State - ");
//Serial.print(currentState);
//Serial.print(", New State - ");
//Serial.println(aState);

currentState = aState;
LastStateChangeTime = millis();
}

//------------------------------------------------------------------------------------
void setup()
{
SPI.begin(); // Init SPI Bus
mfrc522.PCD_Init(); // Init MFRC522

if (!sd.begin(SD_SS_PIN, SPI_HALF_SPEED))
{
updateState(STATE_STARTUP_ERROR);
}

lcd.begin(20,4);

LastStateChangeTime = millis();
updateState(STATE_STARTING);

pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
pinMode(RELAYPIN, OUTPUT);
digitalWrite(RELAYPIN, LOW);

Serial.begin(9600);
}

//------------------------------------------------------------------------------------
void loop()
{
byte cardState;

if ((currentState != STATE_WAITING) &&
(currentState != STATE_STARTUP_ERROR) &&
(StateWaitTime > 0) &&
(LastStateChangeTime + StateWaitTime < millis()))
{
updateState(STATE_WAITING);
}

// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}

// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}

if (currentState != STATE_STARTUP_ERROR)
{
cardState = readCardState();
updateState(cardState);
}
}

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Probleem met een sketch

Berichtdoor shooter » 26 Apr 2016, 20:05

en cardarrsize dan waar staat die?
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 66
Geregistreerd: 02 Okt 2015, 22:31

Re: Probleem met een sketch

Berichtdoor bossie » 26 Apr 2016, 21:29

shooter schreef:en cardarrsize dan waar staat die?

Hoi Paul,
dat was een tijdelijke hulpvariabele.
Die heeft geen functie meer, die had ik weg moeten halen.
Stom, maar vergeten.
Zoals ik al schreef ik zit al een tijdje op die sketch te piekeren en dan wil zo'n detail wel eens aan de aandacht ontsnappen.

grt Piet.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Probleem met een sketch

Berichtdoor nicoverduin » 27 Apr 2016, 14:13

Bij C compilers zit de belangrijkste fout vaak bij het begin van de fout meldingen. De rest is dan vaak het gevolg enz.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 66
Geregistreerd: 02 Okt 2015, 22:31

Re: Probleem met een sketch

Berichtdoor bossie » 27 Apr 2016, 17:22

Hoi Nico,
nicoverduin schreef:Bij C compilers zit de belangrijkste fout vaak bij het begin van de fout meldingen. De rest is dan vaak het gevolg enz.


Meer kan ik de IDE niet ontfutselen:
Code: Alles selecteren
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10605 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Users\Eigenaar\Documents\Arduino\libraries\SPI-master -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire -IC:\Users\Eigenaar\Documents\Arduino\libraries\rfid-master -IC:\Users\Eigenaar\Documents\Arduino\libraries\NewliquidCrystal -IC:\Users\Eigenaar\Documents\Arduino\libraries\SdFat C:\Users\Eigenaar\AppData\Local\Temp\build2687257179999929985.tmp\Tazmanian_3rd.cpp -o C:\Users\Eigenaar\AppData\Local\Temp\build2687257179999929985.tmp\Tazmanian_3rd.cpp.o
Tazmanian_3rd.ino:26:31: error: 'cardSize' was not declared in this scope
'cardSize' was not declared in this scope


Dit is de volledige output van het compileren.
Verkregen door bij Bestand --> Voorkeuren -- Uitgebreide uitvoer weergeven tijdens compileren aan te zetten.
Of doel jij op nog meer info?

grt Piet.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Probleem met een sketch

Berichtdoor nicoverduin » 27 Apr 2016, 17:52

ff hier de zaak door Eclipse gehaald.
Ik vermoed dat je melding komt van deze functie:
cpp code
//------------------------------------------------------------------------------------
void PrintCard(byte printCard[cardSize])
{
int index;

Serial.print("Card - ");
for(index = 0; index < 4; index++)
{
if (index > 0)
{
Serial.print(",");
}
Serial.print(printCard[index]);
}
Serial.println(" ");
}


Wat wil je nu precies doorgeven?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 66
Geregistreerd: 02 Okt 2015, 22:31

Re: Probleem met een sketch

Berichtdoor bossie » 27 Apr 2016, 19:59

nicoverduin schreef:ff hier de zaak door Eclipse gehaald.
Ik vermoed dat je melding komt van deze functie:
....
Wat wil je nu precies doorgeven?


In regel 25: de declaratie van de constante integer cardSize = 4;

Of bedoel je dat niet?

P.S. het probleem met die klok is opgelost.


grt Piet.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Probleem met een sketch

Berichtdoor nicoverduin » 27 Apr 2016, 20:26

Dat doe je nu niet. Wat hier staat
cpp code
void PrintCard(byte printCard[cardSize])

is het volgende:

a)de functie PrintCard geeft niets terug
b)Als parameter geef ik een tabel door die ik printCard noem (wat overigens heel veel verwarring geeft)
met grootte cardSize[/list]
c)Als ik de functie echter begrijp dan bedoel je dat je de kaart uit de tabel wil afprinten die wordt aangewezen door de index van kaarten.
Dan zou je dus alleen maar een verwijzing hoeven geven van de index in de tabel waar die kaart staat. Daarna ga je dan de nummers van die kaart printen.
Nu bestaat die tabel een een cardArrSize aantal regels met een cardSize aantal kolommen. En het leuke in C is dat uiteindelijk al die nummers gewoon achter elkaar staan.
In feite hoef je alleen maar een pointer te hebben naar het eerste element van de kaart en dan de volgende cardSize-1 aantal (index begint altijd bij 0) bytes uit te printen. Dan zou de routine als volgt kunnen worden:
cpp code
//------------------------------------------------------------------------------------
void PrintCard(byte *ptr)
{
Serial.print("Card - ");
for (uint8_t i = 0; i < cardSize; i++) {
if (i > 0) {
Serial.print(",");
}
Serial.print(ptr[i]);
}
Serial.println(" ");
}


En de aanroep naar de routine wordt dan:
cpp code
PrintCard(&cardArr[KaartOmTePrinten][0]);


Tenslotte nog een tip. Stel een vreemd iemand zou morgen jouw programma krijgen. Of nog sterker over een jaar moet er iets gewijzigd worden. Hoe groot schat jij de kans in dat jij/hij/zij begrijpt wat het programma doet? Commentaar....Commentaar....Commentaar....Commentaar....Commentaar....Commentaar....
En zolang je nog redenen verzint om iets niet te doen...2e tip ..... wordt nooit programmeur/software ontwikkelaar...
En wees heeeeeeeeeeel voorzichting met bijna op elkaar lijkende naamgeving...
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 66
Geregistreerd: 02 Okt 2015, 22:31

Re: Probleem met een sketch

Berichtdoor bossie » 27 Apr 2016, 20:44

Even voor de goede orde, Nico,
Ik heb de code "as is" van het internet geplukt en ik loop ook tegen de afwezigheid van commentaren aan.

En voor wat betreft de code voorstellen die jij doet, ben ik je volledig kwijt.
De compiler geeft een error bij de declaratie en jij adviseert me om een functie aan te passen waar de ge declareerde constante in de functie aanroep staat.

Kun je me het verband met de compile fout en het aanpassen van de functie uitleggen?

Ik heb niet de ambitie om op mijn 68ste nog programmeur - ontwikkelaar te worden.
Maar vind programmeren wel leuk en ja variabelen die qua naamgeving op elkaar lijken zijn een crime.

grt Piet.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Probleem met een sketch

Berichtdoor nicoverduin » 27 Apr 2016, 21:56

a) Wat houd je tegen dat als commentaar ontbreekt, deze zelf toe te voegen. Daar leer je juist van en ga je begrijpen wat het programma doet.
b) Je definieert een const int met dezelfde naam als een parameter in een functie. Daar komt de compiler niet uit. een const int is geen parameter maar een constante. Als je #define gebruikt gaat de pre-compiler overal in je programma die naam veranderen voor de gedefinieerde waarde en is het probleem weg.
c) Of Als je die print functie aanpast is de error weg.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 36 gasten