Появилась проблема, не могу придумать логику для задачи, которую придумал. Написал код и пытаюсь добавить функцию, задача заключается в следующем: Если расстояние до объекта больше 10 см, то ардуино держит сервопривод под углом в 90 градусов, если расстояние меньше 5 см, то повернуть сервопривод до нуля градусов на 3 секунды. Прошу помощи именно с написанием кода.
Да пробовал, расстояние получил, перевёл в сантиметры для удобства, сервопривод тоже работает. Но я не могу придумать сам код именно для действия : "Если датчик выдаёт, к примеру, меньше 5, то сервопривод поворачивается на 0 градусов на 3 секунды". Но у меня получается только повернуть сервопривод, до тех пор, пока показания датчика остаются "Меньше 5 см". То есть, мне нужно отследить момент, когда показания датчика стали таковыми и повернуть сервопривод на три секунды, а не повернуть сервопривод, пока показания остаются меньше пяти. У меня есть лишь момент, чтобы засечь факт того, что показания датчика стали "меньше пяти сантиметров"
Ну, померили расстояние, если зафиксировали момент, что оно меньше, то выполняете поворот. Сервопривод сам по себе ведь не крутится, Вы ему команду дали встать на угол, и он её выполняет до подачи другой команды. В чём проблема возникает?
Я кажется понял о чем вы. Получили вы 5 см повернули серв и установили поле/флаг в значение 1 Получили вы 10см повернули серв на 90градусов и установили поле/флаг в значение 0 Если у вас растояние < 5см и поле/флаг == 1 ничего не делаем Если у вас растояние >= 10см и поле/флаг == 0 ничего не делаем В коде это выглядит как то так (только не придираться это что то типа псевдокода) Код (C++): bool isBeside=0; float distance = getDistance(); if(distance <=5 && isBeside==0){ setTurn(); isBeside=1; } if(distance >=10 && isBeside==1){ setTurn(90); isBeside=0; } естественно isBeside глобальная переменная если нужно через 3 секунды повернуть обратно то придется ещё одну переменную хранящую сколько секунд прошло и если их прошло более 3-х то повернуть его обратно не сбросив флаг как то так Код (C++): bool isBeside=0; byte second=0; float distance = getDistance(); if(distance <=5){ if (second == 0 && isBeside==0){ setTurn(); isBeside=1; } if(second <3){second ++;} } if(distance >=10 && isBeside==1){ setTurn(90); isBeside=0; second=0; } if(second > 3 && isBeside==1){ setTurn(90); } расчитано что код срабатывает раз в секунду. Ну думаю мысль донёс, код отстой но без нормальной постановки задачи хз что там у вас и как.
РусНекромант, это не код отстой, а формулировка такая Я так понял, что при расстоянии от 5 до 10 см нужен угол 90 градусов, если меньше 5-ти, то угол должен быть 0 градусов. Думаю, может у автора проблема с логическим условием? Сделал два if, а они оба выполняются, так как там расстояние задается интервалами, и конец одного [0..5], является началом другого [5..10]? Вот привод и крутится... А вообще, если бы Wiskas привёл хоть немного кода того, что он пытается реализовать, было бы проще. А так, игра в угадайку какая-то...
Огромное спасибо за помощь, всё получилось! И "alex-prog" так же спасибо за уделённое внимание к проблеме! )