Серводвигатель И кнопка

У меня возникли проблемы при попытке заставить серводвигатель и кнопку работать вместе. Приведенный ниже код кнопки отлично работает, когда он один в отдельном коде, но когда он передается в код с функцией серводвигателя, он не работает.

Есть ли что-то, на что мне следует обратить внимание при интеграции кода кнопки здесь с уже существующим кодом?

#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 градусов
}

, 👍0

Обсуждение

В вашем коде вы использовали функцию delay() два раза. Из-за этого Arduino может пропустить какое-то неотложное событие. Используйте метку времени вместо задержки. См. [Пример BlinkWithoutDelay](https://arduinogetstarted.com/tutorials/arduino-led-blink-without-delay), чтобы узнать, как использовать отметку времени. Обратите внимание, что функция устранения дребезга в библиотеке НЕ использует функцию delay(). Поэтому вам НЕ нужно беспокоиться о проблеме с блокировкой, @Rozona Zoro


1 ответ


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