ж/к дисплей WH1601
- Войдите на сайт для отправки комментариев
Втр, 12/12/2017 - 19:32
Доброго времени суток!
Попал мне в руки дисплей 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() {
}
О наследовании классов почитайте. В вашем случаю правильнее ваш класс наследовать от LiquidCrystal. Тогда не надо будет отдельно lcd определять.
В строке 22 написан откровенный бред. Вы присваиваете ОДНОМУ символу целую строку, еще и по неверному адрусу в памяти.
Стоит ли с таким уровнем браться за свои классы? К тому же в чем смысл вашего класса, который лишь выхывает метод Print класса lcd ?
.
Lictor, за использование глобальных объектов в классах студентов бьют по рукам.
Не, там глобального объекта нет. В классе у него уже свой массив определен в функции. Правильнее его тока через константную ссылку передавать.
Lictor, за использование глобальных объектов в классах студентов бьют по рукам.
Евгений, а где у него глобальный обьект в его классе? Массив Text - локальный массив метода, он лишь случайно имеет то же имя, как глобальный.
Да. За такие оценки студенты бют преподов, причем не по рукам а в подворотне.
Евгений, а где у него глобальный обьект в его классе?
В строке 14 используется глобальный объект lcd.
вот что я пытался сделать, может кому-нибудь пригодится...
#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() { }Зря Вы не послушали советов в посте #1 и (собственно о том же) в посте #3. Вы бы получили поленый навык, а так Вы просто привыкаете к очень плохой практике.
вот что я пытался сделать, может кому-нибудь пригодится...
Всё очень плохо. Передача String по значению в функцию, кучу ненужного кода с substring - зачем?
вот что я пытался сделать, может кому-нибудь пригодится...
никому "это" не пригодится. Что за тяга - только научившись отличать процедуру от метода, уже писать "библиотеки" и предлагать свои "ХУДОжества" другим?
поэтому я решил... барабанная дробь.... написать класс
Зачем нужен класс, когда и без него всё нормально выводится?
Зачем нужен класс, когда и без него всё нормально выводится?
НУ, как Вы не понимаете?!? С классом же классно!
Новый уровень абстракции способен решить любую проблему, за исключением случая избыточной абстракции.
Зачем нужен класс, когда и без него всё нормально выводится?
НУ, как Вы не понимаете?!? С классом же классно!
Помимо того, что это и правда классно, надо же с чего-то начинать. Если я правильно понял, основная претензия искушенной публики к написанному классу это то, что он использует объект из другого класса вместо того, что бы унаследовать его?
Я тут пробую разобраться с наследованием 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() { }Я что-то совсем запутался, подскажите, что делать дальше?
Вы что-нибудь прочиталт про наследование? Похоже, нет, и пытаетесь методом тыка, так?
У Вас принципиально неверный подход. Вот смотрите, я на базе Вашего кода, приведу несколько строк, показывающих идею
#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.