Подключаем датчик расстояния HC-SR04 к плате Arduino Nano, в среде программирования Arduino IDE.

В данном уроке мы с Вами подключим датчик расстояния HS-SR04  к плате Arduino Nano, без использования библиотек. А так же добавим фильтрацию данных для устранения случайных ошибок (помех) при измерении. Алгоритм работы простой: на вход Trig подается импульс с длительностью 10 микросекунды, после чего датчик посылает звуковой импульс на частоте 40кГц. После того, когда сигнал вернется обратно, ножка Echo устанавливается в единицу и по истечению времени, которое пропорционально времени отправки – получения импульса  – устанавливается в ноль: Зная скорость звука (340 м/с) и учитывая, что звук проходит два расстояния (до предмета и обратно) -получаем, что звук проходит 1 сантиметр за 58,8 микросекунд. Нам остается настроить таймер, который будет запускаться по высокому уровню сигнала Echo и останавливаться после перехода уровня сигнала Echo с 1 в 0. Зная скорость счета таймера, можно высчитать расстояние которое прошел звук и как следствие расстояние до предмета.
int echoPin = 11;
int trigPin = 12;

long duration=0;
long cm=0;
int temp[10]={0};// храним выборку измерений
int insert =0;
int j=0;

void setup() {
   pinMode(trigPin, OUTPUT);
   pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop() {
  for (int i=0;i<=9;i++){
     digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  temp[i]=pulseIn(echoPin, HIGH);
 }
for(int i=0;i<=9;i++){//сортировка
   insert = temp[i];
j=i-1;
while((j>=0)and(temp[j]>insert)){
      temp[j+1]=temp[j];
       j--;
   }
  temp[j+1]=insert;
 }
duration=0;
for(int i=2;i<=7;i++){
      duration+=temp[i]/58,8; // преобразуем время в расстояние
  }
cm = duration / 6;
Serial.print("cm=");
Serial.println(cm);
delay(500);
}
В данном программном коде мы использовали функцию pulseIn(pin, value, timeout), которая возвращает длину сигнала в миллисекундах, где:
pin — номер ножки;
value — уровень сигнала для запуска отсчета;
timeout — время ожидания сигнала в миллисекундах, по умолчанию стоит 1 секунда.

В случаи ошибки измерения или истечения времени ожидания,  — функция выдает ноль.