LCD 192x64 по I2C BV4613
- Войдите на сайт для отправки комментариев
Втр, 01/10/2013 - 08:55
Никто не сталкивался с подключением Графического дисплея по I2C? к контролеру прилагается библиотека, но нет примеров самого кода, как её использовать, тоесть как инициализировать дисплей и вывести на него текст.
Уже всю голову сломал, не выходит каменный цветок, может у кого есть примеры скетча, под подобную библиотеку?
Таки удалось запустить данный экран по 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); }Удалось победить itoa, оказалось не ту библиотеку вставлял, для Arduino DUE она другая, в итоге удалось запустить родную библиотеку контроллера экрана BV4613, для подключения экрана по I2C.
Удалось даже вывести простой Текст, но возникли 2 новых проблемки:
1)Выводит только латиницу, как можно прикрутить поддержку кириллицы?
2)Удалось вывести только текст, не могу вывести данные из переменной
Для вывода текста используется вот такая команда:
А вот так эта команда расписана в библиотеке 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(); }Насколько я понимаю, Первый вариант, это вывод текста с указанием Строки и Символа, откуда начинать выводить текст.
Второй, это вывод с заданного пикселя.
Третий вариант, это вывод с ранее установленной позиции курсора.
Вопрос, как в строке:
Вместо 1221 записать переменную?
Если просто вставляю название переменной, то выдаёт ошибку:
Причём, в какомм бы формате не была эта переменная, будет выдавать эту ошибку, с изменением лиш from 'int ' to 'char* или from 'char' to 'char*