Проблема отображения "своих" символов LCD 1602A
- Войдите на сайт для отправки комментариев
Пт, 05/02/2016 - 21:52
Добрый вечер! Образовалась для меня непонятная проблема, в свой скетч хотел добавить два "своих" символа (символ нажатой и отжатой кнопки), но после загрузки отображаются непонятные символы. Проверил на отдельном скетче:
#include <LiquidCrystal.h> /* Описываем наш символ в виде массива битовых масок. * Каждый символ - это восемь масок по пять бит. * тут 8 - высота клетки экрана */ byte of[8] = { B01110, B01110, B01110, B01110, B01110, B01110, B11111, B11111, }; byte on[8] = { B00000, B00000, B00000, B00000, B01110, B01110, B11111, B11111, }; /* Объявляем объект нашего дисплея */ LiquidCrystal lcd(41, 45, 47, 49, 51, 53); void setup() { pinMode(43, OUTPUT);//Настроим пин 43 на землю digitalWrite(43, LOW); /* Регистрируем собственный символы с кодом 1 */ lcd.createChar(1, on); lcd.createChar(2, of); } void loop() { lcd.begin(16,2); lcd.setCursor(0, 0); lcd.print("\2"); lcd.setCursor(7, 1); lcd.print("\1"); delay(2000); lcd.clear(); }
Cимволы отображаются нормально - Фото. Снова загружаю свой код, все начинает показывать нормально (видео), но стоить выключить и снова включить ардуино, снова вылазят непонятные символы.
Вот мой код (из него убраны некоторые функции, что бы не зограмождать страничку, но дажке в таком виде выскакиваю непонятные символы.):
float temp1=0; //переменная для текущего значения температуры головки float temp2=0; //переменная для текущего значения температуры чипа float temp3=0; //переменная для текущего значения температуры стола float temp4=0; //переменная для текущего значения температуры платы int setTmp=0; // переменная для заданного значения температуры стола int setTmpGolovka=0; // переменная для заданного значения температуры головки //Создаем переменную для хранения состояния головки int backlightStatusGolovki=0; //Создаем переменную для хранения состояния стола int backlightStatus=0; //Подключаем LCD-дисплей #include <LiquidCrystal.h> LiquidCrystal lcd(41, 45, 47, 49, 51, 53); // Описываем наши собственные символы в виде массивов битовых масок. Каждый символ - это восемь масок по пять бит. byte of[8] = { B01110, B01110, B01110, B01110, B01110, B01110, B11111, B11111, }; byte on[8] = { B00000, B00000, B00000, B00000, B01110, B01110, B11111, B11111, }; //Заданная температура будет храниться по адресу 0 и 2 #include <EEPROM2.h> //Реле подключено к пину D48 реле стола #define RELAY_PIN 48 //Реле подключено к пину D50 реле головки #define RELAY_PIN2 50 //Объявим переменную для хранения состояния реле boolean relayStatus1=LOW; // Статус стола boolean relayStatus2=LOW; // Статус головки //Объявим переменные для задания задержки long previousMillis1 = 0; long interval1 = 1000; // интервал опроса датчиков температуры #define KEYANALOG A6 // Темодатчик стола #define KEYANALOGG A0 // Темодатчик головки #define KEYANALOGP A4 // Темодатчик платы #define KEYANALOGC A2 // Темодатчик чипа //Аналоговая клавиатура #define KEYPAD_PINV A15 // Верхний ряд: 1- Уменьшение 2-увеличение 3-установка температуры головки 4-вкл/выкл #define KEYPAD_PIN A14 // Нижний ряд: 1- Уменьшение 2-увеличение 3-установка температуры стола 4-вкл/выкл //Определим значения на аналоговом входе для клавиатуры #define ButtonUp_LOW 400 // 2 рад кнопка 1 #define ButtonUp_HIGH 410 // 2 рад кнопка 1 #define ButtonDown_LOW 200 // 2 рад кнопка 2 #define ButtonDown_HIGH 205 // 2 рад кнопка 2 #define ButtonSelect_LOW 600 // 2 рад кнопка 3 #define ButtonSelect_HIGH 615 // 2 рад кнопка 3 #define ButtonRight_LOW 800 // 2 рад кнопка 4 #define ButtonRight_HIGH 820 // 2 рад кнопка 4 void setup() { // Регистрируем собственные символы с кодами 0, 1 и 2 //lcd.begin(16, 2); lcd.createChar(1, of); lcd.createChar(2, on); pinMode(RELAY_PIN,OUTPUT); //Настроим пин для управления реле стола digitalWrite(RELAY_PIN,LOW); pinMode(RELAY_PIN2,OUTPUT);//Настроим пин для управления реле головки digitalWrite(RELAY_PIN2,LOW); pinMode(43, OUTPUT);//Настроим пин 43 на землю digitalWrite(43, LOW); //Считаем из постоянной памяти заданную температуру setTmpGolovka=EEPROM_read_byte(2); setTmp=EEPROM_read_byte(0); //Выведем на дисплей стартовое сообщение на 2 секунды lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print(" Termostat "); lcd.setCursor(0, 1); lcd.print(" v1.0 "); delay(2000); lcd.begin(16, 2); // выведем на дисплей заданное значение температуры головки на 2 секунды lcd.setCursor(0, 0); lcd.print("Set temp stol: "); lcd.setCursor(7,1); lcd.print(setTmpGolovka); delay(2000); // выведем на дисплей заданное значение температуры стола на 2 секунды lcd.setCursor(0, 0); lcd.print(" Set temp golov:"); lcd.setCursor(7,1); lcd.print(setTmp); delay(2000); //Очистим дисплей lcd.begin(16, 2); } void loop() { //Модуль опроса датчиков и получения сведений о температуре //Вызывается 1 раз в секунду unsigned long currentMillis1 = millis(); if(currentMillis1 - previousMillis1 > interval1) { previousMillis1 = currentMillis1; lcd.clear(); // delay(200); // задержка для обработки информации внутри термометра, в данном случае можно не задавать //Считывание значения температуры int termistor = 0; termistor = analogRead(KEYANALOG); temp1 = map(termistor, 43, 400, 0, 350); // Температура головки int termistors = 0; termistors = analogRead(KEYANALOGG); temp2 = map(termistors, 29, 400, 1, 350); // Температура головки int termistorp = 0; termistorp = analogRead(KEYANALOGP); temp3 = map(termistorp, 43, 400, 0, 350); // Температура платы int termistorc = 0; termistorc = analogRead(KEYANALOGC); temp4 = map(termistorc, 62, 545, 1, 350); // Температура чипа. // Вывод текущего значения температуры на дисплей //lcd.clear(); lcd.setCursor(0, 0); lcd.print("C:"); lcd.setCursor(2, 0); lcd.print(temp2, 0); lcd.setCursor(6, 0); lcd.print("G:"); lcd.setCursor(8, 0); lcd.print(temp1, 0); lcd.setCursor(12, 0); if (relayStatus1==HIGH) lcd.print("ON"); // показываем состояние выхода else lcd.print("OFF"); lcd.setCursor(15, 0); if (backlightStatusGolovki==1) lcd.print("\1"); // показываем состояние выхода else lcd.print("\2"); lcd.setCursor(0, 1); lcd.print("P:"); lcd.setCursor(2, 1); lcd.print(temp4, 0); lcd.setCursor(6, 1); lcd.print("S:"); lcd.setCursor(8, 1); lcd.print(temp3, 0); lcd.setCursor(12, 1); if (relayStatus2==HIGH) lcd.print("ON"); // показываем состояние выхода else lcd.print("OFF"); lcd.setCursor(15, 1); if (backlightStatus==1) lcd.print("\1"); // показываем состояние выхода else lcd.print("\2"); } //Проверка условия включения/выключения нагревателя головки if (temp3<(setTmpGolovka-1)&&relayStatus2==LOW&&backlightStatus==1) {relayStatus2=HIGH; digitalWrite(RELAY_PIN2,HIGH);} if (temp3>(setTmpGolovka+1)&&relayStatus2==HIGH) {relayStatus2=LOW; digitalWrite(RELAY_PIN2,LOW);} //Проверка условия включения/выключения нагревателя стола if (temp1<(setTmp-1)&&relayStatus1==LOW&&backlightStatusGolovki==1) {relayStatus1=HIGH; digitalWrite(RELAY_PIN,HIGH);} if (temp1>(setTmp+1)&&relayStatus1==HIGH) {relayStatus1=LOW; digitalWrite(RELAY_PIN,LOW);} int Featurev = ReadKey(KEYPAD_PINV); // Опрос клавиатуры верхней int Feature = ReadKey(KEYPAD_PIN); // Опрос клавиатуры нижней // Включение / отключение головки if (Feature==4 ) {delay(200);setGolov();} // Включение / отключение головки if (Featurev==4 ) {delay(200);setStol();} // Переход к редактированию температуры головки if (Featurev==5 ) {delay(200);setTemperatureGolovka();} // Переход к редактированию температуры стола if (Feature==5 ) {delay(200);setTemperature();} }
В чем может быть причина?
То же самое...
077
lcd.createChar(0, of);
078
lcd.createChar(1, on);
и
1
lcd.print((
char
)0);
2
lcd.print((
char
)1);
если и так не будет, то мне лениво смотреть, где ты в коде ломаешь, записанные символы.
Теперь символы немного изменились, но все равно не похожи на заданные мной - фото. А как я могу их ломать, использую только в двух местах вывод все: строка 150-151 и 167-168
Теперь символы немного изменились, но все равно не похожи на заданные мной - фото. А как я могу их ломать, использую только в двух местах вывод все: строка 150-151 и 167-168
откуда я знаю, как ты это делаешь, но факт налицо.
вот эта дурь зачем столько раз?
090
lcd.begin(16, 2);
096
lcd.begin(16, 2);
111
lcd.begin(16, 2);
если нужно здесь один раз - зачем оно закоментировано?
076
//lcd.begin(16, 2);
077
lcd.createChar(1, of);
078
lcd.createChar(2, on);
Изменил теперь по другому очищаю дисплей после вывода информации, через clear. Но картина не поменялась.
на тебе рабочую болванку - тренируйся, где ты в своём коде хернёй занимаешься.
Спасибо. Убрал инициализацию дисплея в loop и все стало на место. Попутно вопрос как правельно вывести несколько одинаковых символов в подряд:
Или можно как то более сокращенно?
Попутно вопрос как правельно вывести несколько одинаковых символов в подряд
Для ненулевых символов можно так:
lcd.print("\1\1\1\2\2\2\3\4\5\6\7");
Нулевой символ "\0" в такой строке воспринимается как символ окончания строки.