Terima data serial USB di Arduino yang dikombinasikan dengan pembaca RFID

Saya sedang mengerjakan proyek Arduino. Papan Arduino menyimpan stempel waktu dan kode RFID ke ROM ketika tag RFID dipindai. Data RFID diterima oleh Serial.read() tetapi sekarang saya perlu mendapatkan data yang disimpan dari ROM Arduino ke komputer saya.

Untuk melakukan itu saya harus membaca data serial (dalam hal ini menggunakan C#) dan itu berfungsi dengan baik. Tetapi karena papan Arduino saya perlu mengetahui kapan harus menulis data ke serial, saya harus mengirimkan perintah terlebih dahulu ke papan Arduino.

Menggunakan 'Monitor Serial' Arduino IDE, saya mencoba mengirim beberapa data tetapi tidak diterima oleh Arduino. Ketika saya menempatkan tag RFID di depan RFID, papan Arduino menerima data. Jadi menurut saya input port serial dicadangkan oleh pembaca RFID? Apakah itu mungkin?

Apakah ada yang tahu solusi untuk masalah saya? Perhatikan bahwa ini adalah proyek Arduino pertama saya dan C adalah hal baru bagi saya.

Beberapa informasi:

  • Arduino UNO
  • Pembaca RFID: Inovasi ID12
  • Modul Jam RTC
  • C
  • C#
  • .BERSIH

Kode di bawah ini adalah keseluruhan proyek Arduino.

#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("}");     
}

person Boyd    schedule 05.04.2012    source sumber


Jawaban (3)


Arduino UNO hanya memiliki 1 port serial, pin 0 dan 1 sebenarnya terhubung ke port usb.

Anda perlu menggunakan softwareserial untuk membuat port serial di perangkat lunak agar dapat berkomunikasi dengan Pembaca RFID dan sambungkan pembaca RFID ke pin lain lalu 0 dan 1

person Sibster    schedule 05.04.2012

Kakak benar pin 0 dan 1 digunakan untuk serial hardware dan koneksi USB ke PC. gunakan SPI, I2c atau serial perangkat lunak untuk RFID (tergantung apa yang Anda punya). Anda juga mungkin lebih baik menggunakan kartu SD.

person Stkabi    schedule 06.04.2012

Saat Anda membaca dari ide Arduino,
jika Anda memasukkan '2' maka 50 akan sama dengan ('0'==48).

Coba ubah pernyataan if menjadi readByte != '2'

Kecuali Anda memasukkan karakter kontrol yang sebenarnya sama dengan 2.

person Paul    schedule 28.06.2012