Ich arbeite an einem Arduino-Projekt. Die Arduino-Karte speichert einen Zeitstempel und RFID-Code im ROM, wenn ein RFID-Tag gescannt wird. Die RFID-Daten werden von Serial.read()
empfangen, aber jetzt muss ich die gespeicherten Daten von meinem Arduino ROM auf meinen Computer holen.Empfangen Sie serielle USB-Daten in Arduino in Kombination mit RFID-Reader
Dazu muss ich die seriellen Daten lesen (in diesem Fall mit C#) und das funktioniert gut. Aber da mein Arduino-Board wissen muss, wann Daten in die serielle Schnittstelle geschrieben werden sollen, muss ich zuerst einen Befehl an die Arduino-Platine senden.
Mit "Serial Monitor" von Arduino IDE habe ich versucht, einige Daten zu senden, aber es wird nicht vom Arduino empfangen. Wenn ich ein RFID-Tag vor das RFID-Element lege, empfängt das Arduino-Board Daten. So scheint es mir, als ob der Eingang der seriellen Schnittstelle irgendwie vom RFID-Leser reserviert ist? Ist das überhaupt möglich?
Kennt jemand eine Lösung für mein Problem? Beachten Sie, dass dies mein erstes Arduino-Projekt ist und C für mich neu ist.
Einige Informationen:
- Arduino UNO
- RFID Reader: Innovationen ID12
- RTC Clock Modul
- C
- C#
- .NET
Der Code drunter ist das ganze Arduino-Projekt.
#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("}");
}