Как добавить задержку, закрыть сервопривод и снова перейти к началу?
#include <Servo.h>
Servo myServo;
const int piezo = A0;
const int button = 2;
const int yellow = 3;
const int green = 4;
const int red = 5;
int knockVal;
int buttonVal;
const int quietKnock = 10;
const int loudKnock = 100;
boolean locked = false;
int numberOfKnocks = 0;
void setup()
{
myServo.attach(9);
pinMode(yellow, OUTPUT);
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(button, INPUT);
Serial.begin(9600);
digitalWrite(green, HIGH);
myServo.write(0);
Serial.println("The box is unlocked!");
}
void loop()
{ //начало цикла
if (locked == false)
{ //начало if1
buttonVal = digitalRead(button);
if (buttonVal == HIGH)
{ //Начало if2
locked = true;
digitalWrite(green, LOW);
digitalWrite(red, HIGH);
myServo.write(90);
Serial.println("The box is locked!");
delay (1000);
} //конец if2
} //конец if1
if (locked == true)
{ //начало if3
knockVal = analogRead(piezo);
if (numberOfKnocks < 3 && knockVal > 0)
{ //начало if4
if (checkForKnock(knockVal) == true)
{ //начало if5
numberOfKnocks++;
} //отправка if5
Serial.print(3 - numberOfKnocks);
Serial.println(" more knocks to go");
} //конец if4
if (numberOfKnocks >= 3)
{ //начало if6
locked = false;
myServo.write(0);
delay(20);
digitalWrite(green, HIGH);
digitalWrite(red, LOW);
Serial.println("The box is unlocked!");
} //конец if
} //конец if3
} //Конец цикла
boolean checkForKnock(int value)
{ //начало логического значения
if (value > quietKnock && value < loudKnock)
{ //начало if7
digitalWrite(yellow, HIGH);
delay(50);
digitalWrite(yellow, LOW);
Serial.print("Valid knock of value ");
Serial.println(value);
return true;
} //конец if7
else
{ //начало else
Serial.print("Bad knock value ");
Serial.println(value);
return false;
} //конец else
} // конец логического значения
@Gavin McLeod, 👍0
Обсуждение1 ответ
▲ 1
if (buttonVal == HIGH)
{ //Запуск if2
locked = true;
digitalWrite(green, LOW);
digitalWrite(red, HIGH);
myServo.write(90);
Serial.println("The box is locked!");
numberOfKnocks = 0;
delay(1000);
}
Я добавил numberOfKnocks = 0
в эту часть кода, так что ваше значение детонации становится равным нулю при его блокировке, что не приведет к повторному открытию блокировки, как только вы ее заблокируете. Проблема заключалась в том, что вы не изменили значение numberoflnock, которое остается неизменным даже после его блокировки, поэтому, когда код возвращается к части разблокировки, он автоматически разблокирует его.
Надеюсь, это поможет вам.
,
@xbox gamer
Смотрите также:
- Как быстро и без задержки переместить сервопривод?
- Как повторить другое действие внутри цикла?
- Контроллер радиоуправляемой машины с использованием библиотеки RC-switch
- Как перемещать сервопривод с помощью функции
- Хочу оптимизировать этот код и добавить цикл
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
Могу ли я узнать, в какой момент вы хотите добавить задержку, @xbox gamer
У вас уже есть задержки. Можете ли вы более подробно указать, чего вы пытаетесь достичь?, @Nick Gammon
Как только сервопривод разблокирован, я хотел бы добавить задержку, чтобы снова заблокировать сервопривод, а затем снова запустить код. Прямо сейчас он разблокируется, но останется разблокированным, если вы нажмете кнопку, он заблокируется на 1 секунду, а затем снова разблокируется., @Gavin McLeod
Эй, я ответил на ваш вопрос, пожалуйста, дайте мне знать, это то, что вы хотели в своем коде, или нет., @xbox gamer