Странный символ на lcd-дисплее 20X4

lcd

Я пытаюсь сделать радиоуправляемый контроллер.

У меня проблема с моим ЖК-дисплеем.

Lcd with japanese and indescribable char like

Я уже дважды проверил проводку, и соединения отличные.

Я сделал печатную плату с помощью Kicad и заказал ее в JLCPCB. У меня какая-то ошибка, видно припаянный провод.

PCB designed with kicad and made by JLCPCB

Schema Kicad

Перед печатной платой я сделал свой проект с макетом, и он отлично работал.

const String menuElem[4] = {"Models", "Trims", "Reverse command", "Channel"};

const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void menu() {
  lcd.clear();
  //lcd.setCursor(0,0);
  //byte pos = 0;
  //int sizeOfanArray = *(&array + 1) - array;
  byte menuElemLength = *(&menuElem + 1) - menuElem;
  for (byte i = 0; i < menuElemLength; i++) {
    lcd.setCursor(2, i);
    lcd.println(menuElem[i]);
  }
  showMenuNav(currentMenuPos);
}

, 👍0

Обсуждение

попробуйте const char* menuElem[4] = {"Models", "Trims", "Reverse command", "Channel"};, @Juraj

Фотографии вашей пользовательской платы и проводки на самом деле нам ничего не говорят. Мне кажется, что у вас есть ошибка в коде. Вы получаете НЕКОТОРЫЕ символы из ваших строк, что говорит мне о том, что ЖК-дисплей работает. Мне кажется, что ваши строки отправляются с неправильной длиной., @Duncan C

Спасибо @Juraj это решает проблему. Я понимаю свою ошибку. Я заменил String на char* в своем коде и в каждом классе. Я использую strcat для объединения моего char *, но я не знаю, является ли это лучшим решением. @DuncanC Да, сначала я считал, что у меня плохая связь или что-то в этом роде., @2CoB9


1 ответ


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

2

Ваш код для вычисления длины строкиs не имеет смысла. Строковый тип - это тип объекта. Адреса ваших строковых объектов не будут соответствовать длине символов в этих строках. Вы должны использовать массив строк C, как предложил Juraj, а затем использовать strlen (), чтобы получить длину этих строк (строки C имеют нулевой завершающий байт, и strlen() использует этот нуль для вычисления длины. Обратите внимание, что строки C не могут обрабатывать Unicode.)

В любом случае строкового типа лучше избегать на Arduino, так как строковые объекты имеют тенденцию фрагментировать чрезвычайно ограниченную память кучи на устройствах Arduino и вызывать сбои из-за нехватки памяти.

,

Да, моя ошибка заключается в использовании строкового объекта, такого как указатель char *. Я бы использовал указатель `char *" вместо объекта "String" в моем будущем коде. Спасибо за ваш ответ!, @2CoB9