Проблема отображения "своих" символов 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();}
}
В чем может быть причина?
То же самое...
077lcd.createChar(0, of);078lcd.createChar(1, on);и
1lcd.print((char)0);2lcd.print((char)1);если и так не будет, то мне лениво смотреть, где ты в коде ломаешь, записанные символы.
Теперь символы немного изменились, но все равно не похожи на заданные мной - фото. А как я могу их ломать, использую только в двух местах вывод все: строка 150-151 и 167-168
Теперь символы немного изменились, но все равно не похожи на заданные мной - фото. А как я могу их ломать, использую только в двух местах вывод все: строка 150-151 и 167-168
откуда я знаю, как ты это делаешь, но факт налицо.
вот эта дурь зачем столько раз?
090lcd.begin(16, 2);096lcd.begin(16, 2);111lcd.begin(16, 2);если нужно здесь один раз - зачем оно закоментировано?
076//lcd.begin(16, 2);077lcd.createChar(1, of);078lcd.createChar(2, on);Изменил теперь по другому очищаю дисплей после вывода информации, через clear. Но картина не поменялась.
void setup() { // Регистрируем собственные символы с кодами 0, 1 и 2 lcd.begin(16, 2); lcd.createChar(0, of); lcd.createChar(1, 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); lcd.clear(); // выведем на дисплей заданное значение температуры головки на 2 секунды lcd.setCursor(0, 0); lcd.print("Set temp stol: "); lcd.setCursor(7,1); lcd.print(setTmpGolovka); delay(2000); lcd.clear(); // выведем на дисплей заданное значение температуры стола на 2 секунды lcd.setCursor(0, 0); lcd.print(" Set temp golov:"); lcd.setCursor(7,1); lcd.print(setTmp); delay(2000); //Очистим дисплей // lcd.begin(16, 2); lcd.clear(); }на тебе рабочую болванку - тренируйся, где ты в своём коде хернёй занимаешься.
#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, }; void setup() { lcd.begin(16, 2); lcd.createChar(0, on); lcd.createChar(1, of); } void loop() { lcd.setCursor(0, 0); lcd.print((char)0); delay(2000); lcd.setCursor(0, 0); lcd.print((char)1); delay(2000);Спасибо. Убрал инициализацию дисплея в loop и все стало на место. Попутно вопрос как правельно вывести несколько одинаковых символов в подряд:
Или можно как то более сокращенно?
Попутно вопрос как правельно вывести несколько одинаковых символов в подряд
Для ненулевых символов можно так:
lcd.print("\1\1\1\2\2\2\3\4\5\6\7");
Нулевой символ "\0" в такой строке воспринимается как символ окончания строки.