Нельзя использовать millis() вместо задержки

Я делаю фонарь для автомобиля. Во-первых, я хочу, чтобы всякий раз, когда я нажимаю на замок ключа автомобиля, таймер запускался на 10 секунд. И если я дважды нажму кнопку в течение 10 секунд, контакт 13 будет оставаться высоким в течение 10 секунд. Если я не нажму кнопку, она вернется в цикл void или условие может стать ложным. Я работаю над этим, но у меня нет правильного подхода. Я не могу использовать millis дважды в этой программе.

int buttonPushCounter = 0;   // счетчик количества нажатий кнопок
int buttonState = 0;         // текущее состояние кнопки
int lastButtonState = 0;
unsigned long previousMillis = 0;
const long interval = 5000;

void setup() {
  Serial.begin(9600);
  pinMode(8, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}

void loop() {
  unsigned long currentMillis = millis();
  buttonState = digitalRead(8);
  if (buttonState != lastButtonState) {
    if (buttonPushCounter <= 2) {
      if (buttonState == LOW) {
        buttonPushCounter++;
        Serial.println("on");
        Serial.print("number of button pushes: ");
        Serial.println(buttonPushCounter);
        if (buttonPushCounter % 3 == 0) {
          if (currentMillis - previousMillis > 10000) {
            digitalWrite(13, HIGH);
            previousMillis = currentMillis;
          } else {
            digitalWrite(13, LOW);
          }
        } else {
          digitalWrite(13, LOW);
        }
      } else {
        digitalWrite(13, LOW);
      }
    } else {
      buttonPushCounter = 0;
    }
    lastButtonState = buttonState;
  }
}

, 👍2

Обсуждение

Вы вообще не используете millis() в этой программе. Вы вызываете его один раз при сохранении метки времени в переменной, которую впоследствии не используете., @theSealion

Я отредактировал программу, как вы сказали., @aadesh dahiya

Пожалуйста, отредактируйте свою программу, чтобы получить компилируемый код (сейчас фигурные скобки не совпадают) И, пожалуйста, сопоставьте свой код с вашим описанием. Вы несколько раз говорите о 10-ках, но в коде используете 5-ки., @theSealion

Спасибо за улучшение кода. Но светодиод не гаснет через 10 секунд., @aadesh dahiya


1 ответ


1

Вот что вы просили:

Я делаю фонарь для автомобиля. Сначала я хочу это всякий раз, когда я нажимаю замок ключа автомобиля, таймер запускается на 10 секунд. И если я нажмите кнопку дважды в течение 10 секунд, контакт 13 будет оставаться высоким в течение 10 секунд. во-вторых, и если я не могу нажать кнопку, она возвращается к петле пустоты или условие может стать ложным. Я работаю над этим, но не получаю правильный подход. Но я не могу использовать миллис дважды в этом программа.

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

Вы увидите, что я немного разбил глубокую вложенность вашего кода на отдельные методы. Я надеюсь, что вы видите, что это делает его более читабельным и понятным.

Я заменил "магические числа", такие как 10000, на более читаемый код, такой как tenSeconds. И я надеюсь, что теперь код делает то, что вы хотите, но я не уверен. Надеюсь, удобочитаемость улучшилась настолько, что вы можете массировать и изменять код так, как вам нужно, а также показать вам, в каком направлении двигаться, когда вы не понимаете свой собственный код, потому что он вырос (глубже, длиннее, больше). сложный и т. д.), как и большинство кода.

В мире профессионального кодирования сохранение кода в таком виде называется "неуплатой долга за разработку", и вы (или ваша организация) будете платить за последствия с процентами, точно так же, как по кредитной карте.

Наконец, обратите внимание, что мои комментарии не повторяют код, а пытаются что-то добавить (мой часто пытается закончить предложения, содержащие читаемый код). Мои комментарии также, как правило, располагаются в конце строк, чтобы не мешать.

Этот код компилируется, но не тестировался на реальном Arduino. Пожалуйста, дайте мне знать, если это соответствует вашим потребностям, и, пожалуйста, выберите этот ответ в качестве ответа, если он отвечает на ваш вопрос, и, по крайней мере, пожалуйста, проголосуйте за ответ, если он не совсем вам отвечает... ...и дайте мне второй шанс, если это возможно. Спасибо.

// пины определены и названы
int pin_button = 8;         // Пин кнопки
int pin_LED = 13;           // вывод светодиода

int currentButtonState = 0;         // текущее состояние кнопки
int lastButtonState = 0;

int buttonPushCounter = 0;   // счетчик количества нажатий кнопок
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
const unsigned int tenSeconds = 10000; // 10 000 миллисекунд

void setup()
{
    pinMode(pin_button, INPUT_PULLUP);
    pinMode(pin_LED, OUTPUT);
}

void loop()
{
    currentMillis = GetCurrentMillis();
    if (ButtonIsToggled() == 1)
    {
        CountButtonPushes();
    }
}

int ButtonIsToggled()
{
    int isToggled = 0;
    currentButtonState = digitalRead(pin_button);
    if (currentButtonState != lastButtonState)
    {
        lastButtonState = currentButtonState;
        isToggled = 1;
    }
    return isToggled;
}

void CountButtonPushes()
{
    int valueToWrite = LOW; // LED-OFF — это значение по умолчанию, если оно не переопределено

    if (currentButtonState == LOW) // мы только что переключились с HIGH на LOW...
    {
        buttonPushCounter++; // Мы успешно завершили еще одно нажатие кнопки
        if (buttonPushCounter % 3 == 0) // if (buttonPushCounter==3) должно быть быстрее
        {                               // потому что сравнение быстрее, чем деление
            buttonPushCounter = 0;  // Перезагрузить
            valueToWrite = HIGH; // светодиод горит
        }
    }

    if (valueToWrite == HIGH) // светодиод горит
    {
        digitalWrite(pin_LED, HIGH); // значение для записи
        while (currentMillis - previousMillis < tenSeconds)
        {
            // ничего не делаем -- ждем, пока горит светодиод
            // занято ожидание. Вместо этого подумайте о том, чтобы поспать.
            currentMillis = GetCurrentMillis();
        }
        previousMillis = currentMillis;
        digitalWrite(pin_LED, LOW);
    }
}

unsigned long GetCurrentMillis()
{
    return millis();
}
,