4-значный 7-сегментный дисплей отображает неверный номер

Я новичок в Arduino, у меня проблемы с 4-значным 7-сегментным дисплеем. Я хочу отобразить несколько тысяч на 4-значном 7-сегментном дисплее, но он отображает только 0000. Я хочу получать данные из последовательного порта со строкой. И отобразите данные на 4-значном 7-сегментном дисплее... Итак, проверьте, сделайте String = '2575'... но это не работает. Что не так в моих кодах? Любые предложения здесь будут большим подспорьем. спасибо

int segments[] = {A0, A1, A2, A3};

byte digits[10][7] =
{
  { 1,1,1,1,1,1,0 }, // 0
  { 0,1,1,0,0,0,0 }, // 1
  { 1,1,0,1,1,0,1 }, // 2
  { 1,1,1,1,0,0,1 }, // 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
};

void setup() {
  Serial.begin(9600); 

  for(int i=2;i<10; i++) {
    pinMode(i, OUTPUT);
  }

  for(int i=0; i<4; i++) {
    pinMode(segments[i], OUTPUT);
  }
}

void loop() {
  String IncomingData = "2575";

  for(int i=0; i<4; i++) {
    digitalWrite(segments[i], LOW);
    int digit = atoi(IncomingData[i]);
    displayDigit(digit);
    delay(5);
    digitalWrite(segments[i], HIGH);
  }   
}

void displayDigit(int num){
  int pin = 2;
  for(int i=0;i<7;i++){
    digitalWrite(pin+i, digits[num][i]);
  }
}

, 👍0

Обсуждение

Вы уверены, что у вас дисплей с общим катодом? Есть ли у вас резисторы ограничения тока на каждом выводе сегмента? Кроме того, почему у вас есть целое число для всего, когда байт — это все, что нужно для 0,1 или от 0 до 9? Попробуйте добавить Serial.print после этой строки int digit = atoi(IncomingData[i]); увидеть, что эта цифра выходит за рамки того, что вы думаете., @CrossRoads

используйте дисплей с общим анодом. и число int отображается очень хорошо, как displayDigit(5), но код не работал... спасибо, @김태정

Код настроен на общий катод; низкий уровень на катоде для выбора цифры, высокий уровень на сегментах для их включения. Если вы используете общий анод, измените логику; верхняя цифра — для выбора одного, нижняя — для сегментов, чтобы их включить., @CrossRoads

Извините, я использую общий катод... и как это исправить? Serial.print показывает 00000000... Я думаю, используйте int для функции displayDigit(int num)..., @김태정

Исправьте это, изменив логику: High, чтобы включить цифру, Low, чтобы выключить ее. Переверните все 0 в 1, 1 в 0 в массиве цифр., @CrossRoads

Измените displayDigit(digit); на displayDigit(3);, чтобы увидеть, заключается ли проблема в синтаксическом анализе строки или в части отображения светодиодов., @Gerben

displayDigit(3); работает... проблема с разбором строк... спасибо, @김태정


1 ответ


1

Вы вызываете atoi() с символом. Параметром atoi является const char*. Чтобы преобразовать код цифры ASCII в цифру, используйте

int digit = IncomingData[i] - '0'

,

я не могу этого понять... в любом случае примени IncomingData[i] - '0'... это не работает... спасибо, @김태정

@김태정, int digit = IncomingData[i] - '0', @Juraj

вы не знаете, что такое ASCII-код? как кодируются символы? или вы не знаете, почему IncomingData[i] имеет символьный формат и не может использоваться с itoa?, @Juraj

вау@.@ это работает! большое спасибо! Как мне понять теорию...! Хорошего дня!, @김태정

как мне принять ответ?..., @김태정