Reputation: 763
I'm working on an Arduino project. The Arduino board saves a timestamp and RFID code to the ROM when an RFID tag is scanned. The RFID data is received by Serial.read()
but now I need to get the stored data from my Arduino ROM to my computer.
To do that I have to read the serial data (in this case using C#) and that works fine. But because my Arduino board needs to know when to write data to the serial I first need to send a command to the Arduino board.
Using Arduino IDE's 'Serial Monitor', I tried sending some data but it doesn't get received by the Arduino. When I place an RFID tag in front of the RFID, the Arduino board does receive data. So it seems to me like the serial port input is somehow reserved by the RFID reader? Is that even possible?
Does someone know an solution for my problem? Note that this is my first Arduino project and C is new to me.
Some info:
The code below is the whole Arduino project.
#include "Wire.h"
#include <EEPROM.h>
#include "EEPROMAnything.h"
#define DS1307_ADDRESS 0x68
byte zero = 0; //workaround for issue #527
int buttonState = 0;
byte value;
int byteaddress = 0;
int bytesize = 0;
int lastTag = 0;
byte incomingByte;
struct config_t
{
int seconds;
int hours;
int minutes;
} timestamp;
int RFIDResetPin = 13;
//Register your RFID tags here
char tag1[13] = "03000DEB55B0";
char tag2[13] = "03000DB88137";
char tag3[13] = "03000DC8E026";
char tag4[13] = "03000623FBDD";
char tag5[13] = "03000DB8B701";
void setup()
{
pinMode(7, INPUT);
Wire.begin();
Serial.begin(9600);
pinMode(RFIDResetPin, OUTPUT);
digitalWrite(RFIDResetPin, HIGH);
EEPROM_readAnything(0, timestamp);
setDateTime(); //MUST CONFIGURE IN FUNCTION
pinMode(11, OUTPUT);
}
void loop()
{
buttonState = digitalRead(7);
char tagString[13];
int index = 0;
boolean reading = false;
if (buttonState == HIGH) {
// turn LED on:
printDate();
delay(200);
}
while(Serial.available()){
buttonState = digitalRead(7);
int readByte = Serial.read(); //read next available byte
if(readByte == 2) reading = true; //begining of tag
if(readByte == 3) reading = false; //end of tag
if(reading && readByte != 2 && readByte != 10 && readByte != 13){
//store the tag
tagString[index] = readByte;
index ++;
}
incomingByte = Serial.read();
Serial.println(incomingByte);
}
checkTag(tagString); //Check if it is a match
clearTag(tagString); //Clear the char of all value
resetReader(); //eset the RFID reader
}
void checkTag(char tag[]){
///////////////////////////////////
//Check the read tag against known tags
///////////////////////////////////
int currentTag = 0;
if(strlen(tag) == 0 || strlen(tag) < 12)
return; //empty, no need to continue
if(compareTag(tag, tag1) && lastTag != 1){ // if matched tag1, do this
Serial.println("Scanned tag 1");
lastTag = 1;
currentTag = 1;
printDate();
bleepSucces(11);
}
else
if(compareTag(tag, tag2) && lastTag != 2){ //if matched tag2, do this
Serial.println("Scanned tag 2");
lastTag = 2;
currentTag = 2;
printDate();
bleepSucces(11);
}
else
if(compareTag(tag, tag3) && lastTag != 3){
Serial.println("Scanned tag 3");
lastTag = 3;
currentTag = 3;
printDate();
bleepSucces(11);
}
else
if(compareTag(tag, tag4) && lastTag != 4){
Serial.println("Scanned tag 4");
lastTag = 4;
currentTag = 4;
printDate();
bleepSucces(11);
}
else
if(compareTag(tag, tag5) && lastTag != 5){
Serial.println("Scanned tag 5");
lastTag = 5;
currentTag = 5;
printDate();
bleepSucces(11);
}
else
{
if(currentTag == 0 && lastTag == 0){
Serial.println("Unknown Tag, see below:");
Serial.println(tag); //read out any unknown tag
//resetReader();
lastTag = 0;
bleepFail(11);
}
return;
}
}
void bleepSucces(int pin)
{
digitalWrite(pin, HIGH);
delay(300);
digitalWrite(pin, LOW);
delay(20);
digitalWrite(pin, HIGH);
delay(150);
digitalWrite(pin, LOW);
}
void bleepFail(int pin)
{
digitalWrite(pin, HIGH);
delay(1200);
digitalWrite(pin, LOW);
}
void resetReader()
{ //Reset the RFID reader to read again.
digitalWrite(RFIDResetPin, LOW);
digitalWrite(RFIDResetPin, HIGH);
delay(150);
}
void clearTag(char one[])
{
//clear the char array by filling with null - ASCII 0
//Will think same tag has been read otherwise
for(int i = 0; i < strlen(one); i++)
one[i] = 0;
}
boolean compareTag(char one[], char two[])
{ //compare two tags to see if same,
//strcmp not working 100% so we do this
if (strlen(one) == 0)
return false; //empty
for(int i = 0; i < 12; i++){
if(one[i] != two[i])
return false;
}
return true; //no mismatches
}
void setDateTime()
{
byte second = 20; //0-59
byte minute = 37; //0-59
byte hour = 20; //0-23
byte weekDay = 2; //1-7
byte monthDay = 3; //1-31
byte month = 4; //1-12
byte year = 12; //0-99
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.write(zero); //start
Wire.endTransmission();
}
byte decToBcd(byte val)
{ // Convert normal decimal numbers to binary coded decimal
return val / 10 * 16 + val % 10;
}
byte bcdToDec(byte val)
{ // Convert binary coded decimal to normal decimal numbers
return val / 16 * 10 + val % 16;
}
void printDate()
{
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
//Set variables in our struct
timestamp.hours = hour;
timestamp.minutes = minute;
timestamp.seconds = second;
//Save the timestamp to EEPROM
bytesize = EEPROM_writeAnything(byteaddress, timestamp);
byteaddress = byteaddress + bytesize;
//if (Serial.available() > 0) {
writeSerial();
//}
}
void writeSerial()
{
Serial.print("{");
// read a byte from the current address of the EEPROM
for (int i=0; i <= byteaddress + 4; i = i + 2){
value = EEPROM.read(i);
Serial.print(value, DEC);
if (i < byteaddress+4)
Serial.print(((i-1)%3 == 0) ? ", " : " ");
}
Serial.println("}");
}
Upvotes: 0
Views: 4719
Reputation: 1
When you read from the arduino ide,
if you enter a '2'
that will actually equal 50
as ('0'==48)
.
Try changing the if
statement to readByte != '2'
Unless you are entering some kind of control character actually equal to 2
.
Upvotes: 0
Reputation: 121
Sibster is correct pin 0 and 1 are used for hardware serial and USB connection to PC. use SPI, I2c or software serial for the RFID (depending on what you've got). Also you'd probably be better off using an SD card.
Upvotes: 0
Reputation: 3189
The arduino UNO only has 1 serial port, pin 0 and 1 are actualy connected to the usb port.
You will need to use softwareserial to create a serial port in the software to talk to your RFID Reader and connect the RFID reader to other pins then 0 and 1
Upvotes: 1