User Tools

Site Tools


project:brmdoor:firmware

This is an old revision of the document!


Brmdoor Firmware

This brmdoor.pde sketch is running on the Arduino. It listens for numbers specifying numbers of seconds to unlock the door for, and sends serial ids of rfid cards detected.

#include <NewSoftSerial.h>

NewSoftSerial rfidSerial(2, 3);
const int lockPin = 13;

int getnum()
{
  char cmdbuf[64]; char c; int i = 0;
  do {
    while (!Serial.available()) delay(1);
    c = Serial.read();
    cmdbuf[i++] = c;
  } while (i < 64 && c != '\n');
  return atoi(cmdbuf);
}

void rfidTrigger(void)
{
  byte MF_GET_SNR[] = {0xAA, 0x00, 0x03,0x25, 0x26, 0x00, 0x00,0xBB};
  for (int i = 0; i < sizeof(MF_GET_SNR); i++) {
    rfidSerial.print(MF_GET_SNR[i]);
  }
}

int rfidParse(byte sn[], int *snl)
{
  char bufp[128], *buf = bufp;
  int len = 0;

  while (rfidSerial.available() > 0) {
     buf[len++] = rfidSerial.read();
  }

  if (*buf++ != '\xaa') return 1; // STX
  buf++; // STATION ID
  byte datalen = *buf++; // DATA LENGTH
  if (datalen != len - 5) return 2;
  byte rstatus = *buf++; // STATUS
  if (rstatus != 0x00 && rstatus != 0xFF) {
    return 3;
  } else {
    memcpy(sn, buf, datalen - 1);
    *snl = datalen - 1;
  }
  buf += datalen - 1;
  buf++; // BCC; TODO: check
  if (*buf++ != '\xbb') return 4; // ETX
  return 0;
}

void setup()
{
  Serial.begin(9600);
  rfidSerial.begin(9600);
  digitalWrite(lockPin, 0);
  pinMode(lockPin, OUTPUT);
  rfidTrigger();
}

void loop() {
  if (rfidSerial.available()) {    
      delay(50);
      byte sn[64]; int snl = 0; int ret;
      if ((ret = rfidParse(sn, &snl)) == 0) {
        int i;
        for (i = 0; i < snl; i++) {
          if (sn[i] < 0x10) Serial.print('0');
          Serial.print(sn[i], HEX);
        }
        Serial.print('\n');
        delay(750);
      } else {
        //Serial.println(ret, DEC);
        delay(250);
      }
      rfidTrigger();
  }
  if (Serial.available()) {
      int seconds = getnum();
      //if (seconds < 10) seconds = 10;
      digitalWrite(lockPin, 1);
      delay(seconds * 1000);
      digitalWrite(lockPin, 0);
  }
}
project/brmdoor/firmware.1296650217.txt.gz · Last modified: 2011/02/02 12:36 by stick