Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
5.8 kB
15
Indexable
Never
/*
  Reading multiple RFID tags, simultaneously!
  By: Nathan Seidle @ SparkFun Electronics
  Date: October 3rd, 2016
  https://github.com/sparkfun/Simultaneous_RFID_Tag_Reader

  Constantly reads and outputs any tags heard

  If using the Simultaneous RFID Tag Reader (SRTR) shield, make sure the serial slide
  switch is in the 'SW-UART' position
*/
//#include <esp_task_wdt.h>
#include <Esp.h>
#include <SoftwareSerial.h> //Used for transmitting to the device

SoftwareSerial softSerial(D3, D1); //RX, TX

#include "SparkFun_UHF_RFID_Reader.h" //Library for controlling the M6E Nano module
RFID nano; //Create instance

void setup()
{
//  esp_task_wdt_init(30, false);

  Serial.begin(115200);
  ESP.wdtDisable();
  Serial.print("test 1");
  while (!Serial) { yield(); } //Wait for the serial port to come online
  Serial.println("Twest 9");
  if (setupNano(38400) == false) //Configure nano to run at 38400bps
  {
//    Serial.println("test 10");
    Serial.println(F("Module failed to respond. Please check wiring."));
    while (1) { yield(); } //Freeze!
  }
  Serial.print("test 2");

  nano.setRegion(REGION_NORTHAMERICA); //Set to North America

  nano.setReadPower(500); //5.00 dBm. Higher values may caues USB port to brown out
  //Max Read TX Power is 27.00 dBm and may cause temperature-limit throttling

  Serial.println(F("Press a key to begin scanning for tags."));
  while (!Serial.available()) { yield(); }; //Wait for user to send a character
  Serial.read(); //Throw away the user's character

  nano.startReading(); //Begin scanning for tags
  Serial.print("test 3");
}

void loop()
{
//  esp_task_wdt_init(10, false);
  Serial.print("test 4");
  if (nano.check() == true) //Check to see if any new data has come in from module
  {
    byte responseType = nano.parseResponse(); //Break response into tag ID, RSSI, frequency, and timestamp

    if (responseType == RESPONSE_IS_KEEPALIVE)
    {
      Serial.println(F("Scanning"));
    }
    else if (responseType == RESPONSE_IS_TAGFOUND)
    {
      //If we have a full record we can pull out the fun bits
      int rssi = nano.getTagRSSI(); //Get the RSSI for this tag read

      long freq = nano.getTagFreq(); //Get the frequency this tag was detected at

      long timeStamp = nano.getTagTimestamp(); //Get the time this was read, (ms) since last keep-alive message

      byte tagEPCBytes = nano.getTagEPCBytes(); //Get the number of bytes of EPC from response

      Serial.print(F(" rssi["));
      Serial.print(rssi);
      Serial.print(F("]"));

      Serial.print(F(" freq["));
      Serial.print(freq);
      Serial.print(F("]"));

      Serial.print(F(" time["));
      Serial.print(timeStamp);
      Serial.print(F("]"));

      //Print EPC bytes, this is a subsection of bytes from the response/msg array
      Serial.print(F(" epc["));
      for (byte x = 0 ; x < tagEPCBytes ; x++)
      {
        if (nano.msg[31 + x] < 0x10) Serial.print(F("0")); //Pretty print
        Serial.print(nano.msg[31 + x], HEX);
        Serial.print(F(" "));
        yield();
      }
      Serial.print(F("]"));

      Serial.println();
    }
    else if (responseType == ERROR_CORRUPT_RESPONSE)
    {
      Serial.println("Bad CRC");
    }
    else
    {
      //Unknown response
      Serial.print("Unknown error");
    }
  }
}

//Gracefully handles a reader that is already configured and already reading continuously
//Because Stream does not have a .begin() we have to do this outside the library
boolean setupNano(long baudRate)
{
  Serial.println("test a");
  ESP.wdtFeed();
  nano.begin(softSerial); //Tell the library to communicate over software serial port
  Serial.println("test b");

  //Test to see if we are already connected to a module
  //This would be the case if the Arduino has been reprogrammed and the module has stayed powered
  yield();
  ESP.wdtFeed();
  softSerial.begin(baudRate); //For this test, assume module is already at our desired baud rate
  Serial.println("test c");
  while (softSerial.isListening() == false) { ESP.wdtFeed(); } //Wait for port to open
  Serial.println("test d");
  //About 200ms from power on the module will send its firmware version at 115200. We need to ignore this.
  while (softSerial.available()) {
    softSerial.read();
    ESP.wdtFeed();
  }
  Serial.println("test e");

  yield();
//  nano.getVersion();
  Serial.println("test f");


  if (nano.msg[0] == ERROR_WRONG_OPCODE_RESPONSE)
  {
    Serial.println("test aa");
    //This happens if the baud rate is correct but the module is doing a ccontinuous read
    nano.stopReading();

    Serial.println(F("Module continuously reading. Asking it to stop..."));

    delay(1500);
  }
  else
  {
    //The module did not respond so assume it's just been powered on and communicating at 115200bps
    Serial.println("test ab");
    softSerial.begin(115200); //Start software serial at 115200
    Serial.println("test ac");
    yield();
    nano.setBaud(baudRate); //Tell the module to go to the chosen baud rate. Ignore the response msg
    Serial.println("test ad");

    softSerial.begin(baudRate); //Start the software serial port, this time at user's chosen baud rate
    Serial.println("test ae");

    delay(250);
    Serial.println("test af");
  }
  Serial.println("test g");
  //Test the connection
  nano.getVersion();
  if (nano.msg[0] != ALL_GOOD) return (false); //Something is not right

  //The M6E has these settings no matter what
  nano.setTagProtocol(); //Set protocol to GEN2

  nano.setAntennaPort(); //Set TX/RX antenna ports to 1
  Serial.print("test 7");
  return (true); //We are ready to rock
}