const int Trig = 8; //Вывод, к которому подключен контакт датчика Trig.
const int Echo = 9; //Вывод, к которому подключен контакт датчика Echo.
const int BUZ = 10; //Вывод, к которому подключен контакт зуммера.
int tones[7] = {0, 262, 294, 330, 349, 440, 523}; //Массив частот для зуммера.
unsigned int time_us = 0; //Переменная для хранения времени получения отклика.
unsigned int distance_cm = 0; //Переменная для хранения расстояния.
void setup() {
pinMode(Trig, OUTPUT); //Установка вывода в режим выхода.
pinMode(Echo, INPUT); //Установка вывода в режим входа.
pinMode(BUZ, OUTPUT); //Установка вывода зуммера в режим выхода.
//Установка выводов светодиодов в режим выхода.
for (int i = 2; i <= 7; i++) {
pinMode(i, OUTPUT);
}
}
void loop() {
noTone(BUZ);
digitalWrite(Trig, HIGH); //С датчика подается ультразвуковой сигнал.
delayMicroseconds(10); //Подача сигнала длится 10 микросекунд.
digitalWrite(Trig, LOW); //Подача сигнала прекращается.
time_us = pulseIn(Echo, HIGH); //Определение длительности прохождения импульса.
distance_cm = time_us/58; //Пересчет в сантиметры. Коэффициент пересчета 58.
//Если произошло зависание, попытаться переназначить режим вывода, к которому
//подключен контакт Echo.
if(distance_cm == 0) {
pinMode(Echo, OUTPUT);
digitalWrite(Echo, LOW);
pinMode(Echo, INPUT);
return;
}
turnOnLeds(); //Включить нужное количество светодиодов.
delay(100); //Задержка в 100 мс.
}
void turnOnLeds() {
//Определить количество светодиодов.
int turn_leds = 0;
if (distance_cm < 20) {
turn_leds = 6;
} else if (distance_cm < 50) {
turn_leds = 5;
} else if (distance_cm < 90) {
turn_leds = 4;
} else if (distance_cm < 150) {
turn_leds = 3;
} else if (distance_cm < 250) {
turn_leds = 2;
} else if (distance_cm < 350) {
turn_leds = 1;
}
for (int i = 6; i > 0; i--) { //Зажечь в цикле требуемое количество
//светодиодов.
boolean state = (i >= (7 - turn_leds));
digitalWrite(i + 1, state);
}
if (turn_leds > 0) { //Подать звук, если нужно.
tone(BUZ, tones[turn_leds], 50);
}
}