#include <avr/interrupt.h>
volatile uint16_t left_distance = 0;
volatile uint16_t right_distance = 0;
volatile uint8_t measure_count = 0;
volatile uint32_t left_sum = 0;
volatile uint32_t right_sum = 0;
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
uint16_t adc_read(uint8_t channel) {
ADMUX = (ADMUX & 0xF8) | channel;
while (ADCSRA & (1 << ADSC));
uint16_t calculate_distance(uint16_t adc_value) {
float voltage = adc_value * (5.0 / 1023.0);
return (uint16_t)(voltage / 0.2);
TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
void update_led_blinking(uint16_t distance) {
} else if (distance < 10) {
left_sum += adc_read(ADC_LEFT);
right_sum += adc_read(ADC_RIGHT);
if (measure_count >= 5) {
left_distance = calculate_distance(left_sum / 5);
right_distance = calculate_distance(right_sum / 5);
uint16_t average_distance = (left_distance + right_distance) / 2;
showcode(average_distance);
update_led_blinking(average_distance);