Nokia 5110 LCD 1.44" + arduino

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Доброго времени суток, Господа Форумчане!

Недавно приобрел на ебее вот такой экранчик: http://www.ebay.com/itm/141196897388?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

немного по-гуглил, и не нашел как его можно подключить к ардуино. Может кто сталкивался, можно ли его "скрестить" с ардуинкой? В наличии есть мега, нано, и микро-про.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

на форуме есть же поиск, да и в гугле немало статей. совсем обленились

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

jeka_tm пишет:

на форуме есть же поиск, да и в гугле немало статей. совсем обленились

И...?

воспользовался поиском... Везде используют монохромный экран от нокиа 5110.

Я же выложил ссылку на мой экран. У меня экран цветной! И хоть там и написано "Nokia 5110", к нему он отношения не имеет, по крайней мере я не встречал телефон с таким экраном.... 

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

По своему экрану нашел это: http://www.elecrow.com/display-c-77/lcds-oleds-c-77_88/144-128x-128-tft-lcd-with-spi-interface-p-855.html

Там есть ссылки на описание, библиотеки и схему! Но не могу найти схему, как его подключить к ардуине. И желательно бы пример скетча...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так ведь даже в названии темы указан дисплей нокии 51110, а он монохромный

в той либе что вы дали не увидел режим работы с SPI, вроде только паралельный режим, хотя на картинке явно дисплей с последовательным интерфейсом

 

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

jeka_tm пишет:

так ведь даже в названии темы указан дисплей нокии 51110, а он монохромный

в той либе что вы дали не увидел режим работы с SPI, вроде только паралельный режим, хотя на картинке явно дисплей с последовательным интерфейсом

 

Вот-вот, и я о том же! Пока разобраться не могу, вот и попросил помощи!

А по поводу названия темы, указал 5110 потому что это название было в названии лота!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

http://www.rockbox.org/wiki/pub/Main/SonyNWZE370/ILI9163.pdf

даташит на контроллер

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

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

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

Была бы документация на русском...

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

С наскока одолеть не получилось. Продаван, у которого покупал этот экран, обещнулся прислать кое-какую документацию, но пока молчит!

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Наковырял скетч для экрана 1.8"

Распиновка экрана там такая

//Param1:Value Can be:QD_TFT180A/QD_TFT180B/QD_TFT180C
//Param2 instructions:Connect to LCD_Pin SDA/SDI/MOSI(it means LCD_Model Pin_SDA/SDI/MOSI Connect to Arduino_UNO Pin11)
//Param3 instructions:Connect to LCD_Pin SCL/CLK/SCLK(it means LCD_Model Pin_SCL/CLK/SCLK Connect to Arduino_UNO Pin10)
//Param4 instructions:Connect to LCD_Pin CS/CE(it means LCD_Model Pin_CS/CE Connect to Arduino_UNO Pin9)
//Param5 instructions:Connect to LCD_Pin RST/RESET(it means LCD_Model Pin_RST/RESET Connect to Arduino_UNO Pin12)
//Param6 instructions:Connect to LCD_Pin RS/DC(it means LCD_Model Pin_RS/DC Connect to Arduino_UNO Pin8)
UTFT myGLCD(QD_TFT180C,11,10,9,12,8);   // Remember to change the model parameter to suit your display module!
 
На моем экране не пойму, что за пин под названием "А0" В описании с китайского переводится как "Данные / команды переключатель "(перевод гуглом)
Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013
В библиотеке к экрану написано вот такое:
 
sbit LCD_CS = P0 ^ 0; / / Chip Select 
sbit LCD_AO = P0 ^ 2; / / data / command switch 
sbit LCD_SDA = P1 ^ 5; / / Data 
sbit LCD_SCK = P1 ^ 7; / / Clock 
sbit LCD_REST = P0 ^ 1; / / Reset 
 
Как из этого определить к каким пинам ардуины его подключать?
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так вы сами в 9 посте написали куда подключать)))

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

jeka_tm пишет:

так вы сами в 9 посте написали куда подключать)))

А где я там писал куда пин А0 экрана подключать?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

попробовал, не пашет!

Я пробую подключить этот экран к ардуино про микро. вот он: http://microcontrollershop.com/product_info.php?products_id=5625  Полюзуясь распиновкой с этого сайта, подключил по следующей схеме:

sck ->15,  sda ->16, A0 -> 8, reset ->9, cs ->10. Ну, питание и подсветку, само собой.

Микросхема управления этим экраном ili9163, его нет в библиотеке UTFT.h . Но, здесь: http://forums.leaflabs.com/topic.php?id=74086 в первом вычитал что ili9163 и HX8353 совместимы, а он ести в библиотеке. Таким образом, строчка подключения библиотеки экрана приняла такой вид: UTFT myGLCD(HX8353,16,15,10,9,8);

Но и так не работает!

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Со строчкой  myGLCD(ST7735,16,15,10,9,8); пытается что-то показать, а именно вертикальные цветные линии

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да поменяй на свои пины 234567 например. пины же можно назначить любые. я бы лично так сделал. с этими 15-16 пинами хрен разберешь. на одной микро 

http://pacpac.ru/published/publicdata/WWWTPGSHOPRUPACPAC/attachments/SC/...

на другой

http://www.jayconsystems.com/media/catalog/product/cache/1/image/800x600...

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

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

В скетче для 1.8" экрана поменял строчку библиотеки экрана на:

UTFT myGLCD(S6D02A1,16,15,10,9,8);  и экран заработал... только начала координат в нижнем левом углу, а не в верхнем левом и изображение получается повернутое на90 градусов против часовой стрелки. Да и разрешение кажется не совпадает.

Как можно перенести начало координат, чтоб изображение было "правильным"?

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Разобрался! В строке myGLCD.InitLCD(); в скобках надо указать ориетацию изображения. По умолчанию идет альбомная. 

Строчку меняем на myGLCD.InitLCD(PORTRAIT); и радуемся жизни!

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Забавно, про правильное отображение, экран можно повернуть как хошь. Да ладно, я пару штук таких заказал, так что спасибо за наводку, наконец то будет чем побаловаться.

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Итак, двигаемся дальше. С выводом текста на экран проблем не возникло. Возникла проблема с выводом изменяющихся значений, а точнее проблема возникает при изменении разрядности с большего на меньший(к примеру с 10 на 9 или с 100 на 99). Последняя цифра не стирается, а просто остается на экране. На экранах 1602 и 2004 эту проблему решал выводои пары-тройки пробелов после значения. Это "прокатывало" потому, что там текст можно было выводить подряд, т.е. при изменении разрядности пробелы смещались и стирали ненужные символы. Тут же для вывода текста указываешь место, где его выводить.

Можено конечно в конце каждого цикла или перед выводом значения закрашивать всё значение пробелами, но тогда значение немного мигает, а это не АЙС!

Подскажите, как можно решить эту проблему?

step962
Offline
Зарегистрирован: 23.05.2011

Тима пишет:

Подскажите, как можно решить эту проблему?

Нарисовать прямоугольник в соответствующей области экрана.

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

step962 пишет:

Тима пишет:

Подскажите, как можно решить эту проблему?

Нарисовать прямоугольник в соответствующей области экрана.

И...? Что это даст?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

зарисует цифру которая остается)

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

jeka_tm пишет:

зарисует цифру которая остается)

 

Я понял что надо зарисовать. Просто думал, может есть какой нибудь стандартный метод. Зачем квадратом зарисовывать, если можно просто пробелом?

Вот как вышел из этой ситуации:

#include <UTFT.h>
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];

UTFT myGLCD(S6D02A1,16,15,10,9,8);

void setup()
{
  myGLCD.InitLCD(PORTRAIT); 
  myGLCD.clrScr();
  myGLCD.setColor(0, 255, 0);
  myGLCD.fillScr(0, 0, 255);
  myGLCD.setBackColor(0, 0, 255);
  myGLCD.setFont(SmallFont);
  myGLCD.print("X=", 10, 31);
  myGLCD.setFont(BigFont);
   myGLCD.print("X=", 10, 61);
  long x;
}

void loop()
{
  long x;
    for (int i=0;  i<= 20; i++){
      x=i;
      int q=0;
      if (x<10) q=8;
      if (x>9) q=16;
      myGLCD.setFont(SmallFont);
      myGLCD.printNumI(x, 30, 31);
       myGLCD.print("  ", 30+q, 31);
      myGLCD.setFont(BigFont);
      myGLCD.printNumI(x, 40, 61);
       myGLCD.print("  ", 40+q*2, 61);
      delay(300);
    
    }
       
}

 

 

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Как правильно "выкинуть" из библиотек все лишнее, чтоб уменьшить размер скетчей? А то в скетч не влазеет другие библиотеки.

К примеру, можно ли из библиотеки к экрану выкинуть компоненты для экранов с другим процем? И поможет ли это?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

то что не используется записано не будет, но вот много условий для разных процессоров, контроллеров это можно выкинуть

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

jeka_tm пишет:

то что не используется записано не будет, но вот много условий для разных процессоров, контроллеров это можно выкинуть

Я попробовал создать новую библиотеку из скаченой, пока не получилось. При компиляции скетча сильно ругается, чуть ли не матом )))

А как определить что можно выкинуть? И можно ли просто закоментить ненужные строчки?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ковырять и ковырять

 

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

вариант с закоментированием строк прокатывает! сбросил уже около 4000 байт. еще коментить и коментить!

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Перелопатил библиотеку. Скетч, который раньше "весил" 20460 байт, сейчас весит 11368 байт! Теперь наверное и в нано можно будет залить! Теперь библиотеку шрифтов буду лопатить. Оставлю один шрифт вместо трех!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну так и продолжайте пока не перестанет работать

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

jeka_tm пишет:

ну так и продолжайте пока не перестанет работать

Не, я если что удалю, сразу проверяю на работоспособность. Если не работает - возвращаюсь на шаг назад!

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

С библиотекой шрифтов получилось еще около 3000 байт скинуть...

Ardfun
Offline
Зарегистрирован: 22.05.2016

А подскажите есть ли функция для данного экрана которая позволит перевернуть изображение верх ногами?

И каким образом можно осуществить память последнего экрана, например если есть много экранов с разными параметрами и переключением, так вот как зделать чтоб влючался при перезагрузке не первый а крайне включеный экран???

Ardfun
Offline
Зарегистрирован: 22.05.2016

?

TovBender
Offline
Зарегистрирован: 12.04.2015
 tft.setRotation(1);//Поворачиваем экран на 90 град.   // ****************************

 

Ardfun
Offline
Зарегистрирован: 22.05.2016

Кто нибудь использовал  EEPROM для сохранения предидущего екрана(если у нас несколько экранов которые переключаются одной кнопкой по очереди) после выключения устройства?

например вот(код не полный и с ошибкамы то я так набросал для принципа) у меня три экрана и нужно чтобы после выключения оставался тот который был крайним до выключения

и данная библиотека #include <EEPROM.h> встроеная или нужно докачивать?

void loop() {

 dps.getPressure(&Pressure);
 dps.getTemperature(&temp3); 

if (m==0)                                                                      
 {
myGLCD.clrScr(); // Очистка экрана
myGLCD.setFont(BigNumbers);
myGLCD.printNumF(Pressure / 133.3, 0, CENTER, 5);  //давление в мм рт.ст.
  }
else if (m==1)         
{

myGLCD.clrScr(); // Очистка экрана
myGLCD.setFont(BigNumbers);
 myGLCD.printNumF(temp3 * 0.1, 0, CENTER, 5); //    температура  в цельсиях                                    
  }   
    
 else if (m==2)                                                              
 {  
myGLCD.clrScr(); // Очистка экрана       
 myGLCD.setFont(BigNumbers); 
 myGLCD.printNumF(Vin, 2, CENTER, 5);  //  вывод уровня заряда
  }
}
  myGLCD.update(); // Вывод вместимого буфера на дисплей
 
}

 

Ardfun
Offline
Зарегистрирован: 22.05.2016

?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да почему нет. просто записываешь номер экрана и все

ptr
Offline
Зарегистрирован: 28.05.2016

Если запись в EEPROM будет происходить редко, то проблем не вижу. Если же часто, например, каждую минуту, чтобы сохранить текущий статус, то долго он не проживет. Судя по даташит при ежеминутной записи EEPROM умрет через ~70 суток работы

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ячеек много, помучал одну, переходи на другую

ptr
Offline
Зарегистрирован: 28.05.2016

jeka_tm пишет:

ячеек много, помучал одну, переходи на другую

Уже интересней. Можно на код посмотреть?

Особенно интересует метод организации транзакции при записи в EEPROM. Я уже сталкивался с проблемой целостности данных в EEPROM в случае неожиданных скачков питания, выключений или перезагрузок. В итоге отказался от плавающих адресов ячеек в EEPROM, так как ведение в нем еще и журнала транзакций сводило всю экономию на нет.

Ardfun
Offline
Зарегистрирован: 22.05.2016

Я так понял что мне нужно в моем коде записать текущее значение  m которое указывает на выбраный экран 

if (m==0)                                                                      
 {
myGLCD.clrScr(); // Очистка экрана
myGLCD.setFont(BigNumbers);
myGLCD.printNumF(Pressure / 133.3, 0, CENTER, 5);  //давление в мм рт.ст.
  }
else if (m==1)         
{

myGLCD.clrScr(); // Очистка экрана
myGLCD.setFont(BigNumbers);
 myGLCD.printNumF(temp3 * 0.1, 0, CENTER, 5); //    температура  в цельсиях                                    
  }   

а как это грамотно реализовать, киньте пожалуйста примеры если есть ?

И по поводу библиотеки нужно со стороны потцеплять ?

 

Ardfun
Offline
Зарегистрирован: 22.05.2016

а то мало понятной информации по работе EEPROM