24/14 секундный таймер обратного отсчета или часы для кнопки запуска/остановки баскетбольного мяча плохо реагируют

Кнопка "Пуск" не отвечает правильно, я не могу понять, что не так с кодом ? пожалуйста, помогите,

этот код предназначен для 24-секундного и 14-секундного таймеров обратного отсчета в одном устройстве

поставляется с тремя физическими кнопками

  1. запуск/пауза
  2. Сброс
  3. сдвиг (вывод Arduino 8 в качестве кнопки переключения)

как 1, так и 2 используют вывод arduino 2 и 3 для прерываний, при нажатии кнопки сброса счетчик устанавливает таймер на 24 секунды, а shift+сброс установит таймер на 14 секунд, а при нажатии кнопки "Пуск" начнется обратный отсчет и повторное нажатие приостановит таймер,

для отображения он использует два семисегментных дисплея с декодером кода 74LS47 Bin

вот код

//Declaring and Initializing Variables
int p4 = 4;
int p5 = 5;
int p6 = 6;
int p7 = 7;
int p9 = 9;
int p10 = 10;
int Buzzer = 12;
boolean Standby = true;
unsigned long newTime, oldTime = 0;
const long timeDelay = 1000;
volatile int Num1 = 0;
volatile int Num2 = 0;
volatile int Zero = 0;
volatile byte Press = 0;
volatile boolean Ready = false;
volatile boolean Shifter = false;
volatile int Shift = 8;


void setup() {
  pinMode(Shift, INPUT);//Shift pin button
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  pinMode(9, OUTPUT);//FirstDigit
  pinMode(10, OUTPUT);//SecondDigit

  pinMode(12, OUTPUT);//Buzzer
  attachInterrupt(0, Starting, HIGH);
  attachInterrupt(1, ReStarting, RISING);
  digitalWrite(12, LOW); //Set it LOW first
}

void refresh() {
  SecondDigit();
  FirstDigit();
}

void Starting() {
  //Running and Stopping here
  if (Ready == false) {
    Press = 0;
  }

  Press++;
  if (Press >= 4) Press = 2;
} //End of Starting

void ReStarting() {
  //Restart sequence
  Zero = 0;
  if (Press == 0) {
    Num2 = 2;
    Num1 = 4;
    Ready = true;
    Press = 1;

  }

  if (digitalRead(Shift) == HIGH) Shifter = true;

  if (Shifter == false) {
    if (Zero == 3)Press = 1;
    Num1 = 4;
    Num2 = 2;
    Zero = 0;
    Ready = true;
    Press = Press;
  }
  else {
    if (Press == 2) {
      if ((Num1 + (Num2 * 10)) < 14) {
        Num1 = 4;
        Num2 = 1;
        Zero = 1;
        Ready = true;
        Press = 2;
      }
    }
    else {
      if (Press == 1 || Press == 3) {
        //Uncomment the next line to disable the 14 seconds reset if time is greater than 14 seconds
        if ((Num1 + (Num2 * 10)) < 14) {
          Num1 = 4;
          Num2 = 1;
          Zero = 1;
          Ready = true;
          Press = 1;
        }
      }
    }
  }
}//End of ReStarting


void Display() {
  if (Press == 2) {
    if (Zero <= 3) {
      Num1--;
      if (Num1 == 0)Zero++;
      if (Num1 == -1) {
        Num1 = 9;
        if (Num2 > 0)Num2--;

      }
    }
  }
  for (int Transition = 0; Transition < 500; Transition++) {
    FirstDigit();
    SecondDigit();
    if (Ready == true) {

      if (Zero == 3)BuzzMaker();
    }
  }
} //End of Display


void FirstDigit() {
  //Display 4 BCD digits of Number in First LED Segment
  digitalWrite(10, LOW);
  digitalWrite(9, HIGH);
  if (digitalRead(Shift) == HIGH) Shifter = true;
  digitalWrite(4, bitRead(Num1, 0));
  digitalWrite(5, bitRead(Num1, 1));
  digitalWrite(6, bitRead(Num1, 2));
  digitalWrite(7, bitRead(Num1, 3));
  delay(1);
  Shifter = false;
} //End of FirstDigit


void SecondDigit() {
  //Display 4 BCD digits of Number in Second LED Segment
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  if (digitalRead(Shift) == HIGH) Shifter = true;
  digitalWrite(4, bitRead(Num2, 0));
  digitalWrite(5, bitRead(Num2, 1));
  digitalWrite(6, bitRead(Num2, 2));
  digitalWrite(7, bitRead(Num2, 3));
  delay(1);
  Shifter = false;
} //End of SecondDigit

void BuzzMaker() {
  //Configuring Buzzer frequency and setting go with the counting numerals
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(12, HIGH);

  delay(1000);
  digitalWrite(12, LOW);
  delay(200);
  digitalWrite(12, HIGH);

  delay(500);
  digitalWrite(12, LOW);

  Press = 2;
  Zero = 0;
  Ready = true;
  Shifter = false;
}//End of BuzzMaker


void loop() {
  if (Press == 0)refresh;
  refresh();
  newTime = millis();
  if ((newTime - oldTime) >= timeDelay) {
    oldTime = newTime;

    if (Num2 == 0 && Num1 == 0 && Press == 2) {

      Press = 1;
    }

    //Here we are going to access each case with each different routine by case
    switch (Press) {

      case 0://Initial

        Display();
        break;

      case 1://Stop - Displaying 24 but still not yet running

        Display();
        break;

      case 2://Running

        Display();
        // PlayTime();
        break;

    }
  }//End of millis() condition

} //End of main loop function

, 👍1

Обсуждение

Что вы подразумеваете под "неправильно реагирует"? Можете ли вы рассказать нам, что он делает и что он должен делать?, @VE7JRO

Не проходя через свой (грязный) код: вы отменили кнопку?, @Sim Son

я приношу извинения за свои отступы... не отвечает означает, что сначала, когда я нажимаю кнопку "Пуск", он запускается сразу, затем я нажимаю снова, он не будет останавливаться, мне нужно нажать "Пуск" два или три раза, чтобы приостановить его, чтобы снова начать то же самое, иногда он реагирует быстро, несколько раз вообще не реагирует, @Amal R

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

В среде IDE Arduino есть клавиша "Автоматический формат" kombo, Crtl + T, которая исправит форматирование кода., @MatsK


1 ответ


0

Существует библиотека, которую вы можете включить, которая отменяет кнопки отскока2.

Вот тестовый скетч, который отменяет кнопку и позволяет изменять "состояние" переменной.

// Подключите один конец кнопочного переключателя N. O. к
// GND и другой конец к контакту 2 Arduino.
#include <Bounce2.h>

byte buttonState = 0;
const byte modeButtonPin = 2;
const unsigned long debouncerInterval = 50;  // Время в мс.

Bounce modeButton = Bounce();

void setup(){
  Serial.begin(9600);
  pinMode(modeButtonPin, INPUT_PULLUP);
  modeButton.attach(modeButtonPin);
  modeButton.interval(debouncerInterval);
}

void loop(){
  if(modeButton.update()){
    if(modeButton.read() == 0){
      buttonState++;
      if(buttonState > 2){buttonState = 0;}
      Serial.println(buttonState);
    }
  }
}
,

мой дорогой друг VE7JRO, я смиренно благодарю вас за помощь мне, я совершенно новичок с очень небольшим опытом ... простите мои странности, так как я использую контакт 2 в качестве прерывания 0, я не знаю, как реализовать этот код отмены в моем коде, потому что я не объявлял его как контакт 2 в своем коде, можете ли вы помочь мне добавить его, @Amal R

Вы можете использовать любой цифровой контакт. Я просто использовал контакт 2 в примере скетча., @VE7JRO