void shiftOut( byte value ) {
  pinMode( D3, OUTPUT );
  for( byte bit = 0; bit < 8; bit++ ) {
    digitalWrite( D3, value >> bit & 1 ); // data
      digitalWrite( D2, HIGH ); // clk
      delay( 250 );
      digitalWrite( D2, LOW );
      delay( 250 );
    digitalWrite( D3, LOW );
  }
  delay( 500 ); // stop
  pinMode( D3, INPUT );
}



void setup() {
  Serial.begin(115200);
  Serial.println("Hello, STM32!");
  pinMode( D2, OUTPUT );
  pinMode( D3, INPUT ); // defauls safe
  pinMode( D8, INPUT_PULLUP );
  pinMode( D9, INPUT_PULLUP );
  attachInterrupt( D8, handleBit, RISING );

}

void loop() {

  shiftOut( 'S' );
  shiftOut( 'O' );
  shiftOut( 'S' );
  delay( 1000 );

//  digitalWrite( D2, HIGH );
//  Serial.println("High");
//  delay( 500 );
//  digitalWrite( D2, LOW );
//  Serial.println("Low");
//  delay( 500 );
}


const byte IDLE = 0;
const byte RECEIVING = 1;

void handleBit() {
  static int state = IDLE;
  static byte count = 0;
  static unsigned char data = 0;
  if( state == IDLE ) {
    state = RECEIVING;
    count = 0;
    data = 0;
  }
  byte bit = digitalRead( D9 );
  data = data | ( bit << count ); // set bit in data
  Serial.println( String( count ) + " : " + String( bit ) + " data " + String( data, BIN ) );
  count++;
  if( count == 8 ) {
    state = IDLE; // done for this byte of data 
    Serial.println( "Data : "+String( data, BIN )+ " " + String( (char) data ) );
  }
}