Доброго времени суток. Помогите, пожалуйста написать работающий код. Необходимо сделать, чтобы удерживании нажатой тактовой кнопки, сервомашинка поворачивала с 0 на 180 градусов в течение 6 секунд. При отпускании кнопки, серва останавливается. Если кнопка разжимается на 3-й секунде, серва застывает на 90 градусах, при повторном нажатии она продолжает поворот. Код работает почти как надо, только есть одна проблема - время начинает считываться с момента включения ардуины и никак не зависит от состояния кнопки. Если нажать кнопку на 3 секунде после включения платы, то серва повернет сразу на 90 градусов и дальше будет крутить с нужной скоростью, или же при повторном нажатии кнопки спустя время лопасть повернется на угол, рассчитанный как будто кнопку не разжимали вовсе Код (Text): #include <Servo.h> int button = 2; int press = 0; byte pos = 0; Servo servo; unsigned long time; void setup() { pinMode(button, INPUT); servo.attach(9); } void loop(){ if(digitalRead(button) == HIGH) { time = millis(); } else { servo.write(pos); } while (digitalRead(button) == HIGH && pos <= 179){ pos = (millis()-time)/33; pos = constrain(pos, 0, 180); servo.write(pos); } }
У вас код никак не различает первое нажатие и последующие. Добавьте счетчик нажатий и используйте его значение в условиях. При повторном нажатии нужно учитывать начальное смещение сервы с прошлого раза.
Решение данной задачи нашлось и достаточно простое (и счетчик не пригодился ): Код (Text): #include <Servo.h> int button = 2; int press = 0; byte pos = 10; Servo servo; unsigned long time; void setup() { pinMode(button, INPUT); servo.attach(9); } void loop(){ if(digitalRead(button) == HIGH) { pos = pos +1; } pos = constrain(pos, 10, 170); servo.write(pos); delay(33); } Если есть замечания, буду рада узнать
может я не совсем правильно озвучила задачу, но мне и нужно было поворачивать серву в момент нажатия кнопки с определенной скоростью, что и позволяет сделать выше указанный код. Единственное, где я отклонилась от исходной задачи, так это изменила интервал поворота с 0-180 на 10-170
Поздравляю с удачным хаком! Решение исходной задачи получено как побочный эффект совсем другого и более простого кода.