ЖК-дисплей странные символы

Я новичок. У меня проблема с отображением текста на ЖК-дисплее (16x2). Он показывает неправильное сообщение на ЖК-дисплее. Вот код и картинка, которая дает неправильный вывод : Пожалуйста, помогите, Спасибо.

#include "SIM900.h"
#include <SoftwareSerial.h>

#include "sms.h"
#include <LiquidCrystal.h>

// инициализируйте библиотеку номерами интерфейсных контактов
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//gsm
SMSGSM sms;

int numdata;
boolean started  = false;
char smsbuffer[160]; //сообщение
String newsms;
char n[20];
unsigned char i;
//lcd
int sensorPin = A0; // выберите входной штифт для потенциометра
int sensorValue = 0; // переменная для хранения значения, поступающего от датчика
int outputValue = 0; // вывод значения в %
int outputValue1 = 0; // вывод значения в курсор



void setup()
{
  //Последовательное соединение.
  //gsm
    lcd.begin(16, 2);

  Serial.begin(9600);

//  lcd.setCursor(0, 1);
//  lcd.clear();
//  lcd.print("   Беспроводная связь через GSM"); //55 символов
//  lcd.setCursor(0, 2);
//  lcd.print("    Notice Board "); //55 символов
   Serial.println("GSM Shield testing.");
  if (gsm.begin(2400)) {
    Serial.println("\nstatus=READY");
    started = true;
  }
  else Serial.println("\nstatus=IDLE");

  //lcd
  // настройка количества столбцов и строк на ЖК-дисплее:

};

void loop()
{

  // считывание значения с датчика:
  sensorValue = analogRead(sensorPin);
  // сопоставьте его с диапазоном аналогового выхода:
  outputValue = map(sensorValue, 0, 1023, 0, 100);
  outputValue1 = map(sensorValue, 0, 1023, 0, 200);

  //scroll = lcd.scrollDisplayLeft();
  if (started) {
    //Прочитайте, есть ли сообщения на SIM-карте, и распечатайте их.
    if (gsm.readSMS(smsbuffer, 160, n, 20))
    {
      //lcd
      lcd.clear();
      lcd.setCursor(0, 2);
      lcd.print("SMS Received!");
      delay(2000);
      lcd.clear();
      lcd.setCursor(0,1);
      Serial.println(n);
      Serial.println(smsbuffer);
      lcd.print(smsbuffer);
      delay(1000);
//      lcd.clear();
    }
    delay(1000);
  }
}

, 👍1

Обсуждение

Какие символы выводит Serial.println(smsbuffer); на последовательный монитор?, @VE7JRO

Да В последовательном мониторе он отображает правильное сообщение, которое отправляется отправителем, но когда я печатаю его на ЖК-дисплее, он не отображает тот же вывод, что и последовательный монитор, Он отображает только изображение, которое я загружаю., @Megumichan

Пожалуйста, отредактируйте свой вопрос, чтобы показать подключение ЖК-дисплея к вашему Arduino. Вы уверены, что не поменяли один из проводов линии передачи данных? (https://www.arduino.cc/en/Tutorial/HelloWorld) Каждое сообщение отображается неправильно или только содержимое "smsbuffer"? Вы пробовали запустить минимальный скетч, чтобы просто протестировать ЖК-дисплей с "hello world"?, @Maximilian Gerhardt

Я распечатал smsbuffer последовательно, чтобы увидеть содержимое получаемого сообщения. Ну в последовательном он дает правильный вывод/содержание, что сообщение отправителя. но когда я печатаю его на жидкокристаллическом дисплее, он показывает неправильное содержимое., @Megumichan

@Megumichan, "когда я печатаю его на жидкокристаллическом дисплее, он показывает неправильное содержимое".... вы неправильно понимаете проблему ... жидкокристаллический дисплей отображает точно правильный контент ... он отображает то, что вы говорите ему отображать ... вы должны выяснить, почему ваша программа отправляет контент, который вы не хотите видеть ... начните с запуска демо-версии "HelloWorld"., @jsotola

мы начинаем запускать демонстрацию hello world на ЖК-дисплее, и да, она отлично работает на ЖК-дисплее. но когда дело доходит до этого кода, это не так. он отображает только то, что на картинке, которую я загружаю, @Megumichan

Я печатаю содержимое smsbuffer, когда оно уже получает сообщение, и когда я печатаю smsbuffer в последовательном мониторе, содержимое является правильным и правильным. но почему, когда дело доходит до ЖК-дисплея, это не так?], @Megumichan

Можете ли вы привести пример строки, содержащей "smsbuffer"? Что это за точные символы? Библиотека LCD, вероятно, может работать только с ASCII, для остального вам нужно будет определить пользовательские наборы символов., @Maximilian Gerhardt


3 ответа


1

Первое, что нужно попробовать, это заменить lcd.begin(16, 2) на lcd.begin(20, 4). Изображение вашего ЖК-дисплея выглядит как дисплей размером 20 на 4 строки. Судя по вашим комментариям, похоже, что часть вашего кода SMS работает, потому что она выводит правильные символы на последовательный монитор. Я бы сосредоточился на коде ЖК - дисплея и подключениях к вашему Arduino.

,

Да, в последовательном он показывает правильное содержание сообщения, но на ЖК-дисплее отображается символ градуса(расширенный ascii-код). Можно ли преобразовать этот ascii-код в строку? или как я могу удалить этот код степени ascii и изменить его на текст? Спасибо, @Megumichan

Чем бы вы хотели заменить символ степени?, @VE7JRO

могу ли я заменить символ степени на строку ??, @Megumichan

Я не совсем понимаю, что вы имеете в виду под "привязать". Пустая строка? Символ пробела?, @VE7JRO


1

Я прибыл немного поздно, однако оставляю некоторую дополнительную информацию для отладки подобных проблем для тех, кто прибудет сюда в будущем.


Что касается вопроса

Как уже было сказано выше:
- Вы указываете свой ЖК-дисплей как 16 столбцов с 2 строками (1602); и на вашей картинке у вас явно есть 20 столбцов с 4 строками.

Изменение:

lcd.begin(16, 2);

Кому:

lcd.begin(20, 4);


Как Работает жидкокристаллический дисплей

Примите во внимание, что жидкокристаллический дисплей работает как матрица, а столбцы и строки имеют нулевой индекс. То есть, когда вы устанавливаете жидкокристаллический курсор на Столбцы или строки, вы начинаете отсчет с 0.

См. Пример Ниже:

lcd.setCursor(0, 2);

1-Й Параметр (Ноль) Представляет Столбцы.
2-Й (Два) Представляет Собой Строки.

Поэтому по 1 - му параметру: "0" (столбец); (Учитывая, что вы читаете слева направо и Сверху вниз); Вы устанавливаете курсор на ту самую колонку 1 на жидкокристаллическом дисплее.

2-й параметр (2): вы будете устанавливать символ char в 3-й строке (строке).

Примечание: 3-й, а не 2-й; потому что и столбцы, и строки индексируются "по нулю".


Отладка жидкокристаллических проблем

  1. Проверьте, правильно ли Подключен ваш жидкокристаллический дисплей. Возможно, вы переключили провод; провод неправильно подключен или сломан. Особенно если вы не используете задний модуль I2C). Проводка без модуля I2C (“I Squared C”) может привести к путанице в некоторых случаях.

  2. Проверьте свою библиотеку и аппаратное обеспечение. Убедитесь, что вы используете правильную библиотеку (библиотека I2C: если ваш ЖК-дисплей имеет модуль: используйте совместимую библиотеку I2C; и укажите соответствующие параметры ЖК-дисплея). Если у вас нет модуля I2C, то используйте библиотеку, чтобы найти обходной путь для этой ситуации. (Вы указываете все контакты).

  3. Проверьте свой код: Проверьте, как вы инициализируете свой жидкокристаллический дисплей. то есть: lcd.begin(16,2); или lcd.begin(20,4);

  4. Убедитесь, что вы печатаете внутри жидкокристаллического индекса. Установка курсора за его пределы также может привести к появлению “странных” символов.

  5. Могут возникнуть и другие ситуации, связанные с неправильной проводкой или каким-то коротким замыканием с другими компонентами, подключенными к вашему проекту, что также может привести к появлению странных символов.

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

  7. Не очищая ЖК-дисплей всякий раз, когда появляются новые данные, можно имитировать эффект странных символов; но на самом деле это старые символы данных, которые остались там.


Запись пользовательских символов на ЖК-дисплей

Как вы, вероятно, заметили, вы не можете напечатать пользовательский символ (т. Е. Символ степени) на своем ЖК-дисплее. Это можно решить, создав свой собственный (пользовательский) символ и объявив его в своем коде. Я не буду объяснять каждую деталь, чтобы не уходить от темы и не давать развернутый и трудночитаемый ответ. Вместо этого оставим пример, который легко понять и 2 Ссылки ниже с дополнительной информацией о пользовательских символах.


Ссылки:

  • Дополнительные сведения и примеры пользовательских символов.
  • ЖК-генератор символов


Пример для символа степени

/* Пользовательские символы LCD
*******************************************/
// Это ваше определение Char в байтах:
byte DegreeDef[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 };

// Это байтовый символ, который будет использоваться для записи на ЖК-дисплей.
const byte Degree = 0x2;


void LCDInitialization()
{  
  // Код инициализации LCD Здесь
  // ...

  // Инициализировать Пользовательские Символы.
  lcd.createChar(2, DegreeDef);

  // Сделай Что-Нибудь Еще...
}

void PrintToLCD()
{
  // Примечание:
  // "lcd.write" отличается от "lcd.print".
  // Используйте "write" для печати пользовательских ЖК-символов.
  lcd.setCursor(0, 1);
  lcd.write(Degree);
}

Я надеюсь, что это поможет отладить вашу проблему.

,

1

Здравствуйте, у меня была та же проблема, и я заметил, что если вы настроите ЖК-экран в следующем порядке:

LiquidCrystal lcd (d7, d6, d5, d4, , en, rs) ;

у тебя появляется какой-то странный символ... но если вы поступите так:

LiquidCrystal lcd (rs, en, d4, d5, d6, d7) ;

у тебя нет никакого странного характера.

,