I’m trying to take in multiple inputs using a shift register and a Interrupt pin on a photon running firmware version 2.0.1
The circuit uses a interrupt to detect any button press and uses a shift register to parse through the buttons and find the button pressed.
Here is the wiring diagram
The code
#define latch_pin A1
#define clock_pin A3
#define data_pin A5
#define input_pin A0
bool menu1 , menu2, menu3, menu4, menu5,menu6, menu7, menu8;
byte Input, Output, Check=1;
int j, count;
void setup(){ //setup
count = 0;
pinMode(clock_pin, OUTPUT);//clock
pinMode(data_pin, OUTPUT);//data
pinMode(latch_pin, OUTPUT);//latch
pinMode(input_pin, INPUT);//Input from buttons
pinMode(D7,OUTPUT);
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV2);
SPI.begin();
SPI.transfer(255);
digitalWrite(latch_pin, HIGH);
digitalWrite(latch_pin, LOW);
Serial.begin(9600);
attachInterrupt(A0, pin_read, RISING); //Interrupt for button press
Serial.println("All Set");
}
void loop(){ //loop
//Blinking LED to check if program is stuck in an infinite loop
digitalWrite(D7,HIGH);
delay(1000);
digitalWrite(D7,LOW);
delay(1000);
}
void pin_read(){ //Interrupt function called on button press
//Identifies which button is pressed
for(j=0; j<50; j++)
delayMicroseconds(1000);
Check=1;
for(j=0; j<8; j++){
SPI.transfer(Check);
digitalWrite(latch_pin, HIGH);
digitalWrite(latch_pin, LOW);
delayMicroseconds(500);
if(digitalRead(input_pin)==HIGH){
takeInput(j);//print the button pressed
}
Check = Check<<1;
}
SPI.transfer(255);
digitalWrite(latch_pin, HIGH);
digitalWrite(latch_pin, LOW);
while(digitalRead(input_pin)==HIGH){}
}
void takeInput(int input){ //Outputs which button is pressed
switch(input){
case 0:
menu1 = true;
Serial.println("Button 1 pressed");
break;
case 1:
menu2 = true;
Serial.println("Button 2 pressed");
break;
case 2:
menu3 = true;
Serial.println("Button 3 pressed");
break;
case 3:
menu4 = true;
Serial.println("Button 4 pressed");
break;
case 4:
menu5 = true;
Serial.println("Button 5 pressed");
break;
case 5:
menu6 = true;
Serial.println("Button 6 pressed");
break;
case 6:
menu7 = true;
Serial.println("Button 7 pressed");
break;
case 7:
menu8 = true;
Serial.println("Button 8 pressed");
break;
}
}
The interrupt function is called infinitely and also prevents OTA updates. The infinite calling starts only after the first button press.
I have tried debugging by using INPUT_PULLUP , changing the resistor values. I have also tried analogRead of the input_pin but it does not have any spikes.