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





#include "Wire.h"
//#include "BV4613.h"
#include "stdio.h"
#include "stdlib.h"

#define DS1307_I2C_ADDRESS 0x68 //Адрес часов
	 
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
 
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
 
void setDateDs1307(byte second,        // 0-59
                   char minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
	           byte dayOfMonth,    // 1-28/29/30/31
	           byte month,         // 1-12
	           byte year)          // 0-99
{
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.write(0);
 Wire.write(decToBcd(second));    
 Wire.write(decToBcd(minute));
 Wire.write(decToBcd(hour));     
 Wire.write(decToBcd(dayOfWeek));
 Wire.write(decToBcd(dayOfMonth));
 Wire.write(decToBcd(month));
 Wire.write(decToBcd(year));
 Wire.endTransmission();
}
	 
void getDateDs1307(byte *second,
	           byte *minute,
	           byte *hour,
	           byte *dayOfWeek,
	           byte *dayOfMonth,
	           byte *month,
	           byte *year)
{
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.write(0);
 Wire.endTransmission();
	 
 Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
	  *second     = bcdToDec(Wire.read() & 0x7f);
	  *minute     = bcdToDec(Wire.read());
	  *hour       = bcdToDec(Wire.read() & 0x3f); 
	  *dayOfWeek  = bcdToDec(Wire.read());
	  *dayOfMonth = bcdToDec(Wire.read());
	  *month      = bcdToDec(Wire.read());
	  *year       = bcdToDec(Wire.read());
}
	 
void setup(){
Serial.begin(9600);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

Wire.begin();
delay (1500); //Ожидание пока экран прогрузится
Wire.beginTransmission(0x32); //Соединение с экраном по адресе 0x32
  
//Посылаем команду Очистка экрана
Wire.write(0x1b); // esc   
Wire.write(0x5b); // [
Wire.write(0x32);
Wire.write(0x4a);
//Посылаем команду Отключение курсора
Wire.write(0x1b); // esc
Wire.write(0x5b); // [
Wire.write(0x3f); // ?
Wire.write(0x32); //2
Wire.write(0x35); //5
Wire.write(0x49); //I
//Посылаем команду Отключение прокрутки
Wire.write(0x1b); // esc
Wire.write(0x5b); // [
Wire.write(0x3f); // ?
Wire.write(0x32); //2
Wire.write(0x36); //6
Wire.write(0x6E); //n 
Wire.endTransmission();
}


void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

//Разделяем значение Часы, например 13 на 2 символа, 1 и 3
int H1 = hour/10;
int H2 = hour-H1*10;

//Переводим каждую цифру числа 13 в ASCII код
int h1 = char(H1+'0');
int h2 = char(H2+'0');

//Попытка сделать тоже самое но при помощи функции itoa
int hour1 = hour;
char buff[6];
itoa(hour1, buff, 10);

//Вывод полученных данных на комп, что бы понять, получилось или нет
Serial.println(hour1);
Serial.println(buff);
Serial.println(h1);
Serial.println(h2);

//Разделяем значение Минуты
int M1 = minute/10;
int M2 = minute-M1*10;
//Переводим в ASCII код
int m1 = char(M1+'0');
int m2 = char(M2+'0');

//Разделяем значение Секунды
int S1 = second/10;
int S2 = second-S1*10;
//Переводим в ASCII код
int s1 = char(S1+'0');
int s2 = char(S2+'0');


Wire.beginTransmission(0x32);
         //Переводим курсор на 4 строчку, 1 символо
         Wire.write(0x1b); // esc
         Wire.write(0x5b); // [
         Wire.write(0x30); //4
         Wire.write(0x3b); //;
         Wire.write(0x30); //1
        // Wire.write(0x32); //2
         Wire.write(0x48); //H
//Рисуем часы         
Wire.write(h1);//Отправляем первую цифру числа Часы в ASCCI коде
Wire.write(h2);//Отправляем вторую цифру числа Часы в ASCCI коде
Wire.write(":");
Wire.write(m1);
Wire.write(m2);
Wire.write(":");
Wire.write(s1);
Wire.write(s2);

Wire.endTransmission();
delay(1000);
	}

 

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

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

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



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

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



void BV4613::WriteText(int F,int C,char *Str,int Color)
 {
 Cursor_POS(F,C);
 WriteText(Str,Color);
 }

 //-----------------------------------------------------------------------------

 void BV4613::WriteText(TPointI P,char *Str,int Color)
 {
 SET_CursorPixel(P);
 WriteText(Str,Color);
 }

 //-----------------------------------------------------------------------------

 void BV4613::WriteText(char *Str,int Color)
 {
 if (gForeColor!=Color)
   SET_Inverse();

 SendI2C((unsigned char *)Str);

 //esperamos fin comando
 Wait_ACK();
 }

 

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

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



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

 

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

 



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

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