генератор чисел показывает неправильные сегменты на 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);
}

, 👍1

Обсуждение

Ваш код действительно компилируется со всеми этими предварительными объявлениями внутри функции? Также очень важно: digitalWrite(pin++, num_array[11][i]); не может работать. В первом измерении num_array всего 11 элементов. Элемент с индексом 11 будет 12-м. Итак, это чтение некоторых данных за пределами массива., @chrisl

да, я это видел и уже изменил, но проблема все та же. И я изменил код, чтобы он больше походил на тот, что размещен ниже., @Bavo

@chrisl: («Действительно ли ваш код компилируется со всеми этими предварительными объявлениями внутри функции?») Да, это среда разработки Arduino: создание объявлений main() и функций., @DataFiddler

@DataFiddler Мне просто интересно, можно ли объявлять функции внутри другой функции. Я видел это с другими языками, но не с C/C++., @chrisl

@chrisl: Теперь я вижу твою озабоченность. Объявление внутри функции принимается без ошибок. Но это не будет работать как вызов функции, как, очевидно, предполагалось., @DataFiddler


1 ответ


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

0

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

Вместо всех функций 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 никогда не вызывается, это означает:

  1. ((randVal >= 0) && (randVal <= 9)) является ложным, однако это невозможно, так как он инициализируется 0 и с помощью функции rand он всегда получает значения от 0 до 9.
  2. 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