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