Я вернулся с другим вопросом, не связанным с домашней работой. Я играю с Arduino с моим братом, и мы пытаемся прикрепить кнопку, чтобы при ее нажатии его датчик оставался включенным и делал то, что должен. При повторном нажатии он ничего не сделает и выключится. Прямо сейчас, когда кнопка удерживается, она остается включенной, но когда она не нажата, она остается выключенной. Мы пытаемся сделать что-то, что будет непрерывно снимать, когда его бросают со здания. Это остановится с ультразвуковым датчиком читает <= 5. Я не могу сбросить себя с крыши, удерживая кнопку XD Это 2-контактная кнопка.
Вот код того, что мы имеем сейчас:
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
const int buzzer = 11;
const int ledPin = 13;
const int buttonPin = 2;
// defines variables
long duration;
int distance;
int safetyDistance;
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup() {
pinMode(echoPin, INPUT);// Sets the echoPin as an Input
pinMode(buttonPin, INPUT);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(buzzer, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // Starts the serial communication
myservo.attach(8); // attaches the servo on pin 9 to the servo object
}void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(buttonPin, HIGH);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance= duration*0.034/2;
safetyDistance = distance;
if (digitalRead(buttonPin) == HIGH)
{
if (safetyDistance <= 5){
digitalWrite(buzzer, HIGH);
digitalWrite(ledPin, HIGH);
}
else{
digitalWrite(buzzer, LOW);
digitalWrite(ledPin, LOW);
for(pos = 0; pos <= 180; pos += 20) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(10); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos>=0; pos-=2) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(10); // waits 15ms for the servo to reach the position
}
}
}
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
}
Теперь у нас проблемы с тем, что я понимаю, что для кнопки должны быть состояния. Но когда мы искали в интернете помощь, мы натолкнулись на такие термины, как debouncing, и мы просто не понимаем, что это значит. Мы так близки к завершению нашего мини-проекта. Сервопривод движется нормально, ультразвуковой датчик работает хорошо. Нам просто нужна помощь в выяснении этой кнопки. Буду признателен за любой совет и помощь, так как мы оба почесываем голову над этим. Спасибо!!
—Зейн
Обычные кнопки, как они используются в большинстве проектов, ничего не делают, кроме как нажимать два электрических контакта вместе, когда она нажата. Но — поскольку это механическое действие с ограниченной скоростью — уровень на штифте не просто поднимается с НИЗКОГО до ВЫСОКОГО (или наоборот). Вместо этого он меняет свой уровень в тот момент, когда кнопка нажимается несколько раз, пока не будет достигнут окончательный уровень. Этот вариант предназначен для быстрого просмотра человеком (например, с помощью подключенного светодиода), но достаточно медленным для того, чтобы микроконтроллер, такой как Arduino, обращал внимание. Так часто вам нужно убедиться, что это действительно только одно нажатие кнопки, даже если уровень меняется несколько раз подряд. В большинстве случаев достаточно добавить небольшой тайм-аут, когда нажатия кнопок не распознаются вашим кодом (например, 50 мс), или выполнить повторную проверку состояния кнопки после этого периода. Вы можете проверить соответствующие Страница Arduino для официального примера разоблачения.
В вашем коде вы проверяете только состояние кнопки, поэтому она отключается, когда вы отпускаете кнопку. Я бы попробовал что-то вроде этого:
boolean program_state = false;
unsigned long debounce_time = 50;
unsigned long debounce_time_stamp=0;
void loop(){
// ultasound measuring code
if(digitalRead(buttonPin) && debounce_time_stamp - millis() > debounce_time){
program_state=!program_state;
debounce_time_stamp = millis();
}
if(program_state){
// distance checking and servo code
}
}
Эта проверка — когда кнопка нажата — достаточно ли времени прошло с момента последнего распознанного нажатия (количество времени можно регулировать с помощью переменной debounce_time
). Когда действительное нажатие распознается, program_state
Переменная переключается для изменения состояния между двумя режимами (Вкл. и Выкл.).
Обратите внимание, что при этом код не отвечает на время, в течение которого сервопривод должен завершить одну последовательность. Если вы хотите, чтобы код был более отзывчивым, вам следует рассмотреть возможность использования кнопки в качестве внешнего прерывания (для этого посмотрите примеры на соответствующей странице Arduino).
Других решений пока нет …