Как добавить цифры к позиции при управлении семисегментным дисплеем
Недавно у меня возникли трудности с моим проектом 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);
}
} // если
} // петля ()
// Конец
@OmerFlame, 👍0
Обсуждение1 ответ
Лучший ответ:
В вашем коде вы вызываете:
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
- Считывание нескольких поворотных энкодеров
- 74HC595 к 4 значному 7 сегменту с использованием библиотеки SevSegShift
- 7-сегментный дисплей с потенциометром
- Как прочитать выходные данные с разъема SPI с помощью Arduino Uno?
- Инкрементный кодер
- 4-значный 7-сегментный дисплей неправильно отображает значение
- Считывание выходных данных энкодера с помощью оптрона
- Как выбрать входной контакт 600 кГц, разделить его на 4 и сгенерировать низкочастотный сигнал на выходном контакте Arduino
Вы заявили, что вы хотите, чтобы он делал, но что он на самом деле делает вместо этого?, @jose can u c
Вместо этого он просто пропускает на единицу, а не на 5 (код, который я опубликовал здесь, не содержит попыток сделать это)., @OmerFlame
Я бы умножил позицию на пять. Итак,
display.showNumberDec(pos*5, true)
. Тогда вам понадобится только этот единственный лайк вместо всего оператора if (все 10 строк)., @Gerben