/*
  Ultrasonic Sensor using Franzininho, HC-SR04 and 74HC595
  by Anderson Costa with ❤ for the Wokwi community
  Visit https://wokwi.com to learn about the Wokwi Simulator
  Visit https://franzininho.com.br to learn about the Franzininho
*/

#define TRIG_PIN  A0
#define ECHO_PIN  A3

#define DATA_PIN  0  // Pino conectado ao DS do 74HC595
#define LATCH_PIN 1  // Pino conectado ao STCP do 74HC595
#define CLOCK_PIN 2  // Pino conectado ao SHCP do 74HC595

// Quantos registros de deslocamento
#define NUM_SHIFT_REGS 1

const uint8_t numOfRegisterPins = NUM_SHIFT_REGS * 8;

bool registers[numOfRegisterPins];

uint16_t duration = 0;
uint32_t interval = 0;

float distance = 0;

void setup() {
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  clearRegisters();
  writeRegisters();
}

void loop() {
  // Verifica a cada 100 milissegundos
  if ((millis() - interval) >= 100) {
    interval = millis();

    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(5);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);

    // Tempo de leitura do trigger ao echo
    duration = pulseIn(ECHO_PIN, HIGH);

    // Calcula a distância
    distance = (duration / 2) / 29;

    // Retorna o valor da distância e converte para o número de bits do registrador
    uint8_t value = map(distance, 2, 400, 0, numOfRegisterPins);

    for (uint8_t i = 0; i < numOfRegisterPins; i++) {
      if (i >= value) {
        setRegisterPin(i, HIGH);
      } else {
        setRegisterPin(i, LOW);
      }
    }
    writeRegisters();
  }
}

void clearRegisters() {
  // Coloca em nível baixo todos os pinos do registrador
  for (int i = numOfRegisterPins - 1; i >= 0; i--) {
    registers[i] = LOW;
  }
}

void setRegisterPin(int index, int value) {
  // Define um pino individual como HIGH ou LOW
  registers[index] = value;
}

void writeRegisters() {
  // Define e exibe os registros
  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);
}
franzininho:GND.1
franzininho:VCC.1
franzininho:PB4
franzininho:PB5
franzininho:PB3
franzininho:PB2
franzininho:PB1
franzininho:PB0
franzininho:VIN
franzininho:GND.2
franzininho:VCC.2
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
74HC595
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC