Проблема отображения "своих" символов LCD 1602A

ppbinag
Offline
Зарегистрирован: 12.01.2015

Добрый вечер! Образовалась для меня непонятная проблема, в свой скетч хотел добавить два "своих" символа (символ нажатой и отжатой кнопки), но после загрузки отображаются непонятные символы. Проверил на отдельном скетче:

#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();}
}

В чем может быть причина?

Клапауций 322
Offline
Зарегистрирован: 31.12.2015
lcd.print((char)1);
lcd.print((char)2);

 

ppbinag
Offline
Зарегистрирован: 12.01.2015

То же самое...

Клапауций 322
Offline
Зарегистрирован: 31.12.2015
077   lcd.createChar(0, of);
078   lcd.createChar(1, on);

и

1 lcd.print((char)0);
2 lcd.print((char)1);

если и так не будет, то мне лениво смотреть, где ты в коде ломаешь, записанные символы.

ppbinag
Offline
Зарегистрирован: 12.01.2015

Теперь символы немного изменились, но все равно не похожи на заданные мной - фото. А как я могу их ломать, использую только в двух  местах вывод  все: строка 150-151 и 167-168

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

ppbinag пишет:

Теперь символы немного изменились, но все равно не похожи на заданные мной - фото. А как я могу их ломать, использую только в двух  местах вывод  все: строка 150-151 и 167-168

откуда я знаю, как ты это делаешь, но факт налицо.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

вот эта дурь зачем столько раз?

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);

 

ppbinag
Offline
Зарегистрирован: 12.01.2015

Изменил теперь по другому очищаю дисплей после вывода информации, через 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();
}

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

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


#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);
ppbinag
Offline
Зарегистрирован: 12.01.2015

Спасибо. Убрал инициализацию дисплея в loop  и все стало на место. Попутно вопрос  как правельно вывести несколько одинаковых символов в подряд:

lcd.setCursor(0, 0);
lcd.print((char)0);
lcd.setCursor(1, 0);
lcd.print((char)0);
lcd.setCursor(2, 0);
lcd.print((char)0);

Или можно как то более сокращенно?

arduinec
Offline
Зарегистрирован: 01.09.2015

ppbinag пишет:

Попутно вопрос  как правельно вывести несколько одинаковых символов в подряд

Для ненулевых символов можно так:
lcd.print("\1\1\1\2\2\2\3\4\5\6\7");

Нулевой символ "\0" в такой строке воспринимается как символ окончания строки.