ж/к дисплей WH1601

Lictor
Offline
Зарегистрирован: 01.10.2015

Доброго времени суток!

Попал мне в руки дисплей WH1601. Однострочный, но мнящий себя двухстрочным. Конечно же это было выяснено вначале опытным путем, а потом найдено в интернете и даташите. Скачать библиотеку было бы слишком просто, поэтому я решил... барабанная дробь.... написать класс. Раньше я этого не делал. Стоит ли говорить, что не взлетело. прошу помощи. Компилляцию проходит без проблем, но экран ничего не отображает.

#include <LiquidCrystal.h>  //отображение данных на дисплее
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);  //пины к которым подключен дисплей

char Text[16];

class screen
{
private:

public:
void Print(char Text[]){
  /*разбиваю строку на символы, если их боььше 16, то выводу ERROR, 
  если меньше или равно, разбиваю на две строки и вывожу на экран*/
   lcd.print(Text);
}
protected:
};

void setup() {
  lcd.begin(8, 2);
  screen Screen;
  Text[16] = "1235123";
  Screen.Print(Text);
  /*
  lcd.print("TEST  TE");
  lcd.setCursor(0, 1);
  lcd.print("ST  TEST");
  */
}

void loop() {

  }

 

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

О наследовании классов почитайте. В вашем случаю правильнее ваш класс наследовать от LiquidCrystal. Тогда не надо будет отдельно lcd определять.

b707
Offline
Зарегистрирован: 26.05.2017

В строке 22 написан откровенный бред. Вы присваиваете ОДНОМУ символу целую строку, еще и по неверному адрусу в памяти.

Стоит ли с таким уровнем браться за свои классы? К тому же в чем смысл вашего класса, который лишь выхывает метод Print класса lcd ?

.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Не, там глобального объекта нет. В классе у него уже свой массив определен в функции. Правильнее его тока через константную ссылку передавать.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

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

Евгений, а где у него глобальный обьект в его классе? Массив Text - локальный массив метода, он лишь случайно имеет то же имя, как глобальный.

Logik
Offline
Зарегистрирован: 05.08.2014

Да. За такие оценки студенты бют преподов, причем не по рукам а в подворотне.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

Евгений, а где у него глобальный обьект в его классе?

В строке 14 используется глобальный объект lcd.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

roman2712@mail.ru пишет:
Не, там глобального объекта нет.
А lcd локален? ну, тогда ладно :)

Lictor
Offline
Зарегистрирован: 01.10.2015

вот что я пытался сделать, может кому-нибудь пригодится...

#include <LiquidCrystal.h>  //отображение данных на дисплее
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);  //пины к которым подключен дисплей

class screen
{
  private:
    String a;
    String b;

  public:
    void Print(String Text) {
      lcd.clear();
      if (Text.length() > 16) lcd.print("ERROR");
      else {
      a = Text.substring(0, 8);
      b = Text.substring(8, Text.length());
      lcd.print(a);
      lcd.setCursor(0, 1);
      lcd.print(b);
      }
    }
  protected:
} Screen;

void setup() {
  lcd.begin(8, 2);
  Screen.Print("TEst 123 teST");  //ваш текст
}

void loop() {

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Зря Вы не послушали советов в посте #1 и (собственно о том же) в посте #3. Вы бы получили поленый навык, а так Вы просто привыкаете к очень плохой практике.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Lictor пишет:

вот что я пытался сделать, может кому-нибудь пригодится...

Всё очень плохо. Передача String по значению в функцию, кучу ненужного кода с substring - зачем?

b707
Offline
Зарегистрирован: 26.05.2017

Lictor пишет:

вот что я пытался сделать, может кому-нибудь пригодится...

никому "это" не пригодится. Что за тяга - только научившись отличать процедуру от метода, уже писать "библиотеки" и предлагать свои "ХУДОжества" другим?

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

Lictor пишет:

поэтому я решил... барабанная дробь.... написать класс

Зачем нужен класс, когда и без него всё нормально выводится?

char test[] = "test12test34test";
lcd.setCursor(0, 0); lcd.print(test);
lcd.setCursor(0, 1); lcd.print(test+8);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arduinec пишет:

Зачем нужен класс, когда и без него всё нормально выводится?

НУ, как Вы не понимаете?!? С классом же классно!

GarryC
Offline
Зарегистрирован: 08.08.2016

Новый уровень абстракции способен решить любую проблему, за исключением случая избыточной абстракции.

Lictor
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП пишет:

arduinec пишет:

Зачем нужен класс, когда и без него всё нормально выводится?

НУ, как Вы не понимаете?!? С классом же классно!

 

Помимо того, что это и правда классно, надо же с чего-то начинать. Если я правильно понял, основная претензия искушенной публики к написанному классу это то, что он использует объект из другого класса вместо того, что бы унаследовать его? 

 

Я тут пробую разобраться с наследованием 1 2 3

Но пока получается не очень.

#include <LiquidCrystal.h>  //отображение данных на дисплее
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);  //пины к которым подключен дисплей

class screen : public LiquidCrystal    // производный класс, класс LiquidCrystal сам является наследником класса Print: class LiquidCrystal : public Print
{
  private:  //необходимы для разбития строки
    String a;
    String b;

  public:
void Print(String Text) : void print();
 /*   
 void Print(String Text) {
      lcd.clear();
      if (Text.length() > 16) lcd.print("ERROR");
      else {
        a = Text.substring(0, 8);
        b = Text.substring(8, Text.length());
        lcd.print(a);
        lcd.setCursor(0, 1);
        lcd.print(b);
      }
    }
    */

  protected:
  
} Screen;

void setup() {
  lcd.begin(8, 2);
 // Screen.Print("TEst 123 teST");
}

void loop() {
}

Я что-то совсем запутался, подскажите, что делать дальше?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы что-нибудь прочиталт про наследование? Похоже, нет, и пытаетесь методом тыка, так?

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

#include <LiquidCrystal.h>  //отображение данных на дисплее

// LiquidCrystal lcd(9, 8, 7, 6, 5, 4);  // ЭТО УЖЕ НЕ НУЖНО (см. строку 41)

class screen : public LiquidCrystal    // производный класс, класс LiquidCrystal сам является наследником класса Print: class LiquidCrystal : public Print
{
  private:  //необходимы для разбития строки
    String a;
    String b;

  public:
  
  // Обязательно нужен коснтруктор, даже пустой, иначе никто не передаст параметры кнстуктору LiquidCrystal.
  screen(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) : LiquidCrystal(rs, enable, d0, d1, d2, d3) {}
  
//void Print(String Text) : void print(); // Это ещё что за бред? Чего хотел сказать-то?
   
 //void Print(String Text) { // БЛИН, ну сколько раз Вам можно говорить
 		// Не надо передавать String по значению !!!!
  void Print(String & Text) {
      //lcd.clear(); // НЕ НАДО НИКАКОГО lcd - мы ведь сами LiquidCrystal
      clear();
      if (Text.length() > 16) print("ERROR"); // НЕ НАДО НИКАКОГО lcd - мы ведь сами LiquidCrystal
      else {
        a = Text.substring(0, 8);
        b = Text.substring(8, Text.length());
//        lcd.print(a);	// НЕ НАДО НИКАКОГО lcd - мы ведь сами LiquidCrystal
//        lcd.setCursor(0, 1);
//        lcd.print(b);
        print(a);	// НЕ НАДО НИКАКОГО lcd - мы ведь сами lcd
        setCursor(0, 1);
        print(b);
      }
    }
    

  protected:
  
};

screen lcd(9, 8, 7, 6, 5, 4); // объявляем своим классам
// теперь с lcd можно делать ВСЁ, что можно было бы, если бы
// он был объявлен как LiquidCrystal (в этом суть наследования),
// а также и то, что описано в самом lcd (метод Print)

void setup() {
  lcd.begin(8, 2);
 // Screen.Print("TEst 123 teST"); // Так не пойдёт, уж объявил String, так и передавай String
 String s = "TEst 123 teST";
	lcd.Print(s);
}

void loop() {
}

Т.е. класс - это новый тип данных. Коль скоро он пронаследован, то этот тип умеет ВСЁ, что умел родитедль + своё. И переменную надо объявлять этого нового типа.

Я не разбирался что и как Вы там печатаете, просто поправил на использование класса, а не глобального lcd.