Контроль мертвых зон на ардуино

Sonerik
Offline
Зарегистрирован: 14.06.2020

Решил сделать простенький контроль мертвых зон на базе ардуино и ультразвуковых датчиков расстояния( по типу как на парктронике). Но рри тестировании появился неприятный глюк. Когда в пределах измерения датчика что-то есть( до метров пяти), то все работает. Но когда ничего нет, то он как-бы зависает и диоды которые должны сигнализировать горят постоянно. Скеч использовал вот этот 

Модератор: Вставьте код по правилам форума. Ссылка есть в #1 посте "Песочницы".

Можно ли как-то это исправить? Я пока чайник в этом, напишите что добавить нужно в скеч

b707
Offline
Зарегистрирован: 26.05.2017

Спроси у автора кода

Sonerik
Offline
Зарегистрирован: 14.06.2020

Спрашивал. Говорит что у него вроде все работает((

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Sonerik пишет:
Спрашивал. Говорит что у него вроде все работает((
С чем мы его и поздравляем.

Sonerik
Offline
Зарегистрирован: 14.06.2020
#define Left_SW_Pin 0 // пин переключателя указателя поворота (левый)
#define Right_SW_Pin 1 // пин переключателя указателя поворота (правый)
#define DZ1_Trig_Pin 2 // пин триггера датчика 1 (правый)
#define DZ2_Trig_Pin 4 // пин триггера датчика 2 (левый)
#define LZ_Led_Pin 11 // пин светодиода левой мертвой зоны
#define BUZZ_Pin 12 // пин звукоизлучателя
#define RZ_Led_Pin 13 // пин светодиода правой мертвой зоны
int count_timer = 0;
int j, d;
void setup()
{ // Назначаем выходами пины всех тригеров и светодиодов.
pinMode(DZ1_Trig_Pin, OUTPUT);
pinMode(DZ2_Trig_Pin, OUTPUT);
pinMode(LZ_Led_Pin, OUTPUT);
pinMode(BUZZ_Pin, OUTPUT);
pinMode(RZ_Led_Pin, OUTPUT);
j = 1000;
d = 1000;
}
int distance(int Data) //Возвращает дистанцию с датчика
{
int time_us;
digitalWrite(Data, HIGH); // Подаем сигнал на выход
//микроконтроллера
delayMicroseconds(15); // Удерживаем 10 микросекунд
digitalWrite(Data, LOW); // Затем убираем
time_us=pulseIn(Data+1, HIGH); // Замеряем длину импульса
return time_us/58; // Пересчитываем в сантиметры
}
void loop()
{
digitalWrite(LZ_Led_Pin, LOW); // отключение левого светодиода
digitalWrite(RZ_Led_Pin, LOW); // отключение правого светодиода светодиоды
if (d<100) // проверка — левая сторона
digitalWrite(LZ_Led_Pin, HIGH); //включаем красный светодиод
else //иначе
digitalWrite(LZ_Led_Pin, LOW); //выключаем
if (j<100) // Проверка — правая сторона
digitalWrite(RZ_Led_Pin, HIGH); //включаем красный светодиод
else //иначе
digitalWrite(RZ_Led_Pin, LOW); //выключаем*/
if (!count_timer)
{ // Заставляем пищалку пищать в течение 200 миллисекунд.
// Если это нужно.
if ((digitalRead(Left_SW_Pin)&&d<80) || (digitalRead(Right_SW_Pin)&&j<80))
tone(BUZZ_Pin, 1500, 200); // поиграть с тоном и длительностью
count_timer = 20; //Устанавливаем таймер паузы оповещения
}else
count_timer--;
j= distance (DZ2_Trig_Pin); // Считываем дистанцию с левого
d= distance (DZ1_Trig_Pin); //и правого канала данных
delay (100); // пауза в 0,1 сек перед повтором цикла
}

 

Sonerik
Offline
Зарегистрирован: 14.06.2020

sadman41
Offline
Зарегистрирован: 19.10.2016

1) У pulseIn есть третий параметр;
2) Между измерениями сонаром необходима пауза в 50-60 мс.

А вообще - прочитайте раздел "Возвращаемое значение" и подумайте, почему j и d меньше ста при больших расстояниях
http://arduino.ru/Reference/PulseIn