Серводвигатель И кнопка
У меня возникли проблемы при попытке заставить серводвигатель и кнопку работать вместе. Приведенный ниже код кнопки отлично работает, когда он один в отдельном коде, но когда он передается в код с функцией серводвигателя, он не работает.
Есть ли что-то, на что мне следует обратить внимание при интеграции кода кнопки здесь с уже существующим кодом?
#include <Servo.h> // Библиотека, необходимая для серводвигателя (Обязательно скачайте)
#include <Button.h> // Библиотека необходимая для микропереключателя (Обязательно скачать)
// Параметры эксперимента
// Примечание: 1000 — это одна секунда
char Experiment = 'Acclimatization';
char Bird_Name = 'birdname here';
int Frequency = 30 * 1000; // Двигатель движется каждые x секунд
int Frequency_Deviation = 5 * 1000; // Есть x секунд отклонений плюс и минус от частоты, установленной выше
int Duration = 3 * 1000; // Еда открыта на x секунд
int servoPin = 9; // Объявить вывод серводвигателя (может варьироваться от настройки к настройке)
Button button(7); // Объявить контакт микропереключателя (может варьироваться от настройки к настройке)
Servo Servo1;
void setup() {
Servo1.attach(servoPin);
//аналоговая запись(servoPin, 0);
Serial.begin(9600);
button.setDebounceTime(100); // устанавливаем время устранения дребезга на 100 миллисекунд
}
void loop(){
// Получить время начала и смещения, когда птица прилетает и покидает насест
button.loop();
if(button.isPressed())
Serial.println("OnsetTime");
if(button.isReleased())
Serial.println("OffsetTime");
// Расчет параметров акклиматизации ниже
delay(random(Frequency-Frequency_Deviation,Frequency+Frequency_Deviation)); // Вычисляет частоту (см. параметры выше)
Servo1.write(0); // Начинается с 0 градусов
delay(Duration); // Время, в течение которого еда открыта (см. параметры выше)
Servo1.write(75); // Переходим на x градусов
}
@John, 👍0
Обсуждение1 ответ
Короткий ответ: у вас есть задержка блокировки, прерывающая время устранения дребезга кнопки, равное 100 мс.
В вашей библиотеке кнопок время устранения дребезга составляет 100 мс. Это означает, что вы должны удерживать кнопку нажатой более 100 мс, прежде чем она будет зарегистрирована как нажатая.
У вас есть 3-секундная задержка блокировки в конце цикла. Когда вы вызываете delay(XX)
, ваш процессор не может ничего сделать в это время (например, проверить наличие кнопки), он просто ждет.
Подумайте, как работает код. В основном цикле вы вызываете функцию button.loop()
, и она проверяет, нажата ли ваша кнопка. Если она нажата, она запускает таймер (ваш debounce). Цель этого таймера состоит в том, чтобы пройти еще 100 мс, пока ваша кнопка все еще нажата, чтобы убедиться, что вы действительно нажали ее. Button.isPressed()
терпит неудачу, и он переходит к следующему набору инструкций, который включает в себя перемещение сервопривода и ожидание 3 секунды, в течение которых он не может проверить кнопку. Затем все начинается сначала и снова вызывается button.loop()
. Все это происходит НАМНОГО быстрее, чем 100 мс. От начала void loop()
до времени, которое требуется для его восстановления при 3-секундной задержке блокировки, составляет наносекунды. Это никогда не даст вашей библиотеке кнопок 100 мс «нажатой» кнопки, необходимой для того, чтобы button.isPressed()
вернул true.
Я предлагаю потратить некоторое время на то, чтобы заглянуть за кулисы вашей библиотеки кнопок и посмотреть, как работает устранение дребезга. Вы можете сделать это, или вы можете использовать скетч для примера с основного веб-сайта arduino и узнать, как это работает. Следующее, что вам нужно сделать, это узнать, как заставить ваш код «ожидать» без использования блокирующего вызова delay()
. Это делается с помощью таймеров с помощью функции millis(). Хорошим способом научиться этому является пример скетча Arduino «Мигание без задержки».
Надеюсь, это прояснит некоторые моменты.
Спасибо за ваш отзыв! Что, если мне нужна функция дня? Могу ли я по-прежнему заставить кнопку работать, используя, например, задержку в 3 секунды?, @John
@John «Это делается с помощью таймеров с помощью millis ()»., @ElectronSurf
@HavocRC, эта библиотека НЕ блокируется во время устранения дребезга. Библиотека использует отметку времени для устранения дребезга. Он НЕ использует функцию delay(). Пожалуйста, прочитайте справку по библиотеке, прежде чем отвечать, @Rozona Zoro
@Джон, как я уже сказал, вы можете заставить свой код работать именно так, как вы хотите, но вам нужно использовать немного более сложный код. В своем ответе я указываю вам правильное направление: если вы изучите и будете использовать эти два предложенных мною скетча, у вас будут все знания, необходимые для достижения того, чего вы хотите., @HavocRC
@RozonaZoro Я не говорил, что в библиотеке устранения дребезга была задержка, я говорю о 3-секундной задержке в скетче OP (3-я строка снизу)., @HavocRC
- Построение последователя строки и продолжайте получать ошибки просто нужна помощь в правильном направлении, чтобы закончить ошибку кода, расположенную внизу
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Определение того, была ли нажата и отпущена кнопка
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Хорошая кнопка debouncing/Библиотека StateChange
- Как заставить сервопривод вращаться на угол больше 180°
- Остановить мигание светодиодов
В вашем коде вы использовали функцию delay() два раза. Из-за этого Arduino может пропустить какое-то неотложное событие. Используйте метку времени вместо задержки. См. [Пример BlinkWithoutDelay](https://arduinogetstarted.com/tutorials/arduino-led-blink-without-delay), чтобы узнать, как использовать отметку времени. Обратите внимание, что функция устранения дребезга в библиотеке НЕ использует функцию delay(). Поэтому вам НЕ нужно беспокоиться о проблеме с блокировкой, @Rozona Zoro