Как добавить задержку, закрыть сервопривод и снова перейти к началу?

#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
}     // конец логического значения

, 👍0

Обсуждение

Могу ли я узнать, в какой момент вы хотите добавить задержку, @xbox gamer

У вас уже есть задержки. Можете ли вы более подробно указать, чего вы пытаетесь достичь?, @Nick Gammon

Как только сервопривод разблокирован, я хотел бы добавить задержку, чтобы снова заблокировать сервопривод, а затем снова запустить код. Прямо сейчас он разблокируется, но останется разблокированным, если вы нажмете кнопку, он заблокируется на 1 секунду, а затем снова разблокируется., @Gavin McLeod

Эй, я ответил на ваш вопрос, пожалуйста, дайте мне знать, это то, что вы хотели в своем коде, или нет., @xbox gamer


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, которое остается неизменным даже после его блокировки, поэтому, когда код возвращается к части разблокировки, он автоматически разблокирует его.

Надеюсь, это поможет вам.

,