cattledog:
This compiles but is untested. storedPatterns can go in progmem if a large number of them are required
const byte relay1 = 4;
const byte relay2 = 5;
const byte relay3 = 6;
const byte relay4 = 7;
const byte relay5 = 8;
const byte relay6 = 9;
const byte relay7 = 10;
const byte relay8 = 11;
//#include <Wiegand.h>//library not actually used
//WIEGAND wg;
// Connect D0 to Pin 2 and D1 to Pin 3 on an Arduino UNO
const byte PinD0 = 2;
const byte PinD1 = 3;
const byte IntD0 = 0;
const byte IntD1 = 1;
volatile unsigned BitCount;
volatile byte Bits[26];
volatile unsigned long LastBitTime;
const byte storedPattern[9][26] =
{
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,0,1,1},//1469
{1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,0,1,1,0},//6219
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,0,0,0},//2020
{1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0},//5123
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0},//0617
{1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,1,1,1,0,0},//8670
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,1,0},//3313
{1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,0,0,1,1,0,1,1},//7117
{1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,1,1},//9731
};
byte matchPattern = 99;
void setup() {
Serial.begin(9600);
// wg.begin();
pinMode(PinD0, INPUT_PULLUP);// Set D0 pin as input
pinMode(PinD1, INPUT_PULLUP);// Set D1 pin as input
attachInterrupt(IntD0, ReadD0, FALLING); // Hardware interrupt - high to low pulse
attachInterrupt(IntD1, ReadD1, FALLING); // Hardware interrupt - high to low pulse
//pinMode(2, INPUT_PULLUP);//duplicate
//pinMode(3, INPUT_PULLUP);//duplicate
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
pinMode(relay5, OUTPUT);
pinMode(relay6, OUTPUT);
pinMode(relay7, OUTPUT);
pinMode(relay8, OUTPUT);
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
digitalWrite(relay5, LOW);
digitalWrite(relay6, LOW);
digitalWrite(relay7, LOW);
digitalWrite(relay8, LOW);
}
//interrupt service routines
void ReadD0() {
if (BitCount < 100) {
LastBitTime = millis();
Bits[BitCount++] = 0;
}
}
void ReadD1() {
if (BitCount < 100) {
LastBitTime = millis();
Bits[BitCount++] = 1;
}
}
void loop() {
byte localBits[26];
// Grab volatile variables with interrupts disabled
noInterrupts();
unsigned long interval = millis() - LastBitTime;
unsigned count = BitCount;
interrupts();
// Process data when we have new bits, but not for a while.
if (interval > 100 && count != 0)
{
noInterrupts();
for (unsigned i = 0; i < count; i++) {
localBits[i] = Bits[i];
}
BitCount = 0;
interrupts();
Serial.print(count);
Serial.print(" bits: ");
for (unsigned i = 0; i < count; i++) {
Serial.print(localBits[i]);
if (i % 8 == 7)
Serial.write(' ');
}
Serial.println();
//test for match with memcmp
matchPattern = 99;//reset to no match
for (byte i = 0; i <= 9; i++)
{
if ((memcmp(localBits, storedPattern[i], 26)) == 0)
{
matchPattern = i;
}
}
Serial.print("Entered number matches ");
switch (matchPattern)
{
case 0:
Serial.println("1469");
digitalWrite(relay1, HIGH);
break;
case 1:
Serial.println("6219");
digitalWrite(relay2, HIGH);
break;
case 2:
Serial.println("2020");
digitalWrite(relay3, HIGH);
break;
case 3:
Serial.println("5123");
digitalWrite(relay4, HIGH);
break;
case 4:
Serial.println("0617");
digitalWrite(relay5, HIGH);
break;
case 5:
Serial.println("8670");
digitalWrite(relay6, HIGH);
break;
case 6:
Serial.println("3313");
digitalWrite(relay7, HIGH);
break;
case 7:
Serial.println("7117");
digitalWrite(relay8, HIGH);
break;
case 8:
Serial.println("9731");
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
digitalWrite(relay5, LOW);
digitalWrite(relay6, LOW);
digitalWrite(relay7, LOW);
digitalWrite(relay8, LOW);
break;
default:
Serial.println("No Code Match");//case 99
break;
}
}
}
Tested it and it works great so far. Seems like I completely went the wrong way in all of my attempts. Thanks so much!