Как добавить цифры к позиции при управлении семисегментным дисплеем

Недавно у меня возникли трудности с моим проектом Arduino. Я пытаюсь управлять семисегментным дисплеем (на нем есть микроконтроллер) с помощью энкодера, и стараюсь, чтобы каждый раз, когда я вращаю энкодер, он добавлял 5 к числу на дисплее. Что я здесь делаю не так???

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

Код (без попыток изменить добавленную сумму на отображение):

#include <RotaryEncoder.h>
#include <TM1637Display.h>

// Контакты подключения модуля (цифровые контакты)
#define CLK 10
#define DIO 11

// Настраиваем RoraryEncoder для контактов A2 и A3:
RotaryEncoder encoder(A2, A3);

// Количество времени (в миллисекундах) между тестами
#define TEST_DELAY   1000

TM1637Display display(CLK, DIO);

void setup()
{
    Serial.begin(57600);
    Serial.println("SimplePollRotator example for the RotaryEncoder 
    library.");
} 



// Процедура обслуживания прерывания для прерывания 1 изменения контакта
// Эта процедура будет вызываться только при любом изменении сигнала на A2 и A3:
//именно там, где нам нужно проверить.
ISR(PCINT1_vect) {
    encoder.tick(); // просто вызовем методick(), чтобы проверить состояние.
}


// Считываем текущую позицию энкодера и распечатываем ее при изменении.
void loop()
{
    static int pos = 0;
    int newPos = encoder.getPosition();
    if(newPos > -1)
    {
        if (pos != newPos) {
            Serial.print(newPos);
            Serial.println();
            pos = newPos + 4;
            display.setBrightness(0x0f);
            // Все сегменты включены
            // Показ десятичных чисел с ведущими нулями или без них
            display.showNumberDec(newPos, true); // Ожидаем: 1234
            delay(100);
        }
    } // если
} // петля ()
// Конец

, 👍0

Обсуждение

Вы заявили, что вы хотите, чтобы он делал, но что он на самом деле делает вместо этого?, @jose can u c

Вместо этого он просто пропускает на единицу, а не на 5 (код, который я опубликовал здесь, не содержит попыток сделать это)., @OmerFlame

Я бы умножил позицию на пять. Итак, display.showNumberDec(pos*5, true). Тогда вам понадобится только этот единственный лайк вместо всего оператора if (все 10 строк)., @Gerben


1 ответ


Лучший ответ:

2

В вашем коде вы вызываете:

newPos = encoder.getPosition();

который фиксирует абсолютную позицию кодировщика. При повороте этого шага значение newPos увеличивается (или уменьшается) на единицу.

Затем вы создаете pos = newPos + 4, который просто добавляет 4 к значению, которое увеличивается или уменьшается на один шаг за раз.

newPos: 1    pos: 5
newPos: 2    pos: 6
newPos: 3    pos: 7
newPos: 4    pos: 8
newPos: 5    pos: 9

Вместо этого создается впечатление, что вы хотите, чтобы на дисплее всегда отображалось 5-кратное значение положения энкодера. Если да, то вам следует написать pos = newPos*5.

newPos: 1    pos: 5
newPos: 2    pos: 10
newPos: 3    pos: 15
newPos: 4    pos: 20
newPos: 5    pos: 25

Затем, когда вы записываете на дисплей, вы делаете следующее:

display.showNumberDec(newPos, true); // Ожидаем: 1234

Но newPos не является вновь вычисленным значением. Вместо этого позвоните

display.showNumberDec(pos, true); // Ожидаем: 1234
,

Кажется, я попробовал это, но безрезультатно, сейчас попробую еще раз. РЕДАКТИРОВАТЬ: Нет, все равно считается по одному., @OmerFlame

Ну, вам также нужно записать правильное значение на дисплей: display.showNumberDec(newPos, true); пытается записать newPos, но newPos — это позиция энкодера. pos — это вычисленное отображаемое значение. Я обновлю свой ответ., @jose can u c

Спасибо! Теперь это работает как шарм., @OmerFlame

Это классическая проблема отладки. Вы думаете, что написали свой код, чтобы делать одно, а то, что вы написали, на самом деле делает другое. Вам нужно добавить операторы печати, которые отображают используемые вами значения, а затем продумывать каждую строку вашего кода, записывая значения переменных на каждом этапе и представляя, что вы компьютер. Посмотрите на написанный код и посчитайте результаты каждой строки, а не то, что вы ожидаете. Это значительно усложняется на микроконтроллерах, где у вас нет отладчика для работы ., @Duncan C

Хороший глаз, Хосе, заметил тот факт, что ОП отображает положение энкодера, а не рассчитанное значение. (проголосовало), @Duncan C