Библиотека для LCD Nokia 1100

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

то есть букву можешь нарисовать в любом месте? например сместить на 3 пикселя вниз

или все таки привязан к строкам

Димон Безпарольный
Offline
Зарегистрирован: 13.12.2015

К строкам привязан. Точно. По другому без буфера быть не может.

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

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

timer_23
Offline
Зарегистрирован: 06.08.2014

hugoboss317, Я конечно, понимаю, что я уже заманал в край)) Но блин, все таки хочу увидить пример, как вы очищаете дисплей, а то я делаю это таким способом ->

void clear(){
LcdPageONE();
 do{}while (LcdPageTWO());
}

Просто вызываю эту функцию, чтобы все отчистить, иначе никак не получается.

Но я заметил, что когда так "очищаю" , на дисплее видно, что он как бы включен, пиксели немного контрастные.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ну в принципе конечно можно и так, но по сути вы три раза выводите пустой массив, каждый раз ещё и очищая его. 

А вобще экран очищается при инициализации вот таким способом:

for (int i=0; i<(X_RES*8); i++)          // Lcd Clear
  {                                      //
	LcdWrite(LCD_D, 0x0);                //
  }                                      // end clear

X_RES = 96. LCD_D это "1"

Лучше сделать такую функцию. Гораздо быстрей очищать будет.

void LcdClear(){
for (int i = 0; i < 768; i++)        
  {                                      
    LcdWrite(1, 0);                
  }   
}                                  

 

vingor
Offline
Зарегистрирован: 25.05.2014

jeka_tm прошу помощи в решении вопроса с дисплеем 1202 http://arduino.ru/forum/programmirovanie/displei-1202-draiver-ste2007-russkii-shrift

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

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

надо заменить в либе 

void LCD1202::drawString(byte x, byte y, boolean color, char *str){
  unsigned char type = *str;
  if(type>=128) x=x-3;
  while(*str){ 
    drawChar(x, y, color, *str++);
    unsigned char type = *str;
    (type>=128)? x=x+3 : x=x+6;
  }
}

на 

void LCD1202::print(byte x, byte y, boolean color, char *str){
  unsigned char type = *str;
  if(type>=128) x=x-3;
  while(*str){ 
    drawChar(x, y, color, *str++);
    unsigned char type = *str;
    (type>=128)? x=x+3 : x=x+6;
  }
}

void LCD1202::print(byte x, byte y, boolean color, long num){
  char c[20];
  ltoa(num,c,10);
  LCD1202::print(x, y, color, *str)
}

если норм надо будет добавить для остальных видов данных, аналогично

http://arduino.ru/forum/programmirovanie/biblioteka-dlya-lcd-nokia-1100?...

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

jeka_tm пишет:

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

Хорошо, дома все лежит, не забуду, возьму на работу и попробую.

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

хорошо

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

По предложениям и замечаниям jeka_tm, поправил библиотеку еще раз и выложил следующий релиз:

 библиотека дисплея Nokia 1202 версия 1.5.

В текущей версии функция print выводит на дисплей целочисленные значения int, long, byte и строки.

C float нужно колдовать, пока не заморачивался этим. Старая версия доступна в архиве, как и все предыдущие.

Теперь пример вывода выглядит так:

       void print(byte x, byte y, boolean color, char *str);        //Вывод строки
       void print(byte x, byte y, boolean color, long num);         //Вывод целочисленных цифровых значений int, long, byte
       void print_1607(byte x, byte y, boolean color, char *str);   //Вывод строки в заданное знакоместо в заданную строку, как в 1602, только тут 1607

//********** Выводим по координатам числовое значение *****************************
int t= 125;
long p= -345;
byte k= 255;

lcd.print(3, 5, 1, "Выводим циферки:" ); //Выводим по координатам x, y, черным чветом, строку "Выводим циферки:"
lcd.print(9, 15, 1, t);                        //Выводим числовое значение типа integer
lcd.print(9, 25, 1, p);                        //Выводим числовое значение типа long
lcd.print(9, 35, 1, k);                        //Выводим числовое значение типа byte
lcd.Update();                                 //Обновляем дисплей(выводим из буфера)
delay(1000);                                  //Перекур
lcd.Clear_LCD();                              //Очищаем дисплей

//***********************************************************************************

Версия 1.5
Убрана функция DrawString, теперь текстовые строки и целочисленные форматы(byte, int, long) выводятся одной функцией print.
Функция SetCursor_DrawString_1607 переименована в print_1607.
Все остальное без изменений.
Естественно применяя эту библиотеку для созданных со старыми версиями библиотеки скетчами, в последние придется внести необходимые замены, то есть, переименовать в старых скетчах функцию DrawString в print и SetCursor_DrawString_1607 в print_1607.
Работа с типом float в проекте. Библиотека с дисплеем работает очень быстро, но потребляет слишком много памяти из за встроенных шрифтов, которые при необходимости(ненадобности) можно частично или полностью исключить, а так же исключить не используемые функции.
 

Добавил видео демо, кому интересно.

 

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

по быстрому слепил на основе либы Nokia 1202 либу для Nokia 5110

все тоже самое, просто больше пинов для подключения, и разрешение меньше

https://yadi.sk/d/CXjuENmaEEwun

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Здравствуйте !

Не могу правильно вывести на экран значение переменной voltage или любой другой .

#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;
long p= t;
byte k= voltage; 
 
 lcd.print(1, 1, 1,  "     Привет!    ");
lcd.print(1, 10, 1, voltage);
lcd.print(1, 20, 1, t);
lcd.print(1, 30, 1, p);
lcd.print(1, 40, 1, k);

lcd.Update();

delay(1000);
lcd.Clear_LCD();

}

На экране только первая цифра. К примеру напряжение 1.63 выводится только 1.

В монитор порта все выводится правильно. Что я делаю не так ?

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

потому что либа не умеет выводить числа с плавающей запятой. отправь 163. должно выводится

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

hugoboss317
Offline
Зарегистрирован: 21.03.2013

))

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Это разве гемор? 

Вот подпаивать тонкий проводок к каждой дорожке на шлейфе экрана вот это гемор, и как я вижу, справился, значит и с float справиться.

Умножаем значение float на 10, объявляем int, инициализируем её умноженным значением, выводим делённое на 10 значение int(не делим, только выводим, выводим точку, выводим остаток от деления на 10 значение int.

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

hugoboss317 пишет:

Это разве гемор? 

Вот подпаивать тонкий проводок к каждой дорожке на шлейфе экрана вот это гемор, и как я вижу, справился, значит и с float справиться.

Умножаем значение float на 10, объявляем int, инициализируем её умноженным значением, выводим делённое на 10 значение int(не делим, только выводим, выводим точку, выводим остаток от деления на 10 значение int.

 Не соглашусь ))

мне проще 50 таких проводков припаять чем "ковырять" код программы(микроскоп +опыт ремонта сотовых).

Не моглы бы вы показать это на каком нибудь примере в коде ? 

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

для начала может стоит определится а нужен ли собственно float? потому что если только для рассчета напряжения и вывода на дисплей он не нужен

Димон Безпарольный
Offline
Зарегистрирован: 13.12.2015



Делаю так:/***********************************************************************************
*value - число для преобразования, comma - позиция точки на индикаторе		
*преобразует 16-ти разрядное число, записывает его в буфер индикатора			 
***********************************************************************************/
void IND_Output(unsigned int value, unsigned char comma){//Время выполнения 111мкс
	unsigned char tmp;									//
	for(unsigned char i = 0; i < 3; i++){				//всего разрядов - 3 (0...2)
		tmp = value % 10;								//выделить остаток от деления
		buf[i] = number[tmp];							//записать в буфер
		value = value/10;}								//целочисленное деление на 10
	if (comma < 3) {buf[comma] |= (1<<(SEG_DP));}		//засветка запятой
}														//void IND_Output(unsigned int value, unsigned char comma)

 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Получилось иначе.

#include "lcd1202.h"
LCD1202 lcd(8, 7, 6, 5);  // RST, CS, MOSI, SCK
int voltage= 1;

//------------------------------------------------------------------------------
// File generated by LCD Assistant
// http://en.radzio.dxp.pl/bitmap_converter/
//------------------------------------------------------------------------------

static const char mobistrike [768]  PROGMEM =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0x00, 0xC0, 0x60, 0x30, 0xE0, 0x00,
0x00, 0x80, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0xF0, 0xF0, 0x60, 0x60, 0x60, 0xE0, 0xFF, 0xC0, 0x70,
0x30, 0x18, 0xF8, 0xF0, 0x80, 0xC0, 0xC0, 0xF8, 0x38, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xF8,
0x0C, 0x00, 0x00, 0xB0, 0xF0, 0x70, 0xFF, 0x3F, 0x30, 0x10, 0x10, 0xD8, 0x38, 0x80, 0xE0, 0x30,
0x30, 0x30, 0x20, 0xF0, 0xF8, 0x38, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x9F, 0xC0, 0xE0, 0x38,
0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF8, 0xC6, 0x76, 0x3E, 0x00, 0x00, 0x80, 0x60, 0x00,
0x00, 0x00, 0x00, 0x07, 0x0F, 0x03, 0x01, 0x00, 0x03, 0x07, 0x06, 0x00, 0x00, 0x00, 0x07, 0x06,
0x06, 0x01, 0x0F, 0x1F, 0x18, 0x18, 0x0C, 0x07, 0x01, 0x00, 0x00, 0x00, 0x1F, 0x33, 0x30, 0x38,
0x1C, 0x06, 0x07, 0x03, 0x01, 0x00, 0x00, 0x0F, 0x1C, 0x18, 0x0C, 0x0C, 0x06, 0x61, 0x70, 0x31,
0x1F, 0x0E, 0x06, 0x01, 0x00, 0x1E, 0x33, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0F, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x0F, 0x1C, 0x18, 0x0C, 0x0C, 0x03, 0x01, 0x1F, 0x03, 0x01, 0x07, 0x0C,
0x18, 0x18, 0x0C, 0x04, 0x06, 0x01, 0x07, 0x0F, 0x0C, 0x0C, 0x04, 0x02, 0x03, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 
};






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();
  
//********************************************** Выводим изображение из массива image ********************************************************

lcd.drawBitmap(0, 48, mobistrike, 96, 64, 1);   //Выводим картинку в координаты x, y, с размером 96 на 64 пикселя, с цветом 1 (1 - пиксель включен, темный)





lcd.print(1, 1, 1,  "arduino.ru рулит");
lcd.print(1, 10, 1, t);
lcd.print(1, 20, 1, n1);
lcd.print(1, 30, 1, n2);
lcd.print(1, 40, 1, n3);


lcd.print(30, 10, 1, n1);
lcd.print(34, 10, 1, ".");
lcd.print(38, 10, 1, n2);
lcd.print(44, 10, 1, n3);

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

}

Конвертер BMP to arrays брал тут http://en.radzio.dxp.pl/bitmap_converter/

Всем спасибо за помощь.

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

можно проще

float nrp=12.34;
  char c[20];
  
  lcd.print(0, 0, 1, dtostrf(nrp, 2, 2, c));
  lcd.Update();

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

void float_print(byte x, byte y, boolean color, float num, byte zn){
  char c[20];
  long d=num;
  byte m=1;
  while(d>9){
    d=d/10;
    m++;
  }
  lcd.print(x, y, color, dtostrf(num, m, zn, c));
}

пользоваться так:

float nrp=2343.34;
float_print(0, 0, 1, nrp, 2);
lcd.Update();

 

maxibons
Offline
Зарегистрирован: 27.12.2015

jeka_tm пишет:

void float_print(byte x, byte y, boolean color, float num, byte zn){
  char c[20];
  long d=num;
  byte m=1;
  while(d>9){
    d=d/10;
    m++;
  }
  lcd.print(x, y, color, dtostrf(num, m, zn, c));
}

пользоваться так:

float nrp=2343.34;
float_print(0, 0, 1, nrp, 2);
lcd.Update();

С целью экономии места на экране хочу уменьшить знакоместо для точки.

Если это реально, помогите изменить строчку из font.h

0x00, 0x60, 0x60, 0x00, 0x00 ,  // 0x2e   .

И ещё. Приведите, пожалуйста, пример использования функции

 void print(byte x, byte y, boolean color, char *str);                                     //Вывод строки

У меня вылазит ошибка 

expected primary-expression before 'char'

Спасибо.

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

реально. но места реально не хватает?

lcd.print(1, 1, 1,  "arduino.ru рулит");

maxibons
Offline
Зарегистрирован: 27.12.2015

jeka_tm пишет:

реально. но места реально не хватает?

lcd.print(1, 1, 1,  "arduino.ru рулит");

Пока еще хватает ).

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

А про вывод строки - этот пример понятен, конечно.

К сожалению, я плохо представляю даже как правильно вопрос задать и моё программирование пока сводится к сведению кусков чужого кода, выдернутых из разных программ.

А хочу я вывести переменную-строку (если такое бывает :) ), которая формируется в другой функции.

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

 

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

конечно можно. но пока для общего понимания лучше делай как есть. когда в голове хорошо все на данный момент представлять подскажу куда копать дальше

hugoboss317
Offline
Зарегистрирован: 21.03.2013

maxibons пишет:

С целью экономии места на экране хочу уменьшить знакоместо для точки.

Ха... А я в своей библиотеке предусмотрел такой вывод. Некоторые (. , :  !)символы выводятся не полной шириной а несколько пикселов. 

Только это изначально в шрифте есть особый байт идентиффикатор.

idfont     = pgm_read_byte_near(&FontPointer[4]); // маркер шрифта для коротких символов (!.,: ) 1 или 2 - полная длинна

Да и сами "короткие" символы в шрифте сдвинуты влево, выводятся сразу, но не вся ширина.

if((ch == 33||ch == 44||ch == 46||ch == 58) && index == 4 + (index*widht) && idfont==1)  break;             //.,:!	укороченные символы

Короче надо в бибу лезть, в шрифт лезть, ну и ещё там кудато надо лезть.

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

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

maxibons
Offline
Зарегистрирован: 27.12.2015

Бесполезно, я нуб. Я паяю всю жизнь, мне проще наклепать пачку таких дисплеев, чем пять строчек кода написать. 

Так что мне достаточно этого:

hugoboss317 пишет:

Короче надо в бибу лезть, в шрифт лезть, ну и ещё там кудато надо лезть.

Если бы не нужда, я бы и не лез в это вообще. Ситуация заставляет "сообразить" пид-регулятор с отслеживанием нескольких источников входных данных, реакцией на них и выводом текущего состояния на дисплей. В принципе, всё поместится, пусть и не так нарядно, как хотелось.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Де то выкладывал тут, могу ещё разок повториться. Оптимизирована для вывода на МК с RAM 1к с поддерхкой графики.

Обратить внимание на способ вывода на экран...

https://yadi.sk/d/HzxsXwb9f9QqN

 

maxibons
Offline
Зарегистрирован: 27.12.2015

Друзья, помогите втащить на экран 1202 время из Ds1307.

На 1602 получается, а на этот ну никак - либо не компилируется, либо не показывает после заливки.

Вот такой вариант работает на 1602. Слепил его на основе примера из библиотеки "RTClib". Вариант с русскими символами на моём 1602 даёт кракозяблы. Английский шрифт - ок.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
char monthsOfTheYear[12][12] = {"Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan"};
//char daysOfTheWeek[7][12] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"};
//char monthsOfTheYear[12][12] = {"Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря", "Января"};

void setup () {
  
  lcd.begin(16, 2); 
}
void loop () {
    DateTime now = rtc.now();    
    lcd.setCursor(0,0);
     if (now.hour()<10) {
      lcd.print(' '); };
    lcd.print(now.hour(), DEC);
    lcd.print(':');
     if (now.minute()<10) {
      lcd.print('0');    };
    lcd.print(now.minute(), DEC);
    lcd.print(':');    
    if (now.second()<10) {
      lcd.print('0');    };
    lcd.print(now.second(), DEC);
    

    lcd.setCursor(0,1);
    if (now.day()<10) {
      lcd.print(' ');    };
    lcd.print(now.day(), DEC);
    lcd.print(' ');
    lcd.print(monthsOfTheYear[now.month(), DEC]);
    lcd.print(", ");
    lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
    lcd.print(" ");
}

Вывожу то же на 1202, только в столбик:

#include <Wire.h> 
#include <lcd1202.h>
#include <RTClib.h>
RTC_DS1307 rtc;
LCD1202 lcd(6, 7, 8, 9);  // RST, CS, MOSI, SCK
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//char daysOfTheWeek[7][12] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"};
char monthsOfTheYear[12][12] = {"Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan"};


void setup(void) {
  lcd.Inicialize();  //Инициализация дисплея
  lcd.Clear_LCD();  //Очистка дисплея
  Wire.begin();  

  }

void loop(void) {
  DateTime now = rtc.now();
  lcd.print(0, 0, 1, (now.hour(), DEC));
  lcd.print(20, 0, 1, "часов");
  lcd.print(0, 10, 1, (now.minute(), DEC));
  lcd.print(20, 10, 1, "минут");
  lcd.print(0, 20, 1, (now.second(), DEC));
  lcd.print(20, 20, 1, "секунд");
  lcd.print(0, 30, 1, (now.year(), DEC));
  lcd.print(20, 30, 1, "год");
  lcd.print(0, 40, 1, (now.month(), DEC));
  lcd.print(20, 40, 1, "месяц");
  lcd.print(0, 50, 1, (now.day(), DEC));
  lcd.print(20, 50, 1, "день");
  lcd.print(0, 60, 1, daysOfTheWeek[now.dayOfTheWeek()]);
  lcd.print(60, 40, 1, monthsOfTheYear[now.month()]);
  lcd.Update();
  delay(300);                                  //Любуемся картинкой
  lcd.Clear_LCD();                              //Очищаем дисплей
}

На выходе получаю:

10 часов

10 минут

10 секунд

10 год

10 месяц     Sunday (не декабрь, а воскресенье, Карл!!! 33я строчка кода, как???)

10 день

Friday

С русскими названиями тоже есть проблемы, если строчку раскомментировать, то вместо "Friday" будет написано "ПятницСуббот", недоумение.

Вчера он показывал четверг, поэтому делаю вывод, что RTC-модуль отдаёт данные, только я забрать не умею.

ЧЯДНТ?

 

UPD:

С этой библиотекой всё заработало с пол-пинка.

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

ну ты переборщил с массивами))) зачем двумерные делаешь если они все одномерные. слова часов минут тоже засунь в массив. все массивы храни во флеше и считывай оттуда

maxibons
Offline
Зарегистрирован: 27.12.2015

Да это я для примера накидал скетч, так было проще.
Только он не работает, и это главное. Мне первая библиотека RTClib больше подходит, поскольку там по-отдельности даются меры времени, а в этой библиотеке - только строкой. А у меня в целях создать суточный график для электрокотла с учётом ночного/дневного тарифа.

knopas811
Offline
Зарегистрирован: 27.01.2017

Подскажите что не так? При выводе val на дисплей, почемуто вместо цифер "кракозябры". Слово STATUS1: выдает нормально.Что делаю не так?

#include <PCF8814.h>//lcd_nokia1100
#include <PCF8814_font.h>
 int ledlcd = 6;//подсветка lcd 
 int ledb = 9;//светодиод
 int potPin = 0;//фотрезистор
 PCF8814 lcd(13, 11, 10, 8);
void setup()
{
  Serial.begin(9600);//выводим показания на компьютер
  analogReference(DEFAULT);
  pinMode (ledb,OUTPUT);
  pinMode(ledlcd, OUTPUT);
  lcd.Init();
  lcd.GotoXY(0,2);
  lcd.Print("STATUS1: ");//1-я строка 
   
}
void loop()
{
    int val = analogRead(potPin);//читаем показания с фоторезистора и присваиваем его к val
    lcd.GotoXY(8,2);
    lcd.Print(val);
    if(val<20){//если освещение менше 20 то мигать светодиодом
    digitalWrite(ledb, HIGH);
    delay(50);
    digitalWrite(ledb, LOW);
    delay(50);
    analogWrite(ledlcd, 600);
  }
  else{
    digitalWrite(ledb, LOW);//иначе отключить светодиод
    analogWrite(ledlcd, 20);
  }
  Serial.println(analogRead(potPin));
}

http://github.com/igorok107/PCF8814

библиотека

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

скорее всего нет преобразование int->str в функции Print. Я бы воспользовался sprintf для форматирования.

char buf[30];
sprintf_P(buf,PSTR("Status1:%d"),val);
lcd.Print(buf);

 

knopas811
Offline
Зарегистрирован: 27.01.2017

NeiroN пишет:

скорее всего нет преобразование int->str в функции Print. Я бы воспользовался sprintf для форматирования.

char buf[30];
sprintf_P(buf,PSTR("Status1:%d"),val);
lcd.Print(buf);

 

спасибо помогло

knopas811
Offline
Зарегистрирован: 27.01.2017

А не могли бы Вы пожалуйста внести в эту библиотеку преобразование int->str, ато я новичок в этом деле, пока для меня сложно понять то что Вы написали. Зарание спасибо.

timer_23
Offline
Зарегистрирован: 06.08.2014

Не подскажете библеотеку Меню. Которая легко заведется с этим дисплеем?

FR
Offline
Зарегистрирован: 29.12.2015

Привет!

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

Всю либу перерыл, так и не нашел. Кружечки, прямоугольнички, цифреки - пожалуйста, а контрастности нет :(

Либа вот эта, автор "Gres". В ней была ссылка на эту тему.

 

Спасибо :)

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

она там уже максимальная. к сожалению этот дисплей не очень контрастный

FR
Offline
Зарегистрирован: 29.12.2015

jeka_tm пишет:

она там уже максимальная. к сожалению этот дисплей не очень контрастный

Так вот, мне надо ее уменьшить. Где ее можно изменить?

Встречал еще либы к этому экрану, там контрастность можно менять.

Вот, например:

void lcd_contrast(byte contrast){
    contrast = contrast & 0x1F;
    LcdWrite(LCD_C,0x80 + contrast); // контрастность (0-31)
  }

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ну так используй эту функцию. Согласно твоей библиотеки пошли команду со значением от 0 до 31.

FR
Offline
Зарегистрирован: 29.12.2015

Эта функция из другой либы. Она, увы мне не подходит из-за отстсутствия некоторых функций.

Я спрашивал конкретно в библиотеке от Gres'а где настраивается контрастность? Все перерыл, ничего похожего, отвечающего за задание контарстности не нашел. Мб кто знает?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
void lcd_contrast(byte contrast){
    contrast = contrast & 0x1F;
    SendByte(LCD_C, 0x80 + contrast); // контрастность (0-31)
  }

но если не заработает в либе нужно объявить функцию SendByte в public в файле lcd1202.h и тогда код будет

void lcd_contrast(byte contrast){
    contrast = contrast & 0x1F;
    lcd.SendByte(LCD_C, 0x80 + contrast); // контрастность (0-31)
  }
FR
Offline
Зарегистрирован: 29.12.2015

В итоге засунул функцию в эту либу.

Все заработало как надо =) Спасибо!)

alecksis
alecksis аватар
Offline
Зарегистрирован: 13.10.2017

можете подсказать, сколько мкА потребляет этот дисплэй?

maxibons
Offline
Зарегистрирован: 27.12.2015

alecksis пишет:

можете подсказать, сколько мкА потребляет этот дисплэй?

Без подсветки - 200мкА при питании 3.3в.

Подсветка от 3мА, зависит от желаемой ярокости.

alecksis
alecksis аватар
Offline
Зарегистрирован: 13.10.2017

Спасибо, всеравно многовато, на батарейках 3 месяца выдержит.

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

Так отключай дисплей когда не нужен

alecksis
alecksis аватар
Offline
Зарегистрирован: 13.10.2017

Спасибо за библиотечку автору! 

Viktor_7
Offline
Зарегистрирован: 19.12.2017

Друзья, помогите пожалуйста с дисплеем 1203.

Дисплей аппаратно, по соответствующим командам, позволяет отзеркалить изображение по обоим осям, НО:

Как мне развернуть нормальное изображение на 90, 180 или 270 градусов, вообще нужно сделать ориентацию с "альбомной" на "книжную".

Как я понимаю, такое возможно только при полной буферизации изображения, как повернуть массив, строки и столбцы?

В u8glib, на популярных дисплеях это делается командой  u8g.setRot90();

Помогите, поделитесь опытом.

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

Библиотека итак делает полную буферизацию.

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