прочесть что-то из дисплея не реально т.к. не выведена нога SDO. Обычное общение происходит через 4 ноги, для приема нужна 5я, которая SDataOut. Возможно в версиях дисплея с незадействованной ногой это она и есть. У меня она отсутствует. Режим I2C включить не возможно т.к. он включается физически комбинациями подключений ног SD0 и SD1 контроллера, доступа к которым увы нет.
Вывод: Прочесть инфу со встроенного датчика температуры дисплея Nokia1100 простыми способами невозможно.
Ребят выложите кто нибудь вольтметр для 1202 замучился искать.Что не найду не пашет или ошибки лезут.Програмировать не умею так что помогите.Пробники типа v1.5 стают на ура.
Ты сначала просто вольтметр сделай, примеров море, в терминал например будет отправлять напряжение. А вот когда у тебя будет что выводить и прицепишь дисплей
#include <lcd1202.h>
LCD1202 lcd(8, 7, 6, 5); // RST, CS, MOSI, SCK
int voltage= 1;
void setup() {
lcd.Inicialize(); //Инициализация дисплея
lcd.Clear_LCD(); //Очистка дисплея
Serial.begin(9600);
}
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
// print out the value you read:
Serial.println(voltage);
int t= voltage*100;
Serial.println(t);
float n = t;
String s = String(n, 2);
int i = s.indexOf('.');
if (i >= 0) s.remove(i, 1);
bool b = n < 0;
if (b) s.remove(0, 1);
int n1 = s.substring(0, 1).toInt();
if (b) n1 *= -1;
int n2 = s.substring(1, 2).toInt();
int n3 = s.substring(2, 3).toInt();
int n4 = s.substring(3).toInt();
lcd.print(1, 1, 1, "arduino.ru рулит");
lcd.simb16x32(27, 19, 1, n1); //Выводим в координаты x, y, цветом 1, цифру 8, размером 16х32 пикселя
lcd.fillRect(48, 49, 3, 3, 1); //Рисуем закрашенный прямоугольник по координатам x, y, высота, ширина, цвет
lcd.simb16x32(53, 19, 1, n2); //Выводим в координаты x, y, цветом 1, цифру 8, размером 16х32 пикселя
lcd.simb16x32(79, 19, 1, n3); //Выводим в координаты x, y, цветом 1, цифру 8, размером 16х32 пикселя
lcd.Update();
delay(1000);
lcd.Clear_LCD();
}
Ошибка Call of overloaded String(float&,int)is ambiguous. Я канешно не очень в этом но если простой вольтметр то на мониторе пишет.Не знаю как у кого с 8 станицы он работает у меня нет.Помогите раздуплится.
Может, просто сначала залей библиотечку рабочую эту, и посмотри, как она работает (если дисплэй заработает)? Попробуй поизменять в ней что-нибудь, попробуй разобраться. А уже потом начнешь вольтметр.
Начелось просто попросил дайте пожалуйста вольтметр.Занимаюсь квадриками там и шью контроллеры полетов регуляторы скорости и осд.но никогда не програмировал вот сейчас сижу рзбираюсь.Просто помогите за спасибо!
Да все верно делитель сразу был ато там дури.Сейчас пытался второе число добавить но только ероглифы.Есть заводской 7мисигм но он летает постоянно и там показывает напряжение поочередно.А хотелось отдельно 16в общ и 3.78в 3.9в 3.22в 3.7в отдельно каждая банка причем сразу на одном экране.Кстати если сделать потонше можно в повербанк всунуть причем вроди и без подсветки видно акумов хватает.
Не хочу показаться пессимистом, но как урезали потребление оперативной памяти? Почти все занимает буфер.
Кажется B707 делал менее прожорливую по оперативной памяти в 3 раза, но и процессорное время увеличилось в 3 раза (все что выводится на дисплей 3 раза просчитывалось). Тут похоже иной подход. И на первый взгляд просто текст меню хранить во флеше.
Просто внесу ясность: прожорливость библиотеки не снизилась.
Накладные расходы увеличивались по причине ее неумения читать строки напрямую из Progmem Space. Что приводило к ситуации, в которой неизменные, по своей сути, названия пунктов меню перегружались в RAM и постоянно там болтались. Я просто добавил функцию, которая "понимает", что на вход ей передаётся ссылка на расположенную в Progmem строку и корректно работает с этим типом памяти. За счёт чего и снижается расход RAM скетчем, использующим данную библиотеку.
Делал один проект на OLED SSD1306, и на этапе окончательной сборки треснул дисплей. Нежный. Через пиксель строки не выводятся
Второго не было, поэтому снова использовал 1202. Но показалось как то неудобно каждый раз писать "цвет" выводимого чего-то, поэтому решил убрать, а "цвет" задавать отдельной функцией. Добавил вывод чисел с плавающей запятой (писал выше как то) и использовал хранение текста во флеше о чем писал mobistrike. И убрал из инициализации вывод ресет дисплея (я его цепляю к 3.3В). Кому надо вернут быстро, просто скопировать из предыдущих либ.
Кстати у кого будет выводится только текст на английском, например при компиляции в версии 1.8.5, это нормально. Все дело в кодировках, нет нет да и выведется русский (при очередной компиляции). Кодировка по умолчанию UTF, но иногда почему то 1251. Тут насколько знаю ничего не поделать, просто использовать другую версию IDE.
С 1202 тоже неплохо смотрится, но вот наспех сделанная панель на замену
Обычно я вешаю Rst на RC-цепочку и управляю этим экранчиком 2-мя ногами, на мелких батарейных устройствах - достаточно. Но случилось управлять шлифовальным станком и из-помех пришлось-таки подключить Rst к контроллеру.
Удалось кому подружить библиотеку с esp32? Ругается на lcd1202.cpp:48:7
Не может конвертировать типы данных.
out = portOutputRegister(digitalPinToPort(pin));
Рад представить функцию отображения графика в реальном времени. Скорее всего велосипед но работает.
Писалось под цветной дисплей, но очень легко портировалась под монохромный.
Каждый раз вызывая функцию передаем ей новое значение. Весь график сдвигается на один пиксель влево и прорисовывает новый пиксель справа с новым значением.
График автоматически масштабируется, запоминает все предыдущие полученные значения, выбирает из них максимальное и минимальное и строится в соответствующем масштабе.
При вызове функции указываются координаты вывода а также высота и длинна графика в пикселях.
Дисплей подключен и инициализирован, библиотека установлена.
в основном цикле вызываю функцию графика:
void loop() {
for (float i = 0; i<=100; i+=0.2){
Graph(3,5, 90,45, sin(i)*100);//x,y,длинна, высота, переменная целая в диапазоне int
}
}
В отдельной вкладке всавляю саму функцию
void Graph(byte x,byte y, byte h,byte w, int val){//позиция x,y, высота h, длинна w в пикселях, принимаемое значение init i
static int Y_position [96];//тут максимальное количество точек по горизонтали. Условие 96>=w
static int minVAL;
static int maxVAL;
static int lastP;
if (lastP!=val){ //Если значение изменилось то выполняем код до конца страницы lastP!=val заменить единицей 1 если нужно фиксировать одинаковые значения подряд
lastP=val;
//Очистка прежней линии
for (byte i = 1; i < w; i++){
int Ydata = Y_position [i] - minVAL;
int Ydata_next = Y_position [i+1] - minVAL;
lcd.drawLine(x+i,y+map(Ydata, 0, maxVAL-minVAL,h, 0),x+i+1,y+map(Ydata_next, 0, maxVAL-minVAL,h, 0),0);
}
//Сдвигаем масив влево
for (byte i = 1; i < w; i++){
Y_position [i]= Y_position [i+1];
}
Y_position [w]= val; //Записываем новый элемент массива в последнюю ячейку
//вычисляем масштаб граффика
minVAL=32767; maxVAL=-32768;
for (byte i = 1; i < w+1; i++){
minVAL=min(minVAL , Y_position [i]);
maxVAL=max(maxVAL , Y_position [i]);
}
if (maxVAL-minVAL<15)maxVAL=minVAL+15;
if (minVAL>15) minVAL-=15;
//масштабируем и рисуем граффик
for (byte i = 1; i < w; i++){
int Ydata = Y_position [i] - minVAL;
int Ydata_next = Y_position [i+1] - minVAL;
lcd.drawLine(x+i,y+map(Ydata, 0, maxVAL-minVAL,h, 0),x+i+1,y+map(Ydata_next, 0, maxVAL-minVAL,h, 0),1);
}
}
lcd.Update();
}
#include "font5x3.h"
void LCD1202::print5x3(byte x, byte y, boolean color, char *str){
unsigned char type = *str;
if(type>=128) x=x-3;// ЧТО ОЗНАЧАЕТ 3
while(*str){
drawChar(x, y, color, *str++);
unsigned char type = *str;
(type>=128)? x=x+3 : x=x+6;// ЧТО ТАКОЕ 3 и 6?
}
}
void LCD1202::drawChar5x3(byte x, byte y, boolean color, unsigned char c) {
if((x >= LCD_X) ||(y >= LCD_Y) || ((x + 3) < 0) || ((y + 5) < 0))// Это если символ слишком большой или вылазит за пределы дисплея?
return;
if(c<128) c = c-32;// НЕПОНЯТНЫ ЭТИ ИФЫ
if(c>=144 && c<=175) c = c-48;
if(c>=128 && c<=143) c = c+16;
if(c>=176 && c<=191) c = c-48;
if(c>191) return;
for (byte i=0; i<4; i++ ) { // 4 это число байт в массиве на символ?
byte line;
(i == 3)? line = 0x0 : line = pgm(font5x3+(c*5)+i);
for (byte j = 0; j<6; j++) {
(line & 0x1)? drawPixel(x+i, y+j, color) : drawPixel(x+i, y+j, !color);
line >>= 1;
}
}
}
Не пойму что тут менять.
В итоге в IDE просто будет вызов функции
lcd.print5x3("String");
Нарыл из другой библиотеки возможность увеличивать стандартный шрифт в целое число раз. Не уверен что полезная функция но прикрутить можно.
// ответы пишу по памяти
#include "font5x3.h"
void LCD1202::print5x3(byte x, byte y, boolean color, char *str){
unsigned char type = *str;
if(type>=128) x=x-3;// ЧТО ОЗНАЧАЕТ 3 // это сдвиг нужен для русских шрифтов, связано с ASCII кодов русских символов
while(*str){
drawChar(x, y, color, *str++);
unsigned char type = *str;
(type>=128)? x=x+3 : x=x+6;// ЧТО ТАКОЕ 3 и 6? // тоже связано с русскими символами. шрифт 5х8, поэтому сдвиг на 6, чтобы сделать пробел между буквами.
}
}
void LCD1202::drawChar5x3(byte x, byte y, boolean color, unsigned char c) {
if((x >= LCD_X) ||(y >= LCD_Y) || ((x + 3) < 0) || ((y + 5) < 0))// Это если символ слишком большой или вылазит за пределы дисплея? // да
return;
if(c<128) c = c-32;// НЕПОНЯТНЫ ЭТИ ИФЫ // эти цифры нужны для подгонки, таблица ascii содержит больше символов, чем в библиотеке. фактически проспуски, а в библиотеке они идут по порядку
if(c>=144 && c<=175) c = c-48;
if(c>=128 && c<=143) c = c+16;
if(c>=176 && c<=191) c = c-48;
if(c>191) return;
for (byte i=0; i<4; i++ ) { // 4 это число байт в массиве на символ? // да
byte line;
(i == 3)? line = 0x0 : line = pgm(font5x3+(c*5)+i);
for (byte j = 0; j<6; j++) {
(line & 0x1)? drawPixel(x+i, y+j, color) : drawPixel(x+i, y+j, !color);
line >>= 1;
}
}
}
Не пойму что тут менять.
В итоге в IDE просто будет вызов функции
lcd.print5x3("String"); // так в явном виде не может быть. или нужно сначала координаты задать где выводить отдельной функцией, или в функцию вывода добавить указание координат
lcd.print3x5(0,0,"1.0123456789:;<=>?@!#$%&");
lcd.print3x5(0,6,"2.'()*+,-./_[^]`ABCDEFGH");//указаны ВСЕ возможные символы, которые есть в шрифте
lcd.print3x5(0,12,"3.IJKLMNOPQRSTUVWXYZ");//
lcd.print3x5(0,48,-9);//Печатаем отрицательное число
lcd.print3x5(0,54,10);// печатаем положительное число
lcd.print3x5(0,60,11.516,2);// Печатаем float с округлением до 2го знака
Заменен вывод simb10x16 добавлены символы :.- Теперь выводятся так:
lcd.print10x16(1, 25, -12.56,1); //Выводим в координаты x, y цифру -12.6, размером 10х16 пикселей
lcd.print10x16(1, 45, "-0.5:"); //Выводим строку. Указаны ВСЕ возможные символы кроме цифр
Отредактирован пример
В скетче добавлена возможность отдельно задействовать ногу RST не ломая библиотеку
# define RSTpin A3// RST
Глюк мелкий обнаружил в 162 строке библиотеки нужно исправить "(for (byte j = 0; j<8; j++) " 8 на 5 это количество пикселей по вертикали иначе шрифт подтирает под собой три пикселя. Перезаливать лень.
Что вы мучаетесь, заливайте на гитхаб одной командой : git push origin master
Там и изменения комментировать удобнее и не надо голову ломать что означает словосочетание "отдельно задействовать ногу RST" - сразу в коде видно.
Я хотел бы перенести свой проект из Arduino Nano в ESP8266.
такая я же проблема
К сожалению, библиотека LCD1202 не работает под платой этого типа.
C:\Users\test\OneDrive\Documents\Arduino\libraries\LCD1202\lcd1202.cpp:62:7: error: invalid conversion from 'volatile uint32_t* {aka volatile unsigned int*}' to 'int*' [-fpermissive]
out = portOutputRegister(digitalPinToPort(pin));
но
"Замени в библиотеке используемую функцию dwrite на стандартную digitalWtite" пробовал не зараболо - неразобрался как сделать замену. Можете сделать библиотеку для работы 8826?
в общем не знаток я, но почитав мануал по дисплею 1100http://mylcd.sourceforge.net/files/pcf8814.pdf стр 16 вот к чему пришел:
прочесть что-то из дисплея не реально т.к. не выведена нога SDO. Обычное общение происходит через 4 ноги, для приема нужна 5я, которая SDataOut. Возможно в версиях дисплея с незадействованной ногой это она и есть. У меня она отсутствует. Режим I2C включить не возможно т.к. он включается физически комбинациями подключений ног SD0 и SD1 контроллера, доступа к которым увы нет.
Вывод: Прочесть инфу со встроенного датчика температуры дисплея Nokia1100 простыми способами невозможно.
Ребят выложите кто нибудь вольтметр для 1202 замучился искать.Что не найду не пашет или ошибки лезут.Програмировать не умею так что помогите.Пробники типа v1.5 стают на ура.
Ты сначала просто вольтметр сделай, примеров море, в терминал например будет отправлять напряжение. А вот когда у тебя будет что выводить и прицепишь дисплей
#include <lcd1202.h> LCD1202 lcd(8, 7, 6, 5); // RST, CS, MOSI, SCK int voltage= 1; void setup() { lcd.Inicialize(); //Инициализация дисплея lcd.Clear_LCD(); //Очистка дисплея Serial.begin(9600); } void loop() { // read the input on analog pin 0: int sensorValue = analogRead(A0); // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V): float voltage = sensorValue * (5.0 / 1023.0); // print out the value you read: Serial.println(voltage); int t= voltage*100; Serial.println(t); float n = t; String s = String(n, 2); int i = s.indexOf('.'); if (i >= 0) s.remove(i, 1); bool b = n < 0; if (b) s.remove(0, 1); int n1 = s.substring(0, 1).toInt(); if (b) n1 *= -1; int n2 = s.substring(1, 2).toInt(); int n3 = s.substring(2, 3).toInt(); int n4 = s.substring(3).toInt(); lcd.print(1, 1, 1, "arduino.ru рулит"); lcd.simb16x32(27, 19, 1, n1); //Выводим в координаты x, y, цветом 1, цифру 8, размером 16х32 пикселя lcd.fillRect(48, 49, 3, 3, 1); //Рисуем закрашенный прямоугольник по координатам x, y, высота, ширина, цвет lcd.simb16x32(53, 19, 1, n2); //Выводим в координаты x, y, цветом 1, цифру 8, размером 16х32 пикселя lcd.simb16x32(79, 19, 1, n3); //Выводим в координаты x, y, цветом 1, цифру 8, размером 16х32 пикселя lcd.Update(); delay(1000); lcd.Clear_LCD(); }Ошибка Call of overloaded String(float&,int)is ambiguous. Я канешно не очень в этом но если простой вольтметр то на мониторе пишет.Не знаю как у кого с 8 станицы он работает у меня нет.Помогите раздуплится.
Это кто вас так научил делать? от 23 до 33 строки что за черная магия "огненный шторм" для того чтобы спичку зажечь
тебе нужно деление на 10 "/10" и остаток от деления на 10 "%10"
так например http://arduino.ru/forum/programmirovanie/razdelenie-chisla-na-otdelnye-tsifry#comment-164280
Я только начинаю в этом разбиратся я сам это с этого форума скопировал просто чуть убрал.Почему и просил вольтметр божеский.
ты надеюсь ссылку что я дал увидел?
Может, просто сначала залей библиотечку рабочую эту, и посмотри, как она работает (если дисплэй заработает)? Попробуй поизменять в ней что-нибудь, попробуй разобраться. А уже потом начнешь вольтметр.
Начелось просто попросил дайте пожалуйста вольтметр.Занимаюсь квадриками там и шью контроллеры полетов регуляторы скорости и осд.но никогда не програмировал вот сейчас сижу рзбираюсь.Просто помогите за спасибо!
#include <lcd1202.h> LCD1202 lcd(8, 7, 6, 5); // RST, CS, MOSI, SCK int voltage= 1; void setup() { lcd.Inicialize(); //Инициализация дисплея lcd.Clear_LCD(); //Очистка дисплея Serial.begin(9600); } void loop() { // read the input on analog pin 0: int sensorValue = analogRead(A0); // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V): float voltage = sensorValue * (5.0 / 1023.0); // print out the value you read: Serial.println(voltage); int t= voltage*100; Serial.println(t); lcd.print(1, 1, 1, "arduino.ru рулит"); lcd.simb16x32(27, 19, 1, t/100); //Выводим в координаты x, y, цветом 1, цифру 8, размером 16х32 пикселя lcd.fillRect(48, 49, 3, 3, 1); //Рисуем закрашенный прямоугольник по координатам x, y, высота, ширина, цвет lcd.simb16x32(53, 19, 1, t%100/10); //Выводим в координаты x, y, цветом 1, цифру 8, размером 16х32 пикселя lcd.simb16x32(79, 19, 1, t%10); //Выводим в координаты x, y, цветом 1, цифру 8, размером 16х32 пикселя lcd.Update(); delay(1000); lcd.Clear_LCD(); }что то вроде должно получится
Огромное спасибо работает.Хоть ктото носом ткнул.Щас буду разбиратся.
да не за что. помог только потому что ты попытался сделать
я может не очень понятно написал, так как можно было сначала разбить число t на цифры, а потом их выводить, я сократил запись
Повтыкал и теперь понял не так все сложно уже все работает теперь все на 5 вольтметров сделаю мерять 4х баночный акум.Спасибо.
Там не совсем так будет. Уже поздно, завтра если что пиши подскажу
#include <lcd1202.h> LCD1202 lcd(8, 7, 6, 5); // RST, CS, MOSI, SCK const int Reference = 5000; const int ADCmax = 1023; const boolean zero = 0; void setup() { analogReference(DEFAULT); //DEFAULT - напряжение питания, INTERNAL 1,1В для Atmega 328 или EXTERNAL c напряжением AREF. lcd.Inicialize(); //Инициализация дисплея } void loop() { lcd.Clear_LCD(); lcd.print(1, 1, 1, map(analogRead(A0), zero, ADCmax, zero, Reference)); // растягиваем ацп шкалу 0..1023 до 0..5000 lcd.print(1, 12, 1, map(analogRead(A1), zero, ADCmax, zero, Reference)); lcd.print(1, 24, 1, map(analogRead(A2), zero, ADCmax, zero, Reference)); lcd.print(1, 36, 1, map(analogRead(A3), zero, ADCmax, zero, Reference)); lcd.print(1, 48, 1, map(analogRead(A4), zero, ADCmax, zero, Reference)); lcd.Update(); delay(400); }Повтыкал и теперь понял не так все сложно уже все работает теперь все на 5 вольтметров сделаю мерять 4х баночный акум.Спасибо.
Если правильно понял 4S батарея, но там немного сложнее будет, делители нужны, просто подключить без делителей не получится, сожгешь аналоговые входы
Да все верно делитель сразу был ато там дури.Сейчас пытался второе число добавить но только ероглифы.Есть заводской 7мисигм но он летает постоянно и там показывает напряжение поочередно.А хотелось отдельно 16в общ и 3.78в 3.9в 3.22в 3.7в отдельно каждая банка причем сразу на одном экране.Кстати если сделать потонше можно в повербанк всунуть причем вроди и без подсветки видно акумов хватает.
Предыдущее мое сообщение для кого?
Видел спасибо.Еслиб с точкой вообще былобы круто.Дописал по банкам и все уже пашет.
очень нужно знать, что это за команду можно подать на поворот вывода информации на дисплей?
поделитесь плиз
Понравилась библиотека,часто ей пользуюсь но недавно столкнулся с тем что уж очень она прожорливая в плане RAM.
Но выход был найден и пользователь нашего форума sadman41 любезно согласился подправить билиотеку .
Пример использования RAM оригинальной библиотекой
#include "lcd1202.h" LCD1202 lcd(8, 7, 6, 5); // RST, CS, MOSI, SCK void setup() { lcd.Inicialize(); //Инициализация дисплея lcd.Clear_LCD(); //Очистка дисплея } void loop() { lcd.print(1, 1, 1, " Привет! "); lcd.print(1, 10, 1, " Пример работы "); lcd.print(1, 20, 1, "с драйвером v1.5"); lcd.print(1, 30, 1, " дисплея "); lcd.print(1, 40, 1, " Nokia 1202 "); lcd.print(1, 50, 1, " с контроллером "); lcd.print(1, 60, 1, " STE2007 "); lcd.Update(); delay(10000); lcd.Clear_LCD(); lcd.print(1, 1, 1, "Вопросы на форум"); lcd.print(1, 10, 1, "arduino.ru/forum"); lcd.print(1, 20, 1, " Автор шрифтов "); lcd.print(1, 30, 1, " и всех функций "); lcd.print(1, 40, 1, " Jeka_tm "); lcd.print(1, 50, 1, "Драйвер и пример"); lcd.print(1, 60, 1, " создал Gres "); lcd.Update(); delay(10000); lcd.Clear_LCD(); }#include "lcd1202.h" LCD1202 lcd(8, 7, 6, 5); // RST, CS, MOSI, SCK void setup() { lcd.Inicialize(); //Инициализация дисплея lcd.Clear_LCD(); //Очистка дисплея } void loop() { lcd.print(1, 1, 1, F( " Привет! ")); lcd.print(1, 10, 1,F( " Пример работы ")); lcd.print(1, 20, 1,F( "с драйвером v1.5")); lcd.print(1, 30, 1,F( " дисплея ")); lcd.print(1, 40, 1, F(" Nokia 1202 ")); lcd.print(1, 50, 1, F(" с контроллером ")); lcd.print(1, 60, 1, F(" STE2007 ")); lcd.Update(); delay(10000); lcd.Clear_LCD(); lcd.print(1, 1, 1, F( "Вопросы на форум")); lcd.print(1, 10, 1,F( "arduino.ru/forum")); lcd.print(1, 20, 1, F(" Автор шрифтов ")); lcd.print(1, 30, 1,F( " и всех функций ")); lcd.print(1, 40, 1,F( " Jeka_tm ")); lcd.print(1, 50, 1,F( "Драйвер и пример")); lcd.print(1, 60, 1,F( " создал Gres ")); lcd.Update(); delay(10000); lcd.Clear_LCD(); }Тут правленые .cpp и .h .
Не хочу показаться пессимистом, но как урезали потребление оперативной памяти? Почти все занимает буфер.
Кажется B707 делал менее прожорливую по оперативной памяти в 3 раза, но и процессорное время увеличилось в 3 раза (все что выводится на дисплей 3 раза просчитывалось). Тут похоже иной подход. И на первый взгляд просто текст меню хранить во флеше.
Так и сделано . Просто оригинальная либа не могла это сделать правильно используя функцию F(). Подробнее может рассказать автор изменений.
Хорошо. Спасибо. Сохранил себе.
Просто внесу ясность: прожорливость библиотеки не снизилась.
Накладные расходы увеличивались по причине ее неумения читать строки напрямую из Progmem Space. Что приводило к ситуации, в которой неизменные, по своей сути, названия пунктов меню перегружались в RAM и постоянно там болтались. Я просто добавил функцию, которая "понимает", что на вход ей передаётся ссылка на расположенную в Progmem строку и корректно работает с этим типом памяти. За счёт чего и снижается расход RAM скетчем, использующим данную библиотеку.
Делал один проект на OLED SSD1306, и на этапе окончательной сборки треснул дисплей. Нежный. Через пиксель строки не выводятся
Второго не было, поэтому снова использовал 1202. Но показалось как то неудобно каждый раз писать "цвет" выводимого чего-то, поэтому решил убрать, а "цвет" задавать отдельной функцией. Добавил вывод чисел с плавающей запятой (писал выше как то) и использовал хранение текста во флеше о чем писал mobistrike. И убрал из инициализации вывод ресет дисплея (я его цепляю к 3.3В). Кому надо вернут быстро, просто скопировать из предыдущих либ.
Теперь вывод выглядит так:
#include "lcd1202.h" LCD1202 lcd(7, 8, 9); // CS, MOSI, SCK void setup() { lcd.Inicialize(); //Инициализация дисплея lcd.Clear_LCD(); //Очистка дисплея } void loop() { lcd.print(1, 1, 1.115, 2); lcd.print(1, 10, F( " Пример работы ")); lcd.print(1, 20, F( "с драйвером v1.5")); lcd.print(1, 30, F( " дисплея ")); lcd.print(1, 40, F(" Nokia 1202 ")); lcd.print(1, 50, F(" с контроллером ")); lcd.print(1, 60, F(" STE2007 ")); lcd.Update(); delay(10000); lcd.setColor(0); lcd.Clear_LCD(); lcd.print(1, 1, F( "Вопросы на форум")); lcd.print(1, 10, F( "arduino.ru/forum")); lcd.print(1, 20, F(" Автор шрифтов ")); lcd.print(1, 30, F( " и всех функций ")); lcd.print(1, 40, F( " Jeka_tm ")); lcd.print(1, 50, F( "Драйвер и пример")); lcd.print(1, 60, F( " создал Gres ")); lcd.Update(); delay(10000); lcd.setColor(1); lcd.Clear_LCD(); }ссылка на библиотеку
Пример я поленился исправлять...
Кстати у кого будет выводится только текст на английском, например при компиляции в версии 1.8.5, это нормально. Все дело в кодировках, нет нет да и выведется русский (при очередной компиляции). Кодировка по умолчанию UTF, но иногда почему то 1251. Тут насколько знаю ничего не поделать, просто использовать другую версию IDE.
С 1202 тоже неплохо смотрится, но вот наспех сделанная панель на замену
Может кто помнит как правильно собирать строку из текста и переменных и вывод на дисплей. Что то вроде
lcd.print(1, 1, String("data " + i));но в либе char
void LCD1202::print(byte x, byte y, char *str){ unsigned char type = *str; if(type>=128) x=x-3; while(*str){ drawChar(x, y, *str++); unsigned char type = *str; (type>=128)? x=x+3 : x=x+6; } }помню кому то давал как правильно, но сам забыл, и найти не могу
Nokia2.h
МОЖНО БИБЛИОТЕКУ
Обычно я вешаю Rst на RC-цепочку и управляю этим экранчиком 2-мя ногами, на мелких батарейных устройствах - достаточно. Но случилось управлять шлифовальным станком и из-помех пришлось-таки подключить Rst к контроллеру.
Товарищ Larry Bank в своей библиотеке ( https://github.com/bitbank2/bb_hx1230 ) делает в init c Rst такие магические пассы :
а как делаете вы?
delete
А можно схемку с rc цепочкой? Вроде же 4 ноги нужно.
Удалось кому подружить библиотеку с esp32? Ругается на lcd1202.cpp:48:7
Не может конвертировать типы данных.
out = portOutputRegister(digitalPinToPort(pin));
Рад представить функцию отображения графика в реальном времени. Скорее всего велосипед но работает.
Писалось под цветной дисплей, но очень легко портировалась под монохромный.
Каждый раз вызывая функцию передаем ей новое значение. Весь график сдвигается на один пиксель влево и прорисовывает новый пиксель справа с новым значением.
График автоматически масштабируется, запоминает все предыдущие полученные значения, выбирает из них максимальное и минимальное и строится в соответствующем масштабе.
При вызове функции указываются координаты вывода а также высота и длинна графика в пикселях.
Дисплей подключен и инициализирован, библиотека установлена.
в основном цикле вызываю функцию графика:
void loop() { for (float i = 0; i<=100; i+=0.2){ Graph(3,5, 90,45, sin(i)*100);//x,y,длинна, высота, переменная целая в диапазоне int } }В отдельной вкладке всавляю саму функцию void Graph(byte x,byte y, byte h,byte w, int val){//позиция x,y, высота h, длинна w в пикселях, принимаемое значение init i static int Y_position [96];//тут максимальное количество точек по горизонтали. Условие 96>=w static int minVAL; static int maxVAL; static int lastP; if (lastP!=val){ //Если значение изменилось то выполняем код до конца страницы lastP!=val заменить единицей 1 если нужно фиксировать одинаковые значения подряд lastP=val; //Очистка прежней линии for (byte i = 1; i < w; i++){ int Ydata = Y_position [i] - minVAL; int Ydata_next = Y_position [i+1] - minVAL; lcd.drawLine(x+i,y+map(Ydata, 0, maxVAL-minVAL,h, 0),x+i+1,y+map(Ydata_next, 0, maxVAL-minVAL,h, 0),0); } //Сдвигаем масив влево for (byte i = 1; i < w; i++){ Y_position [i]= Y_position [i+1]; } Y_position [w]= val; //Записываем новый элемент массива в последнюю ячейку //вычисляем масштаб граффика minVAL=32767; maxVAL=-32768; for (byte i = 1; i < w+1; i++){ minVAL=min(minVAL , Y_position [i]); maxVAL=max(maxVAL , Y_position [i]); } if (maxVAL-minVAL<15)maxVAL=minVAL+15; if (minVAL>15) minVAL-=15; //масштабируем и рисуем граффик for (byte i = 1; i < w; i++){ int Ydata = Y_position [i] - minVAL; int Ydata_next = Y_position [i+1] - minVAL; lcd.drawLine(x+i,y+map(Ydata, 0, maxVAL-minVAL,h, 0),x+i+1,y+map(Ydata_next, 0, maxVAL-minVAL,h, 0),1); } } lcd.Update(); }Может кто помнит как правильно собирать строку из текста и переменных и вывод на дисплей. Что то вроде
lcd.print(1, 1, String("data " + i));...
void setup() { Serial.begin( 9600 ); // устанавливаем последовательное соединение char buf[40]; sprintf(buf, "Time %.2d:%.2d:%.2d Date %.2d %s. %d ", 1, 32, 45, 3, "jul", 2020);//цифры можно заменить переменными Serial.println(buf); Serial.println("Hi "+String(2048)+" by"); } void loop() { }В терминале: Time 01:32:45 Date 03 jul. 2020 и Hi 2048 by
Пример выдран отсюда https://github.com/JChristensen/DS3232RTC/blob/master/examples/rtcTimeTemp/rtcTimeTemp.ino
c float не работает. Нужно в два захода флоат выводить целую и дробную часть остатком от деления %10 или воспользоваться преобразованием float http://geekmatic.in.ua/arduino_otobrazhenie_dannyih_float
https://www.php.net/manual/ru/function.sprintf.php тут почитай про sprintf
Постом выше на анимации нижняя строка даты так собрана. А как вы хотели .print("Привет"+String(int)+"пока")
jeka, как добавить мелкий шрифт 3х5 в библиотеку? Куда копать, что почитать?
Набросал как должен выглядеть шрифт и самые распространенные символы, но что с ними делать, как конвертировать в массив и куда прописать незнаю.
Вот от другого дисплея нашел шрифт 4х6. Как его прикрутить?
#include <inttypes.h> #if defined(__AVR__) # include <avr/pgmspace.h> #endif #include "fonts.h" #ifdef FONT_4X6 #if defined(__AVR__) const PROGMEM uint8_t font_PGM[] = #else const uint8_t font_PGM[] = #endif { 0x00,0x00,0x00,0x00,0x00,0x00, // 0x20 0x02,0x02,0x02,0x00,0x02,0x00, // 0x21 0x05,0x05,0x00,0x00,0x00,0x00, // 0x22 0x05,0x07,0x05,0x07,0x05,0x00, // 0x23 0x02,0x03,0x06,0x03,0x06,0x02, // 0x24 0x04,0x01,0x02,0x04,0x01,0x00, // 0x25 0x02,0x05,0x03,0x05,0x07,0x00, // 0x26 0x06,0x04,0x00,0x00,0x00,0x00, // 0x27 0x02,0x04,0x04,0x04,0x02,0x00, // 0x28 0x04,0x02,0x02,0x02,0x04,0x00, // 0x29 0x05,0x02,0x07,0x02,0x05,0x00, // 0x2A 0x00,0x02,0x07,0x02,0x00,0x00, // 0x2B 0x00,0x00,0x00,0x00,0x06,0x04, // 0x2C 0x00,0x00,0x07,0x00,0x00,0x00, // 0x2D 0x00,0x00,0x00,0x00,0x02,0x00, // 0x2E 0x01,0x01,0x02,0x04,0x04,0x00, // 0x2F 0x03,0x05,0x05,0x05,0x06,0x00, // 0x30 0x02,0x06,0x02,0x02,0x07,0x00, // 0x31 0x06,0x01,0x02,0x04,0x07,0x00, // 0x32 0x06,0x01,0x02,0x01,0x06,0x00, // 0x33 0x01,0x05,0x07,0x01,0x01,0x00, // 0x34 0x07,0x04,0x06,0x01,0x06,0x00, // 0x35 0x02,0x04,0x06,0x05,0x02,0x00, // 0x36 0x07,0x01,0x03,0x02,0x02,0x00, // 0x37 0x02,0x05,0x02,0x05,0x02,0x00, // 0x38 0x02,0x05,0x03,0x01,0x02,0x00, // 0x39 0x00,0x00,0x02,0x00,0x02,0x00, // 0x3A 0x00,0x00,0x02,0x00,0x06,0x04, // 0x3B 0x01,0x02,0x04,0x02,0x01,0x00, // 0x3C 0x00,0x00,0x07,0x00,0x07,0x00, // 0x3D 0x04,0x02,0x01,0x02,0x04,0x00, // 0x3E 0x06,0x01,0x02,0x00,0x02,0x00, // 0x3F 0x07,0x05,0x05,0x04,0x07,0x00, // 0x40 0x02,0x05,0x07,0x05,0x05,0x00, // 0x41 0x06,0x05,0x06,0x05,0x06,0x00, // 0x42 0x03,0x04,0x04,0x04,0x03,0x00, // 0x43 0x06,0x05,0x05,0x05,0x06,0x00, // 0x44 0x07,0x04,0x06,0x04,0x07,0x00, // 0x45 0x07,0x04,0x06,0x04,0x04,0x00, // 0x46 0x03,0x04,0x05,0x05,0x03,0x00, // 0x47 0x05,0x05,0x07,0x05,0x05,0x00, // 0x48 0x07,0x02,0x02,0x02,0x07,0x00, // 0x49 0x01,0x01,0x01,0x05,0x02,0x00, // 0x4A 0x05,0x05,0x06,0x05,0x05,0x00, // 0x4B 0x04,0x04,0x04,0x04,0x07,0x00, // 0x4C 0x05,0x07,0x07,0x05,0x05,0x00, // 0x4D 0x05,0x07,0x05,0x05,0x05,0x00, // 0x4E 0x02,0x05,0x05,0x05,0x02,0x00, // 0x4F 0x06,0x05,0x06,0x04,0x04,0x00, // 0x50 0x02,0x05,0x05,0x07,0x03,0x00, // 0x51 0x06,0x05,0x06,0x05,0x05,0x00, // 0x52 0x03,0x04,0x07,0x01,0x06,0x00, // 0x53 0x07,0x02,0x02,0x02,0x02,0x00, // 0x54 0x05,0x05,0x05,0x05,0x07,0x00, // 0x55 0x05,0x05,0x05,0x05,0x02,0x00, // 0x56 0x05,0x05,0x07,0x07,0x05,0x00, // 0x57 0x05,0x05,0x02,0x05,0x05,0x00, // 0x58 0x05,0x05,0x02,0x02,0x02,0x00, // 0x59 0x07,0x01,0x02,0x04,0x07,0x00, // 0x5A 0x06,0x04,0x04,0x04,0x06,0x00, // 0x5B 0x04,0x04,0x02,0x01,0x01,0x00, // 0x5C 0x06,0x02,0x02,0x02,0x06,0x00, // 0x5D 0x02,0x05,0x00,0x00,0x00,0x00, // 0x5E 0x00,0x00,0x00,0x00,0x00,0x0F, // 0x5F 0x06,0x02,0x00,0x00,0x00,0x00, // 0x60 0x00,0x00,0x03,0x05,0x07,0x00, // 0x61 0x04,0x04,0x06,0x05,0x06,0x00, // 0x62 0x00,0x00,0x03,0x04,0x03,0x00, // 0x63 0x01,0x01,0x03,0x05,0x03,0x00, // 0x64 0x00,0x00,0x07,0x06,0x03,0x00, // 0x65 0x01,0x02,0x07,0x02,0x02,0x00, // 0x66 0x00,0x00,0x07,0x05,0x01,0x07, // 0x67 0x04,0x04,0x06,0x05,0x05,0x00, // 0x68 0x02,0x00,0x02,0x02,0x02,0x00, // 0x69 0x02,0x00,0x02,0x02,0x02,0x06, // 0x6A 0x04,0x04,0x05,0x06,0x05,0x00, // 0x6B 0x02,0x02,0x02,0x02,0x02,0x00, // 0x6C 0x00,0x00,0x07,0x07,0x05,0x00, // 0x6D 0x00,0x00,0x06,0x05,0x05,0x00, // 0x6E 0x00,0x00,0x02,0x05,0x02,0x00, // 0x6F 0x00,0x00,0x06,0x05,0x06,0x04, // 0x70 0x00,0x00,0x03,0x05,0x03,0x01, // 0x71 0x00,0x00,0x06,0x04,0x04,0x00, // 0x72 0x00,0x00,0x03,0x02,0x06,0x00, // 0x73 0x00,0x02,0x07,0x02,0x03,0x00, // 0x74 0x00,0x00,0x05,0x05,0x07,0x00, // 0x75 0x00,0x00,0x05,0x05,0x02,0x00, // 0x76 0x00,0x00,0x05,0x07,0x07,0x00, // 0x77 0x00,0x00,0x05,0x02,0x05,0x00, // 0x78 0x00,0x00,0x05,0x05,0x02,0x04, // 0x79 0x00,0x00,0x06,0x02,0x03,0x00, // 0x7A 0x03,0x02,0x06,0x02,0x03,0x00, // 0x7B 0x02,0x02,0x02,0x02,0x02,0x00, // 0x7C 0x06,0x02,0x03,0x02,0x06,0x00, // 0x7D 0x05,0x0A,0x00,0x00,0x00,0x00, // 0x7E 0x00,0x02,0x05,0x07,0x00,0x00, // 0x7F #ifndef FONT_END7F 0x03,0x04,0x04,0x07,0x02,0x04, // 0x80 0x05,0x00,0x05,0x05,0x03,0x00, // 0x81 0x01,0x02,0x07,0x06,0x03,0x00, // 0x82 0x02,0x05,0x03,0x05,0x07,0x00, // 0x83 0x05,0x00,0x03,0x05,0x07,0x00, // 0x84 0x04,0x02,0x03,0x05,0x07,0x00, // 0x85 0x02,0x00,0x03,0x05,0x07,0x00, // 0x86 0x00,0x07,0x04,0x07,0x02,0x06, // 0x87 0x02,0x05,0x07,0x06,0x03,0x00, // 0x88 0x05,0x00,0x07,0x06,0x03,0x00, // 0x89 0x04,0x02,0x07,0x06,0x03,0x00, // 0x8A 0x05,0x00,0x02,0x02,0x02,0x00, // 0x8B 0x02,0x05,0x00,0x02,0x02,0x00, // 0x8C 0x04,0x02,0x00,0x02,0x02,0x00, // 0x8D 0x05,0x02,0x05,0x07,0x05,0x00, // 0x8E 0x02,0x02,0x05,0x07,0x05,0x00, // 0x8F 0x01,0x02,0x07,0x06,0x07,0x00, // 0x90 0x00,0x00,0x03,0x07,0x06,0x00, // 0x91 0x03,0x06,0x07,0x06,0x07,0x00, // 0x92 0x02,0x05,0x02,0x05,0x02,0x00, // 0x93 0x05,0x00,0x02,0x05,0x02,0x00, // 0x94 0x04,0x02,0x02,0x05,0x02,0x00, // 0x95 0x02,0x05,0x00,0x05,0x07,0x00, // 0x96 0x04,0x02,0x05,0x05,0x07,0x00, // 0x97 0x05,0x00,0x05,0x05,0x02,0x04, // 0x98 0x05,0x02,0x05,0x05,0x02,0x00, // 0x99 0x05,0x00,0x05,0x05,0x07,0x00, // 0x9A 0x02,0x07,0x04,0x07,0x02,0x00, // 0x9B 0x01,0x02,0x07,0x02,0x07,0x00, // 0x9C 0x05,0x07,0x02,0x07,0x02,0x00, // 0x9D 0x00,0x06,0x06,0x05,0x05,0x00, // 0x9E 0x03,0x02,0x03,0x02,0x06,0x00, // 0x9F 0x01,0x02,0x03,0x05,0x07,0x00, // 0xA0 0x01,0x02,0x00,0x02,0x02,0x00, // 0xA1 0x01,0x02,0x07,0x05,0x07,0x00, // 0xA2 0x01,0x02,0x00,0x05,0x07,0x00, // 0xA3 0x07,0x00,0x07,0x05,0x05,0x00, // 0xA4 0x07,0x00,0x05,0x07,0x05,0x00, // 0xA5 0x03,0x05,0x07,0x00,0x07,0x00, // 0xA6 0x02,0x05,0x02,0x00,0x07,0x00, // 0xA7 0x02,0x00,0x02,0x04,0x03,0x00, // 0xA8 0x00,0x07,0x04,0x04,0x00,0x00, // 0xA9 0x00,0x0E,0x02,0x02,0x00,0x00, // 0xAA 0x04,0x05,0x02,0x05,0x03,0x00, // 0xAB 0x04,0x05,0x02,0x07,0x01,0x00, // 0xAC 0x02,0x00,0x02,0x02,0x02,0x00, // 0xAD 0x00,0x05,0x0A,0x05,0x00,0x00, // 0xAE 0x00,0x0A,0x05,0x0A,0x00,0x00, // 0xAF 0x04,0x01,0x04,0x01,0x04,0x01, // 0xB0 0x05,0x0A,0x05,0x0A,0x05,0x0A, // 0xB1 0x0B,0x0E,0x0B,0x0E,0x0B,0x0E, // 0xB2 0x02,0x02,0x02,0x02,0x02,0x02, // 0xB3 0x02,0x02,0x0E,0x02,0x02,0x02, // 0xB4 0x02,0x0E,0x02,0x0E,0x02,0x02, // 0xB5 0x05,0x05,0x0D,0x05,0x05,0x05, // 0xB6 0x00,0x00,0x0F,0x05,0x05,0x05, // 0xB7 0x00,0x0E,0x02,0x0E,0x02,0x02, // 0xB8 0x05,0x0D,0x01,0x0D,0x05,0x05, // 0xB9 0x05,0x05,0x05,0x05,0x05,0x05, // 0xBA 0x00,0x0F,0x01,0x0D,0x05,0x05, // 0xBB 0x05,0x0D,0x01,0x0F,0x00,0x00, // 0xBC 0x05,0x05,0x0F,0x00,0x00,0x00, // 0xBD 0x02,0x0E,0x02,0x0E,0x00,0x00, // 0xBE 0x00,0x00,0x0E,0x02,0x02,0x02, // 0xBF 0x02,0x02,0x03,0x00,0x00,0x00, // 0xC0 0x02,0x02,0x0F,0x00,0x00,0x00, // 0xC1 0x00,0x00,0x0F,0x02,0x02,0x02, // 0xC2 0x02,0x02,0x03,0x02,0x02,0x02, // 0xC3 0x00,0x00,0x0F,0x00,0x00,0x00, // 0xC4 0x02,0x02,0x0F,0x02,0x02,0x02, // 0xC5 0x02,0x03,0x02,0x03,0x02,0x02, // 0xC6 0x05,0x05,0x05,0x05,0x05,0x05, // 0xC7 0x05,0x05,0x04,0x07,0x00,0x00, // 0xC8 0x00,0x07,0x04,0x05,0x05,0x05, // 0xC9 0x05,0x0D,0x00,0x0F,0x00,0x00, // 0xCA 0x00,0x0F,0x00,0x0D,0x05,0x05, // 0xCB 0x05,0x05,0x04,0x05,0x05,0x05, // 0xCC 0x00,0x0F,0x00,0x0F,0x00,0x00, // 0xCD 0x05,0x0D,0x00,0x0D,0x05,0x05, // 0xCE 0x02,0x0F,0x00,0x0F,0x00,0x00, // 0xCF 0x05,0x05,0x0F,0x00,0x00,0x00, // 0xD0 0x00,0x0F,0x00,0x0F,0x02,0x02, // 0xD1 0x00,0x00,0x0F,0x05,0x05,0x05, // 0xD2 0x05,0x05,0x07,0x00,0x00,0x00, // 0xD3 0x02,0x03,0x02,0x03,0x00,0x00, // 0xD4 0x00,0x03,0x02,0x03,0x02,0x02, // 0xD5 0x00,0x00,0x07,0x05,0x05,0x05, // 0xD6 0x05,0x05,0x0D,0x05,0x05,0x05, // 0xD7 0x02,0x0F,0x00,0x0F,0x02,0x02, // 0xD8 0x02,0x02,0x0E,0x00,0x00,0x00, // 0xD9 0x00,0x00,0x03,0x02,0x02,0x02, // 0xDA 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, // 0xDB 0x00,0x00,0x00,0x0F,0x0F,0x0F, // 0xDC 0x0C,0x0C,0x0C,0x0C,0x0C,0x0C, // 0xDD 0x03,0x03,0x03,0x03,0x03,0x03, // 0xDE 0x0F,0x0F,0x0F,0x00,0x00,0x00, // 0xDF 0x00,0x00,0x07,0x06,0x07,0x00, // 0xE0 0x02,0x05,0x06,0x05,0x06,0x04, // 0xE1 0x07,0x05,0x04,0x04,0x04,0x00, // 0xE2 0x07,0x05,0x05,0x05,0x05,0x00, // 0xE3 0x07,0x04,0x02,0x04,0x07,0x00, // 0xE4 0x00,0x00,0x03,0x05,0x02,0x00, // 0xE5 0x00,0x00,0x05,0x05,0x07,0x04, // 0xE6 0x00,0x01,0x06,0x02,0x02,0x00, // 0xE7 0x07,0x02,0x05,0x02,0x07,0x00, // 0xE8 0x02,0x05,0x07,0x05,0x02,0x00, // 0xE9 0x00,0x02,0x05,0x05,0x05,0x00, // 0xEA 0x03,0x04,0x02,0x05,0x02,0x00, // 0xEB 0x00,0x00,0x07,0x05,0x07,0x00, // 0xEC 0x02,0x07,0x05,0x07,0x02,0x00, // 0xED 0x03,0x04,0x07,0x04,0x03,0x00, // 0xEE 0x02,0x05,0x05,0x05,0x05,0x00, // 0xEF 0x07,0x00,0x07,0x00,0x07,0x00, // 0xF0 0x02,0x07,0x02,0x00,0x07,0x00, // 0xF1 0x06,0x01,0x06,0x00,0x07,0x00, // 0xF2 0x03,0x04,0x03,0x00,0x07,0x00, // 0xF3 0x00,0x01,0x02,0x02,0x02,0x02, // 0xF4 0x02,0x02,0x02,0x02,0x04,0x00, // 0xF5 0x02,0x00,0x07,0x00,0x02,0x00, // 0xF6 0x00,0x05,0x0A,0x05,0x0A,0x00, // 0xF7 0x02,0x05,0x02,0x00,0x00,0x00, // 0xF8 0x00,0x02,0x07,0x02,0x00,0x00, // 0xF9 0x00,0x00,0x02,0x00,0x00,0x00, // 0xFA 0x03,0x02,0x02,0x06,0x02,0x00, // 0xFB 0x07,0x05,0x05,0x00,0x00,0x00, // 0xFC 0x06,0x02,0x04,0x06,0x00,0x00, // 0xFD 0x00,0x00,0x06,0x06,0x00,0x00, // 0xFE 0x00,0x00,0x00,0x00,0x00,0x00 // 0xFF #endif }; #endifКак понимаю необходимо создать что-то такое:
#include "font5x3.h" void LCD1202::print5x3(byte x, byte y, boolean color, char *str){ unsigned char type = *str; if(type>=128) x=x-3;// ЧТО ОЗНАЧАЕТ 3 while(*str){ drawChar(x, y, color, *str++); unsigned char type = *str; (type>=128)? x=x+3 : x=x+6;// ЧТО ТАКОЕ 3 и 6? } } void LCD1202::drawChar5x3(byte x, byte y, boolean color, unsigned char c) { if((x >= LCD_X) ||(y >= LCD_Y) || ((x + 3) < 0) || ((y + 5) < 0))// Это если символ слишком большой или вылазит за пределы дисплея? return; if(c<128) c = c-32;// НЕПОНЯТНЫ ЭТИ ИФЫ if(c>=144 && c<=175) c = c-48; if(c>=128 && c<=143) c = c+16; if(c>=176 && c<=191) c = c-48; if(c>191) return; for (byte i=0; i<4; i++ ) { // 4 это число байт в массиве на символ? byte line; (i == 3)? line = 0x0 : line = pgm(font5x3+(c*5)+i); for (byte j = 0; j<6; j++) { (line & 0x1)? drawPixel(x+i, y+j, color) : drawPixel(x+i, y+j, !color); line >>= 1; } } } Не пойму что тут менять. В итоге в IDE просто будет вызов функции lcd.print5x3("String");Нарыл из другой библиотеки возможность увеличивать стандартный шрифт в целое число раз. Не уверен что полезная функция но прикрутить можно.
void GraphicsLib::setTextSize(uint_least8_t size) { text_size = size; return; } void GraphicsLib::setTextWrap(uint_least8_t wrap) { text_wrap = (wrap!=0)?1:0; return; } #if ARDUINO >= 100 size_t GraphicsLib::write(uint8_t c) #else void GraphicsLib::write(uint8_t c) #endif { if(c == '\n') { text_x = start_x; text_y += (text_size&0x7F)*FONT_HEIGHT; } else if((c != '\r') && (c != '\t'))//skip { if((c != ' ') || (text_x != 0)) { text_x = drawChar(text_x, text_y, c, text_fg, text_bg, text_size); if(text_wrap && (text_x > (lcd_width-((text_size&0x7F)*FONT_WIDTH)))) { text_x = start_x; text_y += (text_size&0x7F)*FONT_HEIGHT; if(text_y > (lcd_height-((text_size&0x7F)*FONT_HEIGHT))) { text_y = 0; } } } } #if ARDUINO >= 100 return 1; #else return; #endif }// ответы пишу по памяти #include "font5x3.h" void LCD1202::print5x3(byte x, byte y, boolean color, char *str){ unsigned char type = *str; if(type>=128) x=x-3;// ЧТО ОЗНАЧАЕТ 3 // это сдвиг нужен для русских шрифтов, связано с ASCII кодов русских символов while(*str){ drawChar(x, y, color, *str++); unsigned char type = *str; (type>=128)? x=x+3 : x=x+6;// ЧТО ТАКОЕ 3 и 6? // тоже связано с русскими символами. шрифт 5х8, поэтому сдвиг на 6, чтобы сделать пробел между буквами. } } void LCD1202::drawChar5x3(byte x, byte y, boolean color, unsigned char c) { if((x >= LCD_X) ||(y >= LCD_Y) || ((x + 3) < 0) || ((y + 5) < 0))// Это если символ слишком большой или вылазит за пределы дисплея? // да return; if(c<128) c = c-32;// НЕПОНЯТНЫ ЭТИ ИФЫ // эти цифры нужны для подгонки, таблица ascii содержит больше символов, чем в библиотеке. фактически проспуски, а в библиотеке они идут по порядку if(c>=144 && c<=175) c = c-48; if(c>=128 && c<=143) c = c+16; if(c>=176 && c<=191) c = c-48; if(c>191) return; for (byte i=0; i<4; i++ ) { // 4 это число байт в массиве на символ? // да byte line; (i == 3)? line = 0x0 : line = pgm(font5x3+(c*5)+i); for (byte j = 0; j<6; j++) { (line & 0x1)? drawPixel(x+i, y+j, color) : drawPixel(x+i, y+j, !color); line >>= 1; } } } Не пойму что тут менять. В итоге в IDE просто будет вызов функции lcd.print5x3("String"); // так в явном виде не может быть. или нужно сначала координаты задать где выводить отдельной функцией, или в функцию вывода добавить указание координатСпасибо. Пока что добавил отображение мелких чисел
в файл шрифта добавил static const char mass3x5[10][3] PROGMEM ={ {0x1f, 0x11, 0x1f,}, // 0 {0x12, 0x1f, 0x10,}, // 1 {0x1d, 0x15, 0x17,}, // 2 {0x15, 0x15, 0x1f,}, // 3 {0x07, 0x04, 0x1f,}, // 4 {0x17, 0x15, 0x1d,}, // 5 {0x1f, 0x15, 0x1d,}, // 6 {0x19, 0x05, 0x03,}, // 7 {0x1f, 0x15, 0x1f,}, // 8 {0x17, 0x15, 0x1f} // 9 }; в библиотеке.cpp в конце //=========================Вывод символа 3х5 пикселя в координаты XY void LCD1202::simb3x5(byte x, byte y, boolean color, byte c){ for (byte k=0;k<1;k++){ for (byte i=0;i<3;i++){ byte line = pgm(&(mass3x5[c][i+k*3])); for (byte j = 0; j<8; j++) { (line & 0x01)? drawPixel(x+i, y+j+k*8, color) : drawPixel(x+i, y+j+k*8, !color); line >>= 1; } } } } в библиотеке.h дописал клас void simb3x5(byte x, byte y, boolean color, byte c);Вызывается lcd.simb3x5(4, 0, 1, 1);
Ну вот разобрался)
https://yadi.sk/d/VqFvAadmjdNPvQ
Библиотека, собрана на основе последней библиотеки jeka_tm
Добавлен мелкий шрифт 5х3 (цыфры, заглавные английские буквы, символы) вывод строк, переменных со знаком, float
Заменен вывод simb10x16 добавлены символы :.- Теперь выводятся так:
Отредактирован пример
В скетче добавлена возможность отдельно задействовать ногу RST не ломая библиотеку
Глюк мелкий обнаружил в 162 строке библиотеки нужно исправить "(for (byte j = 0; j<8; j++) " 8 на 5 это количество пикселей по вертикали иначе шрифт подтирает под собой три пикселя. Перезаливать лень.
Что вы мучаетесь, заливайте на гитхаб одной командой : git push origin master
Там и изменения комментировать удобнее и не надо голову ломать что означает словосочетание "отдельно задействовать ногу RST" - сразу в коде видно.
Я хотел бы перенести свой проект из Arduino Nano в ESP8266.
К сожалению, библиотека LCD1202 не работает под платой этого типа.
C:\Users\test\OneDrive\Documents\Arduino\libraries\LCD1202\lcd1202.cpp:62:7: error: invalid conversion from 'volatile uint32_t* {aka volatile unsigned int*}' to 'int*' [-fpermissive]
out = portOutputRegister(digitalPinToPort(pin));
Есть некоторый способ улучшить код, чтобы он работал на ESP8266.
Я не могу найти ничего интересного для управления дисплеем HX1230.
Это не улучшить, а адаптировать. Замени в библиотеке используемую функцию dwrite на стандартную digitalWtite
Саму функцию dwrite можно и удалить
Спасибо за ответ, сработало
добрый день!
Я хотел бы перенести свой проект из Arduino Nano в ESP8266.
такая я же проблема
К сожалению, библиотека LCD1202 не работает под платой этого типа.
C:\Users\test\OneDrive\Documents\Arduino\libraries\LCD1202\lcd1202.cpp:62:7: error: invalid conversion from 'volatile uint32_t* {aka volatile unsigned int*}' to 'int*' [-fpermissive]
out = portOutputRegister(digitalPinToPort(pin));
но
"Замени в библиотеке используемую функцию dwrite на стандартную digitalWtite" пробовал не зараболо - неразобрался как сделать замену. Можете сделать библиотеку для работы 8826?
все равно не выходит, идеи кончились