/*
   Arduino code for Individual control over each pin
   Support for 40+ 74HC595 8 bit shift registers
   http://bildr.org/2011/02/74hc595/
*/
#define ECHO_PIN 2
#define TRIG_PIN 3


#define DATA_PIN  8  // Pin connected to DS of 74HC595
#define LATCH_PIN 9  // Pin connected to STCP of 74HC595
#define CLOCK_PIN 10 // Pin connected to SHCP of 74HC595

// How many of the shift registers
#define NUM_SHIFT_REGS 4

const uint8_t numOfRegisterPins = NUM_SHIFT_REGS * 8;

bool registers[numOfRegisterPins];

void setup() {

  Serial.begin(115200);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  clearRegisters();
  writeRegisters();
}

bool toggle = false;

float readDistanceCM() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  int duration = pulseIn(ECHO_PIN, HIGH);
  return duration * 0.034 / 2;
}

void loop() {
/*
  for (uint8_t i = 0; i < 16; i++) {
    if (i % 2 == 0) {
      setRegisterPin(i, toggle);
    } else {
      setRegisterPin(i, !toggle);
    }
    writeRegisters();
  }
  toggle = !toggle;
  delay(500);
*/
 float distance = readDistanceCM();
bool isNearby = false; 

for (int i=0; i<30; i++){
isNearby= distance <((i+1)*10); 
if(isNearby) {
setRegisterPin(i, toggle);
writeRegisters();

}
else{
setRegisterPin(i, !toggle);
writeRegisters();
}
}
/*
if(isNearby) {
setRegisterPin(2, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(2, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(3, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(3, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(4, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(4, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(5, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(5, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(6, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(6, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(7, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(7, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(8, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(8, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(9, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(9, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(10, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(10, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(11, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(11, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(12, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(12, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(13, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(13, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(14, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(14, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(15, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(15, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(16, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(16, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(17, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(17, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(18, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(18, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(19, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(19, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(20, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(20, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(21, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(21, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(22, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(22, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(23, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(23, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(24, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(24, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(25, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(25, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(26, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(26, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(27, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(27, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(28, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(28, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(29, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(29, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(30, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(30, toggle);
writeRegisters();
delay(1000);
}
if(isNearby) {
setRegisterPin(31, !toggle);
writeRegisters();
delay(1000);
}
else{
setRegisterPin(31, toggle);
writeRegisters();
delay(1000);
}
*/


Serial.print("Measured distance: ");
Serial.println(readDistanceCM());

}





void clearRegisters() {
  // Reset all register pins
  for (int i = numOfRegisterPins - 1 ; i >= 0; i--) {
    registers[i] = LOW;
  }
}

void setRegisterPin(int index, int value) {
  // Set an individual pin HIGH or LOW
  registers[index] = value;
}

void writeRegisters() {
  // Set and display registers
  digitalWrite(LATCH_PIN, LOW);

  for (int i = numOfRegisterPins - 1; i >= 0; i--) {
    digitalWrite(CLOCK_PIN, LOW);
    digitalWrite(DATA_PIN, registers[i]);
    digitalWrite(CLOCK_PIN, HIGH);
  }

  digitalWrite(LATCH_PIN, HIGH)
;
}
74HC595
74HC595
74HC595
74HC595