генератор чисел показывает неправильные сегменты на 7-сегментном дисплее
Я создал программу для отображения случайного числа на 7-сегментном дисплее. Он показывает случайное число в последовательном мониторе, но всегда показывает одни и те же сегменты «acd и g». кто-нибудь знает, как исправить это, не меняя основы кодирования и упражнений, поэтому мне нужно иметь большую часть кода, как я его написал.
int num_array[11][7] = {
{ 1, 1, 1, 1, 1, 0, 1 }, // 0
{ 0, 1, 1, 0, 0, 0, 0 }, // 1
{ 1, 1, 0, 1, 1, 1, 0 }, // 2
{ 1, 1, 1, 1, 0, 1, 0 }, // 3
{ 0, 1, 1, 0, 0, 1, 1 }, // 4
{ 1, 0, 1, 1, 0, 1, 1 }, // 5
{ 1, 0, 1, 1, 1, 1, 1 }, // 6
{ 1, 1, 1, 0, 0, 0, 0 }, // 7
{ 1, 1, 1, 1, 1, 1, 1 }, // 8
{ 1, 1, 1, 0, 0, 1, 1 }, // 9
{ 0, 0, 0, 0, 0, 0, 0 }
}; //ВЫКЛЮЧЕННЫЙ
int buttonState = 0;
const int button = 12;
int randVal;
bool pressVal;
void num_Write(int);
void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(button, INPUT);
}
void loop() {
buttonState = digitalRead(button);
if (buttonState == LOW) {
turnOff();
pressVal = false;
}
else
{
if (pressVal == false)
{
int pin = 2;
for (int i = 0; i < 7 ; i++)
{
digitalWrite(pin++, num_array[11][i]);
}
randVal = rand() % 10;
pressVal = true;
}
Serial.println(randVal);
if (randVal == 0)
{
void zero();
}
else if (randVal == 1)
{
void one();
}
else if (randVal == 2)
{
void two();
}
else if (randVal == 3)
{
void three();
}
else if (randVal == 4)
{
void four();
}
else if (randVal == 5)
{
void five();
}
else if (randVal == 6)
{
void six();
}
else if (randVal == 7)
{
void seven();
}
else if (randVal == 8)
{
void eight();
}
else
{
void nine();
}
}
}
void zero()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[0][j]);
}
delay(250);
}
void one()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[1][j]);
}
delay(250);
}
void two()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[2][j]);
}
delay(250);
}
void three()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[3][j]);
}
delay(250);
}
void four()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[4][j]);
}
delay(250);
}
void five()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[5][j]);
}
delay(250);
}
void six()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[6][j]);
}
delay(250);
}
void seven()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[7][j]);
}
delay(250);
}
void eight()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[8][j]);
}
delay(250);
}
void nine()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[9][j]);
}
delay(250);
}
void turnOff()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[10][j]);
}
delay(250);
}
@Bavo, 👍1
Обсуждение1 ответ
Лучший ответ:
Обратите внимание, что это не ответ на ваш вопрос, но я хотел бы показать некоторые усовершенствования программирования, которые делают ваш скетч намного короче и проще в обслуживании.
Вместо всех функций one
, two
и так далее, используйте параметр для передачи числа. Итак, вы получаете это: (я не смог проверить это, так как у меня нет под рукой Arduino IDE). Также вы можете использовать цикл for
в функции loop
для установки выходных контактов.
int num_array[11][7] = {
{ 1, 1, 1, 1, 1, 0, 1 }, // 0
{ 0, 1, 1, 0, 0, 0, 0 }, // 1
{ 1, 1, 0, 1, 1, 1, 0 }, // 2
{ 1, 1, 1, 1, 0, 1, 0 }, // 3
{ 0, 1, 1, 0, 0, 1, 1 }, // 4
{ 1, 0, 1, 1, 0, 1, 1 }, // 5
{ 1, 0, 1, 1, 1, 1, 1 }, // 6
{ 1, 1, 1, 0, 0, 0, 0 }, // 7
{ 1, 1, 1, 1, 1, 1, 1 }, // 8
{ 1, 1, 1, 0, 0, 1, 1 }, // 9
{ 0, 0, 0, 0, 0, 0, 0 }
}; //ВЫКЛЮЧЕННЫЙ
int buttonState = 0;
const int button = 12;
int randVal;
bool pressVal;
void num_Write(int);
void digit(int value);
void setup() {
Serial.begin(9600);
for (int pin = 2; pin <= 8; pin++)
{
pinMode(pin, OUTPUT);
}
pinMode(button, INPUT);
}
void loop() {
buttonState = digitalRead(button);
if (buttonState == LOW) {
turnOff();
pressVal = false;
}
else
{
if (pressVal == false)
{
int pin = 2;
for (int i = 0; i < 7 ; i++)
{
digitalWrite(pin++, num_array[11][i]);
}
randVal = rand() % 10;
pressVal = true;
}
Serial.println(randVal);
if ((randVal >= 0) && (randVal <= 9))
{
digit(randVal);
}
}
}
void digit(int value)
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[value][j]);
}
delay(250);
}
void turnOff()
{
int pin = 2;
for (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[10][j]);
}
delay(250);
}
Вы также можете удалить turnOff
, если вы рассматриваете его как цифру 10, но это не так очевидно (или поместите реализацию digit
в другую функцию и вызовите ее из цифра
и выключить
.
Чтобы решить вашу проблему, выведите значения каждого контакта на монитор последовательного порта. Если они правильные, в вашей схеме есть проблема. Если они неверны, в вашем скетче есть проблема. В последнем случае добавляйте дополнительные операторы печати, пока не найдете точную проблему.
Обновить
- Исправлено объявление void для вызова функции (см. комментарий chrisl)
Если функция digit
никогда не вызывается, это означает:
((randVal >= 0) && (randVal <= 9))
является ложным, однако это невозможно, так как он инициализируется 0 и с помощью функции rand он всегда получает значения от 0 до 9.- pressVal всегда имеет значение TRUE.
Поэтому проверьте значение pressVal, а также добавьте (много) операторов print
, особенно после каждого if
и else
, чтобы вы точно знали поток вашего скетча. Вы увидите, что найти ошибку очень легко. Если вы укажете проблему на digitalRead
, значение которого не соответствует ожидаемому, ЧЕМ, скорее всего, проблема с вашей схемой (кнопка, которая никогда не будет НИЗКОЙ или ВЫСОКОЙ). В этом случае вы, вероятно, забыли подтягивающий/подтягивающий резистор.
Tnx за обратную связь, постараюсь реализовать это, кажется, намного лучше, чем мой код. есть идеи, как могло случиться, что неправильные сегменты загораются?, @Bavo
Не уверен, я бы последовал совету в конце, добавил больше операторов печати, чтобы убедиться, что скетч в порядке, а если нет, то проверил бы схему., @Michel Keijzers
Итак, я попытался найти источник своей проблемы, и он никогда не переходит к этой части кода `пустая цифра (целое значение)
{
внутренний контакт = 2;
для (int j = 0; j < 7; j++) {
digitalWrite(pin++, num_array[значение][j]);
}
задержка(250);
}
``, @Bavo
Вы удалили пустоту в void digit(randVal);
внутри функции цикла? Потому что это неправильно, так как вам не нужно предварительное объявление функции., @chrisl
@chrisl Я должен был удалить его (что я и сделал сейчас), возможно, вы имеете в виду это. И вы правы, ошибка копирования/вставки (не имея под рукой Arduino IDE). Спасибо за уведомление., @Michel Keijzers
Я обновил свой ответ, чтобы дать еще несколько советов относительно невызываемой функции., @Michel Keijzers
- 74HC595 к 4 значному 7 сегменту с использованием библиотеки SevSegShift
- 7-сегментный дисплей с потенциометром
- Как прочитать выходные данные с разъема SPI с помощью Arduino Uno?
- 4-значный 7-сегментный дисплей неправильно отображает значение
- 4-значный 7-сегментный дисплей
- Подключение семисегментного дисплея с общим анодом к сдвиговому регистру
- 4-значный 7-сегментный дисплей отображает неверный номер
- 7-сегментный дисплеи не работают
Ваш код действительно компилируется со всеми этими предварительными объявлениями внутри функции? Также очень важно:
digitalWrite(pin++, num_array[11][i]);
не может работать. В первом измерении num_array всего 11 элементов. Элемент с индексом 11 будет 12-м. Итак, это чтение некоторых данных за пределами массива., @chrislда, я это видел и уже изменил, но проблема все та же. И я изменил код, чтобы он больше походил на тот, что размещен ниже., @Bavo
@chrisl: («Действительно ли ваш код компилируется со всеми этими предварительными объявлениями внутри функции?») Да, это среда разработки Arduino: создание объявлений main() и функций., @DataFiddler
@DataFiddler Мне просто интересно, можно ли объявлять функции внутри другой функции. Я видел это с другими языками, но не с C/C++., @chrisl
@chrisl: Теперь я вижу твою озабоченность. Объявление внутри функции принимается без ошибок. Но это не будет работать как вызов функции, как, очевидно, предполагалось., @DataFiddler