24/14 секундный таймер обратного отсчета или часы для кнопки запуска/остановки баскетбольного мяча плохо реагируют
Кнопка "Пуск" не отвечает правильно, я не могу понять, что не так с кодом ? пожалуйста, помогите,
этот код предназначен для 24-секундного и 14-секундного таймеров обратного отсчета в одном устройстве
поставляется с тремя физическими кнопками
- запуск/пауза
- Сброс
- сдвиг (вывод 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
@Amal R, 👍1
Обсуждение1 ответ
Существует библиотека, которую вы можете включить, которая отменяет кнопки отскока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
- Устранение дребезга кнопки с помощью прерывания
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Отправка последовательных данных в прерывании
- 4-битный счетчик вверх и вниз
- Прерывания внутри класса, связанные с функцией класса
- Можем ли мы записать загрузчик Arduino в любой чип микроконтроллера?
- Как подключить USB к пользовательской схеме Arduino Uno и программированию Atmega?
- Программирование ATMega328P без платы Arduino всегда возвращает ошибку: avrdude: stk500_recv(): programmer is not responding
Что вы подразумеваете под "неправильно реагирует"? Можете ли вы рассказать нам, что он делает и что он должен делать?, @VE7JRO
Не проходя через свой (грязный) код: вы отменили кнопку?, @Sim Son
я приношу извинения за свои отступы... не отвечает означает, что сначала, когда я нажимаю кнопку "Пуск", он запускается сразу, затем я нажимаю снова, он не будет останавливаться, мне нужно нажать "Пуск" два или три раза, чтобы приостановить его, чтобы снова начать то же самое, иногда он реагирует быстро, несколько раз вообще не реагирует, @Amal R
один из людей с форума сказал мне добавить отмену, которую я не знаю, как добавить... я уже добавляю физическую отмену, используя диодный конденсатор и резистор, что дает некоторое прояснение, но все равно реакция кнопки "Пуск" не гладкая, @Amal R
В среде IDE Arduino есть клавиша "Автоматический формат" kombo, Crtl + T, которая исправит форматирование кода., @MatsK