Создаю машину с монетоприемником и 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++;
}
@Tali Jackson, 👍1
Обсуждение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.
}
Надеюсь, это как-то поможет.
,
@voidPointer
Хороший ответ. Код, который я могу скопировать+вставить в среду разработки, которая компилирует, делает этот ответ лучше, чем большинство из тех, которые мы получаем., @VE7JRO
@VE7JRO Спасибо, ваш комментарий поставил меня в известность об этой проблеме и теперь предлагает мне перепроверить!, @voidPointer
Смотрите также:
- Использование millis() и micros() внутри процедуры прерывания
- Подсчет импульсов с прерыванием
- Устранение дребезга кнопки с помощью прерывания
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Использование поворотных энкодеров с прерываниями смены контактов
- Arduino непрерывно считывает значение АЦП с помощью прерывания
в чем заключается ваш вопрос? ... не все люди задали бы один и тот же вопрос, @jsotola