Interrupts not working HidProxWeigand on Zero

I am trying to use the HidProxWeigand library from github with 2 HID iclass readers on a Zero.

The code works fine with one reader, but when a second reader is used only one or the readers outputs any data.

Can someone please help me with why this doesn't work.

Thank you.

/*
    Advanced HidProxWiegand usage example.
 */

 #include <Arduino.h>
 #include "HidProxWiegand.h"

 #define PIN_RDR1_DATA0 2        // The pin to use for reader 1, DATA 0.
 #define PIN_RDR1_DATA1 3        // The pin to use for reader 1, DATA 1.
 #define PIN_RDR2_DATA0 5        // The pin to use for reader 2, DATA 0.
 #define PIN_RDR2_DATA1 6        // The pin to use for reader 2, DATA 1.

 // Reader 1 outputs.
 //#define PIN_RDR1_BUZZER 6
 //#define PIN_RDR1_GREEN_LED 7
 //#define PIN_RDR1_RED_LED 8

 //Reader 2 outputs.
 //#define PIN_RDR2_BUZZER 9
 //#define PIN_RDR2_GREEN_LED 10
 //#define PIN_RDR2_RED_LED 11

 ProxReaderInfo* reader1;   // Card reader 1.
 ProxReaderInfo* reader2;   // Card reader 2.

 // Callback for handling card reads from reader 1.
 void cardRead1Handler(ProxReaderInfo* reader) {
     Serial.print(F("Card read: "));
     Serial.print(reader->facilityCode);
     Serial.print(F(":"));
     Serial.println(reader->cardCode);

     // Here you can add logic to see if the card that was read was actually
     // valid or whatever. For example: reading stored card numbers from EEPROM
     // and looking for a match. Ideal for access control applications.
     //
     // This would also be where you would want to change state of the buzzer
     // and LEDs on the reader.
     //digitalWrite(PIN_RDR1_BUZZER, HIGH);
     //digitalWrite(PIN_RDR1_RED_LED, LOW);
     //digitalWrite(PIN_RDR1_GREEN_LED, HIGH);
     //delay(500);
     //digitalWrite(PIN_RDR1_BUZZER, LOW);
     //digitalWrite(PIN_RDR1_GREEN_LED, LOW);
     //digitalWrite(PIN_RDR1_RED_LED, HIGH);
 }

 void cardRead2Handler(ProxReaderInfo* reader) {
     Serial.print(F("Card read: "));
     Serial.print(reader->facilityCode);
     Serial.print(F(":"));
     Serial.println(reader->cardCode);

     //digitalWrite(PIN_RDR2_BUZZER, HIGH);
     //digitalWrite(PIN_RDR2_RED_LED, LOW);
     //digitalWrite(PIN_RDR2_GREEN_LED, HIGH);
     //delay(500);
     //digitalWrite(PIN_RDR2_BUZZER, LOW);
     //digitalWrite(PIN_RDR2_GREEN_LED, LOW);
     //digitalWrite(PIN_RDR2_RED_LED, HIGH);
 }

 // Handle interrupt for reader 1, DATA 0.
 void handleInterrupt0() {
     if (reader1 != NULL) {
         reader1->ISR_Data0();
     }
 }

 // Handle interrupt for reader 1, DATA 1.
 void handleInterrupt1() {
     if (reader1 != NULL) {
         reader1->ISR_Data1();
     }
 }

 // Handle interrupt for reader 2, DATA 0.
 void handleInterrupt2() {
     if (reader2 != NULL) {
         reader2->ISR_Data0();
     }
 }

 // Handle interrupt for reader 2, DATA 1.
 void handleInterrupt3() {
     if (reader2 != NULL) {
         reader2->ISR_Data1();
     }
 }

 void setup() {
     Serial.begin(9600);
     while (!Serial) {
         delay(10);
     }

     // Create the readers and attach them to the system.
     reader1 = HidProxWiegand.addReader(PIN_RDR1_DATA0, PIN_RDR1_DATA1, cardRead1Handler);
     reader2 = HidProxWiegand.addReader(PIN_RDR2_DATA0, PIN_RDR2_DATA1, cardRead2Handler);

     // Attach interrupt handlers for readers 1 and 2.
     HidProxWiegand_AttachReaderInterrupts(PIN_RDR1_DATA0, PIN_RDR1_DATA1, handleInterrupt0, handleInterrupt1);
     HidProxWiegand_AttachReaderInterrupts(PIN_RDR2_DATA0, PIN_RDR2_DATA1, handleInterrupt2, handleInterrupt3);

     // Init reader 1 outputs.
     //pinMode(PIN_RDR1_BUZZER, OUTPUT);
     //digitalWrite(PIN_RDR1_BUZZER, LOW);
     //pinMode(PIN_RDR1_GREEN_LED, OUTPUT);
     //digitalWrite(PIN_RDR1_GREEN_LED, LOW);
     //pinMode(PIN_RDR1_RED_LED, OUTPUT);
     //digitalWrite(PIN_RDR1_RED_LED, HIGH);

     // Init reader 2 outputs.
     //pinMode(PIN_RDR2_BUZZER, OUTPUT);
     //digitalWrite(PIN_RDR2_BUZZER, LOW);
     //pinMode(PIN_RDR2_GREEN_LED, OUTPUT);
     //digitalWrite(PIN_RDR2_GREEN_LED, LOW);
     //pinMode(PIN_RDR2_RED_LED, OUTPUT);
     //digitalWrite(PIN_RDR2_RED_LED, HIGH);
 }

 void loop() {
     // Process any cards that have been read.
     HidProxWiegand.loop();
 }

As I understand it the HidProxWiegand library uses the pin change interrupt mechanism because it was based on code I originally wrote.

But as I never intended for it to be used on a Zero and have not looked at the zero I do not know if the pin change mechanism is the same on a zero as the Uno.

If it is then maybe you can try some different pin numbers for the data signals.
Sorry I can't be more helpful, but perhaps it gives you something to pull on.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.