const byte latchPin = 5;        // Data in 
const byte clockPin = 18;       // klockpin
const byte dataPin = 19;        // Misopin 
uint32_t oldOptionSwitch = 0;   // Föregående data
const int pulseWidth = 10;      // Pulstid

void setup() {
  Serial.begin(115200);
  Serial.println("Turn on of the switches");
  Serial.println("Top row is switch 0 (right) to switch 7 (left)");
  Serial.println("Second row is 8 to 15, and so on");

  pinMode( clockPin, OUTPUT);     // Klocksignal (låg)
  pinMode( latchPin, OUTPUT);     // Kopera input in i registerna, idle high
  digitalWrite(latchPin, HIGH);
  
}

void loop() {
  digitalWrite( latchPin, LOW);
  delayMicroseconds( pulseWidth);
  digitalWrite( latchPin, HIGH);

  uint32_t optionSwitch = 0;
  for( int i=24; i>=0; i-=8)
    { 
      optionSwitch |= (( uint32_t) ReadOne165()) << i;
    }
  for(int i = 0; i<32; i++)
    {
      if(bitRead( optionSwitch, i) !=bitRead( oldOptionSwitch, i))
      {
      Serial.print("Switch ");
      if( i < 10)
      Serial.print( " ");
      Serial.print(i);
      Serial.print(" is now ");
      Serial.println( bitRead( optionSwitch, i) == 0 ? "down *" : " up *");
      }
    }
  
  oldOptionSwitch = optionSwitch;
  delay( 25);
}
 byte ReadOne165()
 {
  byte ret = 0x00;
  for( int i=7; i>0; i--)
  {
    if( digitalRead( dataPin) == HIGH)
      bitSet( ret, i);

      digitalWrite( clockPin, HIGH);
      delayMicroseconds( pulseWidth);
      digitalWrite( clockPin, LOW);
  }
  return( ret);
 }  
74HC165
74HC165
74HC165
74HC165