LCD 192x64 по I2C BV4613

PIW2004
Offline
Зарегистрирован: 24.09.2013

Никто не сталкивался с подключением Графического дисплея по I2C? к контролеру прилагается библиотека, но нет примеров самого кода, как её использовать, тоесть как инициализировать дисплей и вывести на него текст.

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

PIW2004
Offline
Зарегистрирован: 24.09.2013

Таки удалось запустить данный экран по I2C, подавая команды напрямую на контроллер экрана, библиотеку родную не удаётся подключить, выдаёт ошибку с функцией "itoa"

Попробовал напрямую, без библиотеки экрана воспользоваться ей, подключил библиотеки "stdio.h" и "stdlib.h", насколько я понял, они необходимы для работы данной функции, но всёравно при компиляции выдаёт ошибку 

Arduino: 1.5.4 (Windows 7), Board: "Arduino Due (Programming Port)"

ekran.ino: In function 'void loop()':
ekran:104: error: 'itoa' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.

 

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

Нашел что можно проще разбивать число на 2 цифры при помощи itoa но что то не выходит каменный цветок.

Используется Arduino DUE

001#include "Wire.h"
002//#include "BV4613.h"
003#include "stdio.h"
004#include "stdlib.h"
005 
006#define DS1307_I2C_ADDRESS 0x68 //Адрес часов
007      
008byte decToBcd(byte val)
009{
010return ( (val/10*16) + (val%10) );
011}
012  
013byte bcdToDec(byte val)
014{
015return ( (val/16*10) + (val%16) );
016}
017  
018void setDateDs1307(byte second,        // 0-59
019                   char minute,        // 0-59
020                   byte hour,          // 1-23
021                   byte dayOfWeek,     // 1-7
022               byte dayOfMonth,    // 1-28/29/30/31
023               byte month,         // 1-12
024               byte year)          // 0-99
025{
026 Wire.beginTransmission(DS1307_I2C_ADDRESS);
027 Wire.write(0);
028 Wire.write(decToBcd(second));   
029 Wire.write(decToBcd(minute));
030 Wire.write(decToBcd(hour));    
031 Wire.write(decToBcd(dayOfWeek));
032 Wire.write(decToBcd(dayOfMonth));
033 Wire.write(decToBcd(month));
034 Wire.write(decToBcd(year));
035 Wire.endTransmission();
036}
037      
038void getDateDs1307(byte *second,
039               byte *minute,
040               byte *hour,
041               byte *dayOfWeek,
042               byte *dayOfMonth,
043               byte *month,
044               byte *year)
045{
046 Wire.beginTransmission(DS1307_I2C_ADDRESS);
047 Wire.write(0);
048 Wire.endTransmission();
049      
050 Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
051      *second     = bcdToDec(Wire.read() & 0x7f);
052      *minute     = bcdToDec(Wire.read());
053      *hour       = bcdToDec(Wire.read() & 0x3f);
054      *dayOfWeek  = bcdToDec(Wire.read());
055      *dayOfMonth = bcdToDec(Wire.read());
056      *month      = bcdToDec(Wire.read());
057      *year       = bcdToDec(Wire.read());
058}
059      
060void setup(){
061Serial.begin(9600);
062byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
063 
064Wire.begin();
065delay (1500); //Ожидание пока экран прогрузится
066Wire.beginTransmission(0x32); //Соединение с экраном по адресе 0x32
067   
068//Посылаем команду Очистка экрана
069Wire.write(0x1b); // esc  
070Wire.write(0x5b); // [
071Wire.write(0x32);
072Wire.write(0x4a);
073//Посылаем команду Отключение курсора
074Wire.write(0x1b); // esc
075Wire.write(0x5b); // [
076Wire.write(0x3f); // ?
077Wire.write(0x32); //2
078Wire.write(0x35); //5
079Wire.write(0x49); //I
080//Посылаем команду Отключение прокрутки
081Wire.write(0x1b); // esc
082Wire.write(0x5b); // [
083Wire.write(0x3f); // ?
084Wire.write(0x32); //2
085Wire.write(0x36); //6
086Wire.write(0x6E); //n
087Wire.endTransmission();
088}
089 
090 
091void loop()
092{
093byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
094getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
095 
096//Разделяем значение Часы, например 13 на 2 символа, 1 и 3
097int H1 = hour/10;
098int H2 = hour-H1*10;
099 
100//Переводим каждую цифру числа 13 в ASCII код
101int h1 = char(H1+'0');
102int h2 = char(H2+'0');
103 
104//Попытка сделать тоже самое но при помощи функции itoa
105int hour1 = hour;
106char buff[6];
107itoa(hour1, buff, 10);
108 
109//Вывод полученных данных на комп, что бы понять, получилось или нет
110Serial.println(hour1);
111Serial.println(buff);
112Serial.println(h1);
113Serial.println(h2);
114 
115//Разделяем значение Минуты
116int M1 = minute/10;
117int M2 = minute-M1*10;
118//Переводим в ASCII код
119int m1 = char(M1+'0');
120int m2 = char(M2+'0');
121 
122//Разделяем значение Секунды
123int S1 = second/10;
124int S2 = second-S1*10;
125//Переводим в ASCII код
126int s1 = char(S1+'0');
127int s2 = char(S2+'0');
128 
129 
130Wire.beginTransmission(0x32);
131         //Переводим курсор на 4 строчку, 1 символо
132         Wire.write(0x1b); // esc
133         Wire.write(0x5b); // [
134         Wire.write(0x30); //4
135         Wire.write(0x3b); //;
136         Wire.write(0x30); //1
137        // Wire.write(0x32); //2
138         Wire.write(0x48); //H
139//Рисуем часы        
140Wire.write(h1);//Отправляем первую цифру числа Часы в ASCCI коде
141Wire.write(h2);//Отправляем вторую цифру числа Часы в ASCCI коде
142Wire.write(":");
143Wire.write(m1);
144Wire.write(m2);
145Wire.write(":");
146Wire.write(s1);
147Wire.write(s2);
148 
149Wire.endTransmission();
150delay(1000);
151    }

 

PIW2004
Offline
Зарегистрирован: 24.09.2013

Удалось победить itoa, оказалось не ту библиотеку вставлял, для Arduino DUE она другая, в итоге удалось запустить родную библиотеку контроллера экрана BV4613, для подключения экрана по I2C.
Удалось даже вывести простой Текст, но возникли 2 новых проблемки:
1)Выводит только латиницу, как можно прикрутить поддержку кириллицы?

2)Удалось вывести только текст, не могу вывести данные из переменной
Для вывода текста используется вот такая команда:

1BV4613.WriteText(0,3,"1221");

А вот так эта команда расписана в библиотеке BV4613.h :

01void BV4613::WriteText(int F,int C,char *Str,int Color)
02 {
03 Cursor_POS(F,C);
04 WriteText(Str,Color);
05 }
06 
07 //-----------------------------------------------------------------------------
08 
09 void BV4613::WriteText(TPointI P,char *Str,int Color)
10 {
11 SET_CursorPixel(P);
12 WriteText(Str,Color);
13 }
14 
15 //-----------------------------------------------------------------------------
16 
17 void BV4613::WriteText(char *Str,int Color)
18 {
19 if (gForeColor!=Color)
20   SET_Inverse();
21 
22 SendI2C((unsigned char *)Str);
23 
24 //esperamos fin comando
25 Wait_ACK();
26 }

 

Насколько я понимаю, Первый вариант, это вывод текста с указанием Строки и Символа, откуда начинать выводить текст.
Второй, это вывод с заданного пикселя.
Третий вариант, это вывод с ранее установленной позиции курсора.

Вопрос, как в строке:

1BV4613.WriteText(0,3,"1221");

 

Вместо 1221 записать переменную?
Если просто вставляю название переменной, то выдаёт ошибку:

 

1ekran_BV4613.ino: In function 'void loop()':
2 ekran_BV4613:110: error: invalid conversion from 'byte' to 'char*'
3 ekran_BV4613:110: error: initializing argument 3 of 'void BV4613::WriteText(int, int, char*, int)'

Причём, в какомм бы формате не была эта переменная, будет выдавать эту ошибку, с изменением лиш from 'int ' to 'char* или from 'char' to 'char*