Создаю машину с монетоприемником и arduino uno, она работает, но нужно дважды нажать переключатель, чтобы кредит отображался на семи сегментах

int pin1 = 8, pin2 = 9, pin3 = 10, pin4 = 11;
volatile byte  num = 0;
int coinPin = 2;


void setup() {
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(coinPin), inc_counter, RISING );
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);
  pinMode(pin3, OUTPUT);
  pinMode(pin4, OUTPUT);
}

void display(int num) {
  digitalWrite(pin1, bitRead(num, 1));
  digitalWrite(pin2, bitRead(num, 2));
  digitalWrite(pin3, bitRead(num, 3));
  digitalWrite(pin4, bitRead(num, 4));
}

void loop() {
  Serial.print(num);
  Serial.print("credit(s) towards balance");
  display(num);
  delay(500);
}

void inc_counter() {
  num++;
}

, 👍1

Обсуждение

в чем заключается ваш вопрос? ... не все люди задали бы один и тот же вопрос, @jsotola


1 ответ


1

Основываясь на предоставленном коде, вы обновляете дисплей только каждые полсекунды из-за задержки(500). Вы можете нажать кнопку несколько раз за 500 миль.

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

Основываясь на предоставленной информации, это может помочь вам в ваших начинаниях.

int pin1 = 8, pin2 = 9, pin3 = 10, pin4 = 11;
int coinPin = 2;
int num = 0;
volatile bool coinFlag = false; // When true there is a coin.

void coin_present()
{
    coinFlag = true;
}

void setup()
{
    Serial.begin(9600);
    attachInterrupt(digitalPinToInterrupt(coinPin), coin_present, RISING);
    pinMode(pin1, OUTPUT);
    pinMode(pin2, OUTPUT);
    pinMode(pin3, OUTPUT);
    pinMode(pin4, OUTPUT);
}

void display(int num)
{
    digitalWrite(pin1, bitRead(num, 1));
    digitalWrite(pin2, bitRead(num, 2));
    digitalWrite(pin3, bitRead(num, 3));
    digitalWrite(pin4, bitRead(num, 4));
}

void loop()
{
    // If the flag is set increment num and then display value.
    if (coinFlag)
    {
        //We have a coin, reset the flag first.
        coinFlag = false;

        num++;        // Increment value
        display(num); //
        Serial.print(num);
        Serial.println("credit(s) towards balance");
    }

    // No need for a delay as only `coinFlag` being `true` will update the display.
}

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

,

Хороший ответ. Код, который я могу скопировать+вставить в среду разработки, которая компилирует, делает этот ответ лучше, чем большинство из тех, которые мы получаем., @VE7JRO

@VE7JRO Спасибо, ваш комментарий поставил меня в известность об этой проблеме и теперь предлагает мне перепроверить!, @voidPointer