Интересно то, что при отрицательных температурах цифра смещена вправо, т.е. не стоит по центру, как в случае с положительными цифрами.
Это потому что цифра с минусом (-4), а минуса в шрифте нет и поэтому там пустое место выводится (пробел) - поэтому и смещается, но без минуса.
Именно об этом я интуитивно догадывался. При двузначных минусовые температурах цифра задевает знак градуса :))) Выход один - надо в библиотеке как-то добавить отсутствующий минус... Пока не знаю как, но попробую.
Спасибо
andriano пишет:
Вообще-то их можно добавить в фонт.
andriano, WaikMan
всё-таки не понимаю, как можно добавить "-" в шрифт BigNumbers. Решил, что в файле DefaultFonts достаточно заменить существующую строку
Потом поменял 0х0D на 0x0E - это же количество символов в шрифте. Однако, так и не увидел "-" при отрицательных температурах :))) чтобы автоматически подтянулся...
Минус должен подтягиваться автоматически при отрицательных температурах ?
Я прописал его поверх пробела перед цифрой. Потом сместил значек градуса вправо.
Но для чего же тогда при низких температурах сделали смещение цифры вправо... ? Оставили бы по центру и было бы нормально.
Вот ведь неприятности с часиками... Задумал следущее: добавить кнопку на порт8 и диод на порт9 (порт с PWM) arduino nano. По часам либо с нажатием кнопки, порт9 активируется (включая свет). И так же по часам или нажатию кнопки порт9 "медлено гаснет" (выключая лампу через Диммер). Вместо лампы временно поставил светодиод, чтобы PWM испытать. Отдельно каждая програмка работали: часики отдельно, кнопка отдельно. Однако, объединив с часми, диод перестал управляться - горит постоянно. Тут уж не до диммера и PWM. Упрощал код, чтобы свою ошибку найти, но...
#define LED 9 // светодиод
#define BUTTON8 8 // кнопка
#include <OLED_I2C.h> // Подключение библиотеки для дисплея
OLED myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[]; // Подключение больших шрифтов
extern uint8_t SmallFont[]; // Подключение маленьких шрифтов
#include <DS1307.h> // Подключение библиотеки для часового модуля
DS1307 rtc(A0, A1);
Time t;
int brightness = 255;
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT); // tell Arduino LED is an output
pinMode(BUTTON8, INPUT); // and BUTTON is an input
// myOLED.begin();
rtc.halt(false);
// rtc.setDOW(MONDAY); // Настройка дня недели
// rtc.setTime(12, 0, 0); // Настройка времени
// rtc.setDate(16, 11, 2015); // Настройка даты
}
void loop(){
if (digitalRead(BUTTON8) == HIGH) // Управление светом
{
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
}
}
нашел, что если строку // myOLED.begin(); сделать коментарием, то это позволяет вернуть функцию кнопки и диода, но тогда часики не работают.
Нет, порт8 на nano чисто случайно выбрал под кнопку. Дисплей физически к нему никак... не подключен. Сейчас глянул на распиновку nano... полагаю, он специфичный... стоило внимательнее выбирать. Уже выбрал другой порт и вроде как работает. Мои ИЗВИНЕНИЯ....
нот полоска то была то проподала, потом появилась и горит ... питание +5в с ардуины пробывал другие ардуины тоже самое ..... горит сразу после инициализации
Добрый день. а подскажите как можно погасить этот дисплей, в случае простоя. я думаю его отключать по питанию через транзистор. но может это можно реализовать стандартными средствами управления дисплеем, или может можно подключить к цифровому порту и включать его HIGHT
Интересует четыре числа сразу после фигурных скобок и как идет выборка конкретного элемента, по номеру строки или по символам в конце строки??? можно ли добавить вручную символ, что в результате изменится из четырех чисел и как потом вызвать конкретный символ.
Интересует четыре числа сразу после фигурных скобок и как идет выборка конкретного элемента, по номеру строки или по символам в конце строки??? можно ли добавить вручную символ, что в результате изменится из четырех чисел и как потом вызвать конкретный символ.
В тех числах размер символа - высота и ширина в пикселях. И ещё шото маловажное - может число символов в таблице, не помню точно, я всегда обходился без них. Выборка по смешению в таблице.
Интересует четыре числа сразу после фигурных скобок и как идет выборка конкретного элемента, по номеру строки или по символам в конце строки??? можно ли добавить вручную символ, что в результате изменится из четырех чисел и как потом вызвать конкретный символ.
В тех числах размер символа - высота и ширина в пикселях. И ещё шото маловажное - может число символов в таблице, не помню точно, я всегда обходился без них. Выборка по смешению в таблице.
Спасибо, я уже частично сам с цефирями разобрался, например: MegaNumbers[] первые две соответствуют размеру шрифта, т.е. 0х18,0х28, соответствует шрифту 24х40, далее 0х2D - 45 ? так пока и не понял что сие означает, а завершает четверку 0x0D - 13, что соответствует количеству символов в данном шрифте.
PaulIV пишет:
Но для чего же тогда при низких температурах сделали смещение цифры вправо... ? Оставили бы по центру и было бы нормально.
Пробовал заменить пробел на "-", в часах начало двоеточие меняться с минусом. Что интересно «:» вызывается символом «/», а "-" выводится по пробелу. Для осознания отсутствия минуса и сдвига вправо при выводе отрицательных температур нужно курить в сторону формирования вывода температуры. Скорее всего в обработку температуры попадает признак минусовой температуры и это не правильно обрабатывается, в результате возникает коллизия при выводе и на экран выводится пустое место, а затем температура.
Хотелось бы разобраться в формировании самого шрифта и его последующей обработки при выводе на OLED. Может кто даст ссылку на данные темы? К сожалению, по статье http://arduino-project.net/kak-sozdat-svoi-shrifty-tft/, создать шрифты у меня не получилось, что делаю ни так не пойму. Ссылка на видео по этой статье не работает :(.
Интересует четыре числа сразу после фигурных скобок и как идет выборка конкретного элемента, по номеру строки или по символам в конце строки??? можно ли добавить вручную символ, что в результате изменится из четырех чисел и как потом вызвать конкретный символ.
1. По очереди: ширна символа в пикселях, высота символа в пикселях, смещение (ASCII код) первого символа в таблице, количество символов в таблице.
2. Ни номер строки, ни символы в конце строки вообще ни при чем. Таблица знекогенератора - массив. При записи в тексте программы этот массив может быть разбит на строки как угодно и на работу программы это ни коми образом не скажется. Смещение в массиве вычисляется на основании кода ASCII символа и первых трех чисел в заголовке. Примерно так: смещение_нужного_символа = (код_символа - смещение_начала_таблицы)*(высота_символа*ширина_символа/количество_битов_в_байте)
Спасибо andriano, попробую разобраться. По крайней мере понял почему 0х2d. Если не затруднит прокоментируйте мои суждения. Я так понимаю, что при работе скетча просто берется выводимый мною символ в соответствии с кодом ASCII. Например в скетче я пишу "/" при обработке он преобразуется в вид 0х2F который всталяется в формулу и в последствии высчитывается его положение в массиве и т.д. Применительно к шрифту (скорее к массиву с определённым наборо символов) BigNumbers из DefaultFonts.c к библиотеке OLED_I2C.h это будет выглядеть так: (0x2f-0x2d)*(0x18*0x0e/0x08)=0x54. Именно начиная с 85 (DEC) элемента массива и начинается фрагмент "/", и используется для него 42 элемента в массиве, а затем идет другой.
От сюда рождается вывод, что-бы вывести правильно разного рода "-", "=", "+" и т.д. нужно создать знаки (начертить) в соответствии с кодировкой расширить массив символов с 13 до 26 и тогда он будет содержать все символы ASCII начиная 0x20 (пробел) и оканчивая 0x39 ("9"). "Заголовок" массива в этом случае теперь должен выглядеть так: {0x0e, 0x18, 0x20, 0x1a, ....................}
просто берется выводимый мною символ в соответствии с кодом ASCII. Например в скетче я пишу "/" при обработке он преобразуется в вид 0х2F
Никакого преобразования не происходит. Символ "/" изначально (согласно стандарту, придуманному американцами во времена изобретения телеграфа) имеет код 47 - десятичный или 2F - шестнадцатиричный. А шестнадцатеричные числа я языках с С/С++ записываются с префиксом "0х".
Цитата:
который всталяется в формулу и в последствии высчитывается его положение в массиве и т.д. Применительно к шрифту (скорее к массиву с определённым наборо символов) BigNumbers из DefaultFonts.c к библиотеке OLED_I2C.h это будет выглядеть так: (0x2f-0x2d)*(0x18*0x0e/0x08)=0x54. Именно начиная с 85 (DEC) элемента массива и начинается фрагмент "/", и используется для него 42 элемента в массиве, а затем идет другой.
Возможно, и я не совсем точно выразился. В массиве знакогенератора присутствует заголовок (упомянутые 4 байта) и блок данных. Смещение - не с начала массива, а с начала блока данных, т.е. нужно пропустить еще 4 байта заголовка.
Цитата:
От сюда рождается вывод, что-бы вывести правильно разного рода "-", "=", "+" и т.д. нужно создать знаки (начертить) в соответствии с кодировкой расширить массив символов с 13 до 26 и тогда он будет содержать все символы ASCII начиная 0x20 (пробел) и оканчивая 0x39 ("9"). "Заголовок" массива в этом случае теперь должен выглядеть так: {0x0e, 0x18, 0x20, 0x1a, ....................}
Всего символов ASCII 95 штук (а не 26), и, кстати, этот факт можно проследить по другим (более мелким) фонтам, которые содержат как раз 95 символов. Еще в кодовую таблицу входят 33 управляющих кода: от 0 до 31 и 127, но на экране (и бумаге) они не отображаются, а потому в знакогенератор не входят.
И в заключение еще 2 замечания:
1. Знакогненераторы для крупных символов требуют для довольно большого объема памяти для хранения. Поэтому в ряде особо крупных фонтов разработчик ограничил допустимое количество символов тринадцатью. Прежде, чем расширять таблицы, посчитайте, хватит ли у Вас для них памяти.
2. Если мне не изменяет память, разработчик несколько видоизменил таблицу ASCII для "больших" фонтов, заменив начертание одного из тринадцати символа на начертание другого.
andriano Спасибо за комментарий. Я имел ввиду не количество символов в таблице а расширение масива шрифтов с 13 до 26 элементов что-бы расширить кол-во символов.
В принципе мне просто нужно было понять как при необходимости внести свои коррективы в шрифты. Редактирование на коленке я уже освоил, правда дедовским методом. Рисую символы ручками на сетке в Exele. Потом формирую код и вставляю код символа в масив. Пока эксперементировал, осознал, что всю имеющуюся графику присутствующую в проекте часы-термометр можно запросто нарисовать в размерах MegaNumbers шрифта и выглядеть это будет нормально.
1. Существуют программы, которые позволяют самому нарисовать фонт нужного размера или подкорректировать существующий. Сам ими не пользовался.
2. Графику лучше выводить как графику, а не как символы. Для вывода графики существуют специальные процедуры в библиотеке - ими лучше и пользоваться. Тем более, что размер битмапа можно сделать, какой нужно, не привязываясь к размеру того или иного фонта.
Использовал русский шрифт, так-то нормально, но например температуру вывожу через перемнную с датчика в виде 23.7 и получается что вместо точки баква ю. И значение температуры (или влажности) имеет вид 23ю7
Использовал русский шрифт, так-то нормально, но например температуру вывожу через перемнную с датчика в виде 23.7 и получается что вместо точки баква ю. И значение температуры (или влажности) имеет вид 23ю7
Нужно убедиться, что в шрифтах вообще есть точка. Используй для вывода цифр "цифровой шрифт", там точка точно должна быть, а вообще проблема обсуждалась выше. Я долго не мог понять как вообще эти шрифты устроены.
Библиотеки Adafruit_SSD1306 и Adafruit ( Adafruit_GFX.h ) установлены. Пробовал все демо запускать из Adafruit_SSD1306 (ssd1306_128x64_i2c.ino ) запустить - не получается. При компиляции выдает ошибку и выделяет строку #error("Height incorrect, please fix Adafruit_SSD1306.h!");
Не могли бы Вы дать инструкцию по сосзданию собственных шрифтов и символов под этот экранчик. Находил инструкцию для utft с екселевским файликом для упрощения составления символов, но не получилось - символ не тот получается.
Приобрел данный дисплей, скачал библиотеки, но них..я не работает брал отсюда: http://www.youtube.com/watch?v=niA3aPu3-dQ&index=9&list=UU7aH7HVqDvwB1xN... может библиотеки кривые может этот голый мужик пиз...ит. Но ничего не работает, все обшарил. Вот ошибки при компиляции: E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp: In constructor 'RobotControl::RobotControl()': E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'LCD_CS' was not declared in this scope E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'DC_LCD' was not declared in this scope E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'RST_LCD' was not declared in this scope E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp: In member function 'void RobotControl::begin()': E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXA' was not declared in this scope E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXB' was not declared in this scope E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXC' was not declared in this scope E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXD' was not declared in this scope E:\arduino-1.0.5-r2\libraries\Robot_Control\ArduinoRobot.cpp:19: error: 'MUX_IN' was not declared in this scope Помогите ради христа, очень надо. Заранее благодарю
LCD_CS RST_LCD DC_LCD MUXA MUXB MUX_IN' в начало скетчя и в начало int
myOLED.clrScr(); // Стираем все с дисплея
myOLED.setBrightness(10); //Устанавливаем яркость дисплея (в скобрах ставим число от 0 до 255)
if(digitalRead(Pinknopka) == HIGH && flag==0) //если кнопка нажата и перемення flag равна 0 , то ...
{
mkmstranica_displeya++;
flag=1; //это нужно для того что бы с каждым нажатием кнопки происходило только одно действие плюс 100% защита от "дребезга кнопки"
if(mkmstranica_displeya > 4)//ограничим количество страниц
{
mkmstranica_displeya=1; //так как мы используем только одну кнопку то переключать страницы будем циклично
}
}
if(digitalRead(Pinknopka) == LOW && flag==1) //если кнопка НЕ нажата и переменная flag = 1, то ...
{
flag=0; //обнуляем переменную "knopka"
}
if(mkmstranica_displeya == 1)//первая страница
{
myOLED.setFont(RusFont);
myOLED.print("NTVGTHFNEHF YF EKBWT", CENTER, 0);
//myOLED.setFont(MegaNumbers);
myOLED.setFont(BigNumbers);
myOLED.print(String(temp1,2), CENTER, 12);
}
if(mkmstranica_displeya ==2 )//вторая страница
{
myOLED.setFont(RusFont);
myOLED.print("NTVGTHFNEHF GJUHT<F", CENTER, 0);
myOLED.setFont(RusFont);
myOLED.print("Yf ekbwt ", CENTER, 12);
myOLED.setFont(SmallFont);
myOLED.print(String(temp1,2), 86, 12);
myOLED.print("~C", 116, 12);
myOLED.setFont(RusFont);
myOLED.print("Ljvf ", CENTER, 22);
myOLED.setFont(SmallFont);
myOLED.print(String(temp2,2), 86, 22);
myOLED.print("~C", 116, 22);
myOLED.setFont(RusFont);
myOLED.print("D gjuht,t ", CENTER, 32);
myOLED.setFont(SmallFont);
myOLED.print(String(temp3,2), 86, 32);
myOLED.print("~C", 116, 32);
myOLED.setFont(RusFont);
myOLED.print("Lfnxbr LYN-22 ", LEFT, 42);
myOLED.setFont(SmallFont);
myOLED.print(String(t1,2), 86, 42);
myOLED.print("~C", 116, 42);
}
if(mkmstranica_displeya==3)//третья страница
{
myOLED.setFont(RusFont);
myOLED.print("YFCNHJQRB", CENTER, 0);
myOLED.print("Gjllth;. ntgth. - ", CENTER, 12);
myOLED.setFont(SmallFont);
}
if(mkmstranica_displeya==4)//четвертая страница
{
// myOLED.setFont(RusFont);
// myOLED.print("Ntvgthfnehf", CENTER, 0);
}
Вы так хорошо всё знаете, подскажите пожалуйста.
За основу взял код ваших часов.
Но захотел сделать одну вещь, добавил кнопку (тоже код чей то взял)
Все работает так как мне надо, НО если я:
1) Добавляю строки с выводом чего то в монитор порта
2) Или расскоментирую последние две строки в приведенном выше куске кода
Всё капец, на дисплее отображается всё, кроме показаний температуры. абсолютно везде, на любой "странице" дисплея.
размер скетча 21878 из 30720
serial.begin(9600) пробывал увеличивать, думал из-за этого.
Всем приветы, не знаю почему, но у меня библиотека OLED_I2C не работает с моим экраном 1.3" OLED I2C
На экране примерно такое содержание при заливке скетча в Mega2560
Как видно, исполльзуется только несколько строк на экране, остальная часть в мусоре памяти.
Если использовать библиотеку u8glib и раскоментировать там строки ssd1306 или sh1106 то на экране отображается нормально читаемая информация. Перепроверил листинг инициализации в OLED_i2C всё соотвествует строкам в u8glib, но работать не хочет.
У меня картина один в один. заказал с китая три дисплея 1.3", все три так показывают. Причем 0,96" и 1.54" дисплеи показывают нормально. Библиотеки пробовал три штуки OLED_I2C Adafruit и OzOLED из них Адафрукт показывает, но кверхногами и всеравно сдвинуто в бок. :(
Контроллер может и другой, вот только под STM32 перековырянная библиотека от ардуино, работает отлично, если использовать инструкции для контроллера SSD1306.
двухцветный. Проблема такая что по оси x пиксели высвечиваются одна возле одной все четко в линию, а вот по оси y высвечиваются через пиксель как бы линия одна засвечена потом пропуск и опять есть . Кстати при отправке дисплею данные "0xFF" высвечиваются только 4 бита из 8 через один! Что это такой дисплей или я как-то не так с прогой намудрил.!? Дисплейчик подключен к меге328р типа мини ардуинка. Пробовал все библы все равно также. Что это, кто что знает!?
Перепробовал все библы от всех, все так же само! Вопрос, можно ли переключить/паять под spi интерфейс, там же только резисторы нужно правильно перепаять?
у меня не заработала(( но экран заработал через SPI интерфейс (
А как подключать по SPI? там же вроде разводки нет... Может и у меня тоже получится переделать.
я тестером померял вроде есть разводка
экран - ардуина уно
CS - D12
RES - D13
D/C - D11
SCL - D10
SDA - D9
GRN - GRN
VCC - +5v
библа адафруит SPI
Добрый вечер, а как насчет подключения такого дисплея KCS057QV1AJ-G23? Реально это сделать? Подключить к ардуино уно
Интересно то, что при отрицательных температурах цифра смещена вправо, т.е. не стоит по центру, как в случае с положительными цифрами.
Это потому что цифра с минусом (-4), а минуса в шрифте нет и поэтому там пустое место выводится (пробел) - поэтому и смещается, но без минуса.
Именно об этом я интуитивно догадывался. При двузначных минусовые температурах цифра задевает знак градуса :))) Выход один - надо в библиотеке как-то добавить отсутствующий минус... Пока не знаю как, но попробую.
Спасибо
Вообще-то их можно добавить в фонт.
andriano, WaikMan
всё-таки не понимаю, как можно добавить "-" в шрифт BigNumbers. Решил, что в файле DefaultFonts достаточно заменить существующую строку
PaulIV, Вы уверены, что Вам нужен именно BigNumbers, а не MegaNumbers?
а никто не встречался с таким багом? уже второй экран - полоска все время горит слева...
PaulIV, Вы уверены, что Вам нужен именно BigNumbers, а не MegaNumbers?
Браво adriano!
Невнимательность. Сейчас добавил (не менял количество символов 0х0D) и увидел этот "-", где ":" (они сменяли друг друга...
fontdatatype MegaNumbers[] PROGMEM =
Всем привет.
Вот ведь неприятности с часиками... Задумал следущее: добавить кнопку на порт8 и диод на порт9 (порт с PWM) arduino nano. По часам либо с нажатием кнопки, порт9 активируется (включая свет). И так же по часам или нажатию кнопки порт9 "медлено гаснет" (выключая лампу через Диммер). Вместо лампы временно поставил светодиод, чтобы PWM испытать. Отдельно каждая програмка работали: часики отдельно, кнопка отдельно. Однако, объединив с часми, диод перестал управляться - горит постоянно. Тут уж не до диммера и PWM. Упрощал код, чтобы свою ошибку найти, но...
нашел, что если строку // myOLED.begin(); сделать коментарием, то это позволяет вернуть функцию кнопки и диода, но тогда часики не работают.
Почему это так?
А как Вы используете 8-й пин?
Вы его пытаетесь использовать и для инициализации дисплея, и для кнопки.
Нет, порт8 на nano чисто случайно выбрал под кнопку. Дисплей физически к нему никак... не подключен. Сейчас глянул на распиновку nano... полагаю, он специфичный... стоило внимательнее выбирать. Уже выбрал другой порт и вроде как работает. Мои ИЗВИНЕНИЯ....
И спасибо, что откликаетесь на вопросы.
полоска все время горит слева...
так там и справа, симетрично, полоска вроде, на бантике самки микимауса просматривается хороше. Это сразу после сброса такое? Питание нормальное?
Нет, порт8 на nano чисто случайно выбрал под кнопку. Дисплей физически к нему никак... не подключен.
Аппаратно - да, а программно?
У Вас в коде есть строчка:
Это значит, Вы сообщаете библиотеке дисплея, что пин 8 предназначен ему и он может поступать с ним, как ему заблагорассудится.
А потом этот же пин (которым распоряжается библиотека дисплея) пытаетесь использовать под кнопку. Отсюда и закономерный результат.
Andriano,
СПАСИБО за пояснения, взял другой порт, сейчас всё намного лучше :) сам виноват
Удачи
Дело не в том, кто виноват, а в осознании того факта, что "распиновка нано" совсем не так специфична.
не справа вроде норм
нот полоска то была то проподала, потом появилась и горит ... питание +5в с ардуины пробывал другие ардуины тоже самое ..... горит сразу после инициализации
Добрый день. а подскажите как можно погасить этот дисплей, в случае простоя. я думаю его отключать по питанию через транзистор. но может это можно реализовать стандартными средствами управления дисплеем, или может можно подключить к цифровому порту и включать его HIGHT
to shved86
Добрый день. Я считаю, что будет достаточно просто очистить экран
myOLED.clrScr();
myOLED.update(); и после этого ни чего на него не выводить, он должен оставаться темным.
Добрый день. Помогите разобраться с данной конструкцией :
fontdatatype BigNumbers[] PROGMEM =
Интересует четыре числа сразу после фигурных скобок и как идет выборка конкретного элемента, по номеру строки или по символам в конце строки??? можно ли добавить вручную символ, что в результате изменится из четырех чисел и как потом вызвать конкретный символ.
В тех числах размер символа - высота и ширина в пикселях. И ещё шото маловажное - может число символов в таблице, не помню точно, я всегда обходился без них. Выборка по смешению в таблице.
Интересует четыре числа сразу после фигурных скобок и как идет выборка конкретного элемента, по номеру строки или по символам в конце строки??? можно ли добавить вручную символ, что в результате изменится из четырех чисел и как потом вызвать конкретный символ.
В тех числах размер символа - высота и ширина в пикселях. И ещё шото маловажное - может число символов в таблице, не помню точно, я всегда обходился без них. Выборка по смешению в таблице.
Спасибо, я уже частично сам с цефирями разобрался, например: MegaNumbers[] первые две соответствуют размеру шрифта, т.е. 0х18,0х28, соответствует шрифту 24х40, далее 0х2D - 45 ? так пока и не понял что сие означает, а завершает четверку 0x0D - 13, что соответствует количеству символов в данном шрифте.
Но для чего же тогда при низких температурах сделали смещение цифры вправо... ? Оставили бы по центру и было бы нормально.
Пробовал заменить пробел на "-", в часах начало двоеточие меняться с минусом. Что интересно «:» вызывается символом «/», а "-" выводится по пробелу. Для осознания отсутствия минуса и сдвига вправо при выводе отрицательных температур нужно курить в сторону формирования вывода температуры. Скорее всего в обработку температуры попадает признак минусовой температуры и это не правильно обрабатывается, в результате возникает коллизия при выводе и на экран выводится пустое место, а затем температура.
Хотелось бы разобраться в формировании самого шрифта и его последующей обработки при выводе на OLED. Может кто даст ссылку на данные темы? К сожалению, по статье http://arduino-project.net/kak-sozdat-svoi-shrifty-tft/, создать шрифты у меня не получилось, что делаю ни так не пойму. Ссылка на видео по этой статье не работает :(.
Переведите хекс в двоичную систему и будет понятнее
1. По очереди: ширна символа в пикселях, высота символа в пикселях, смещение (ASCII код) первого символа в таблице, количество символов в таблице.
2. Ни номер строки, ни символы в конце строки вообще ни при чем. Таблица знекогенератора - массив. При записи в тексте программы этот массив может быть разбит на строки как угодно и на работу программы это ни коми образом не скажется. Смещение в массиве вычисляется на основании кода ASCII символа и первых трех чисел в заголовке. Примерно так: смещение_нужного_символа = (код_символа - смещение_начала_таблицы)*(высота_символа*ширина_символа/количество_битов_в_байте)
Спасибо andriano, попробую разобраться. По крайней мере понял почему 0х2d. Если не затруднит прокоментируйте мои суждения. Я так понимаю, что при работе скетча просто берется выводимый мною символ в соответствии с кодом ASCII. Например в скетче я пишу "/" при обработке он преобразуется в вид 0х2F который всталяется в формулу и в последствии высчитывается его положение в массиве и т.д. Применительно к шрифту (скорее к массиву с определённым наборо символов) BigNumbers из DefaultFonts.c к библиотеке OLED_I2C.h это будет выглядеть так: (0x2f-0x2d)*(0x18*0x0e/0x08)=0x54. Именно начиная с 85 (DEC) элемента массива и начинается фрагмент "/", и используется для него 42 элемента в массиве, а затем идет другой.
От сюда рождается вывод, что-бы вывести правильно разного рода "-", "=", "+" и т.д. нужно создать знаки (начертить) в соответствии с кодировкой расширить массив символов с 13 до 26 и тогда он будет содержать все символы ASCII начиная 0x20 (пробел) и оканчивая 0x39 ("9"). "Заголовок" массива в этом случае теперь должен выглядеть так: {0x0e, 0x18, 0x20, 0x1a, ....................}
Я так понимаю, что при работе скетча
О каком скетче идет речь, не знаю.
просто берется выводимый мною символ в соответствии с кодом ASCII. Например в скетче я пишу "/" при обработке он преобразуется в вид 0х2F
Никакого преобразования не происходит. Символ "/" изначально (согласно стандарту, придуманному американцами во времена изобретения телеграфа) имеет код 47 - десятичный или 2F - шестнадцатиричный. А шестнадцатеричные числа я языках с С/С++ записываются с префиксом "0х".
который всталяется в формулу и в последствии высчитывается его положение в массиве и т.д. Применительно к шрифту (скорее к массиву с определённым наборо символов) BigNumbers из DefaultFonts.c к библиотеке OLED_I2C.h это будет выглядеть так: (0x2f-0x2d)*(0x18*0x0e/0x08)=0x54. Именно начиная с 85 (DEC) элемента массива и начинается фрагмент "/", и используется для него 42 элемента в массиве, а затем идет другой.
Возможно, и я не совсем точно выразился. В массиве знакогенератора присутствует заголовок (упомянутые 4 байта) и блок данных. Смещение - не с начала массива, а с начала блока данных, т.е. нужно пропустить еще 4 байта заголовка.
От сюда рождается вывод, что-бы вывести правильно разного рода "-", "=", "+" и т.д. нужно создать знаки (начертить) в соответствии с кодировкой расширить массив символов с 13 до 26 и тогда он будет содержать все символы ASCII начиная 0x20 (пробел) и оканчивая 0x39 ("9"). "Заголовок" массива в этом случае теперь должен выглядеть так: {0x0e, 0x18, 0x20, 0x1a, ....................}
Всего символов ASCII 95 штук (а не 26), и, кстати, этот факт можно проследить по другим (более мелким) фонтам, которые содержат как раз 95 символов. Еще в кодовую таблицу входят 33 управляющих кода: от 0 до 31 и 127, но на экране (и бумаге) они не отображаются, а потому в знакогенератор не входят.
И в заключение еще 2 замечания:
1. Знакогненераторы для крупных символов требуют для довольно большого объема памяти для хранения. Поэтому в ряде особо крупных фонтов разработчик ограничил допустимое количество символов тринадцатью. Прежде, чем расширять таблицы, посчитайте, хватит ли у Вас для них памяти.
2. Если мне не изменяет память, разработчик несколько видоизменил таблицу ASCII для "больших" фонтов, заменив начертание одного из тринадцати символа на начертание другого.
andriano Спасибо за комментарий. Я имел ввиду не количество символов в таблице а расширение масива шрифтов с 13 до 26 элементов что-бы расширить кол-во символов.
В принципе мне просто нужно было понять как при необходимости внести свои коррективы в шрифты. Редактирование на коленке я уже освоил, правда дедовским методом. Рисую символы ручками на сетке в Exele. Потом формирую код и вставляю код символа в масив. Пока эксперементировал, осознал, что всю имеющуюся графику присутствующую в проекте часы-термометр можно запросто нарисовать в размерах MegaNumbers шрифта и выглядеть это будет нормально.
Нашел удобную таблицу ASCII, может кому пригодится http://foxtools.ru/ASCII#1251
1. Существуют программы, которые позволяют самому нарисовать фонт нужного размера или подкорректировать существующий. Сам ими не пользовался.
2. Графику лучше выводить как графику, а не как символы. Для вывода графики существуют специальные процедуры в библиотеке - ими лучше и пользоваться. Тем более, что размер битмапа можно сделать, какой нужно, не привязываясь к размеру того или иного фонта.
Использовал русский шрифт, так-то нормально, но например температуру вывожу через перемнную с датчика в виде 23.7 и получается что вместо точки баква ю. И значение температуры (или влажности) имеет вид 23ю7
Библиотеку качал с 29-го топика http://arduino.ru/forum/programmirovanie/pomogite-razobratsya-s-displeem-oled-lcd-display-i2c-096-iic-serial-128x64#comment-106052
Использовал русский шрифт, так-то нормально, но например температуру вывожу через перемнную с датчика в виде 23.7 и получается что вместо точки баква ю. И значение температуры (или влажности) имеет вид 23ю7
Библиотеку качал с 29-го топика http://arduino.ru/forum/programmirovanie/pomogite-razobratsya-s-displeem-oled-lcd-display-i2c-096-iic-serial-128x64#comment-106052
Нужно убедиться, что в шрифтах вообще есть точка. Используй для вывода цифр "цифровой шрифт", там точка точно должна быть, а вообще проблема обсуждалась выше. Я долго не мог понять как вообще эти шрифты устроены.
Для дисплея OLED LCD Display Module I2C 0.96
Подскажите, где взять или как сделать шрифт крупне примерно в 2 раза чем SmallFont?
Дисплей OLED LCD Display Module I2C 0.96 работает с библиотекой OLED_I2C (вот этот дисплей http://ru.aliexpress.com/item/New-0-96-I2C-IIC-Serial-128X64-OLED-LCD-LED-Display-Module-For-Arduino-55785/32357566914.html )
Возможно ли запустить его библиотекой от Adafult?
Библиотеки Adafruit_SSD1306 и Adafruit ( Adafruit_GFX.h ) установлены. Пробовал все демо запускать из Adafruit_SSD1306 (ssd1306_128x64_i2c.ino ) запустить - не получается. При компиляции выдает ошибку и выделяет строку #error("Height incorrect, please fix Adafruit_SSD1306.h!");
А что делать тем, у кого spi дисплей, но тоже хочется русский?
Что за spi дисплей? он же не один в мире.
Посмотрите, может эта статья поможет с русским
http://radiomanoff.at.ua/index/st7920_u8glib_spi_avrstudio_russifikacija...
Использовать русифицированную библиотеку Adafruit-GFX:
http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...
Приветствую.
Относится данная просьба к автору поста №107
Не могли бы Вы дать инструкцию по сосзданию собственных шрифтов и символов под этот экранчик. Находил инструкцию для utft с екселевским файликом для упрощения составления символов, но не получилось - символ не тот получается.
Возникла еще одна непонятка. Речь идет о русификации библиотеки adafruit gfx, а я использую adafruit sd 1306. В чем их отличие?
Adafruit-GFX является основной библиотекой для дисплеев и другие библиотеки Adafruit пользуются её возможностями, в том числе и Adafruit-SSD1306.
LCD_CS RST_LCD DC_LCD MUXA MUXB MUX_IN' в начало скетчя и в начало int
Вы так хорошо всё знаете, подскажите пожалуйста.
За основу взял код ваших часов.
Но захотел сделать одну вещь, добавил кнопку (тоже код чей то взял)
Все работает так как мне надо, НО если я:
1) Добавляю строки с выводом чего то в монитор порта
2) Или расскоментирую последние две строки в приведенном выше куске кода
Всё капец, на дисплее отображается всё, кроме показаний температуры. абсолютно везде, на любой "странице" дисплея.
размер скетча 21878 из 30720
serial.begin(9600) пробывал увеличивать, думал из-за этого.
Подскажите, что еще может быть? Куда копать?
1. Кроме размера кода неплохо бы контролировать размер занятой оперативной памяти.
2. В программировании принято нумеровать, начиная с 0 , а не с 1. ПРоверьте, что страницы нумеруются именно от 1 до 4, а не от 0 до 3.
1. Кроме размера кода неплохо бы контролировать размер занятой оперативной памяти.
2. В программировании принято нумеровать, начиная с 0 , а не с 1. ПРоверьте, что страницы нумеруются именно от 1 до 4, а не от 0 до 3.
Второе точно отпадает, работает как нужно. Хоть и начинается не с нуля.
А вот по поводу первого спасибо. Использова 1.0.6, там про память ничего не выводится. Поставил последнюю 1.6.8 сразу выдало
Я бы начал с того, что перенес все текстовые константы в PROGMEM.
Вероятно также, что 1кбайт из двух занимает экранный буфер дисплея.
у меня в моем проекте код занимает 32250 байт из 32256 в уне
и память на 95% при этом все ровно работает ))
ищите гдето утечку, обращение к массиву большему чем задикларированному
типа обьявлено int i[10]; а обращение к i[10] даст похожий эффект
пс
и уходите от типов String, этот тип тащит за собой большую библиотеку....
используйте массивы чаров
Всем приветы, не знаю почему, но у меня библиотека OLED_I2C не работает с моим экраном 1.3" OLED I2C
На экране примерно такое содержание при заливке скетча в Mega2560
Как видно, исполльзуется только несколько строк на экране, остальная часть в мусоре памяти.
Если использовать библиотеку u8glib и раскоментировать там строки ssd1306 или sh1106 то на экране отображается нормально читаемая информация. Перепроверил листинг инициализации в OLED_i2C всё соотвествует строкам в u8glib, но работать не хочет.
У меня картина один в один. заказал с китая три дисплея 1.3", все три так показывают. Причем 0,96" и 1.54" дисплеи показывают нормально. Библиотеки пробовал три штуки OLED_I2C Adafruit и OzOLED из них Адафрукт показывает, но кверхногами и всеравно сдвинуто в бок. :(
Ожил дисплей, но только с библиотекой MicroLCD
https://github.com/stanleyhuangyc/MultiLCD/tree/master/MicroLCD
насколько я помню, в 1.3" OLED стоит другой контроллер, не SSD1306.
Как в MicroLCD дела с кириллицей и загрузкой своих шрифтов?
Контроллер может и другой, вот только под STM32 перековырянная библиотека от ардуино, работает отлично, если использовать инструкции для контроллера SSD1306.
Привет всем!
Купил дисплейчик OLED 128 x 64 , чип Ssd1306
двухцветный. Проблема такая что по оси x пиксели высвечиваются одна возле одной все четко в линию, а вот по оси y высвечиваются через пиксель как бы линия одна засвечена потом пропуск и опять есть . Кстати при отправке дисплею данные "0xFF" высвечиваются только 4 бита из 8 через один! Что это такой дисплей или я как-то не так с прогой намудрил.!? Дисплейчик подключен к меге328р типа мини ардуинка. Пробовал все библы все равно также. Что это, кто что знает!?
попробуй в библиотеке указать другой контроллер из серии SSD13xx.
Перепробовал все библы от всех, все так же само! Вопрос, можно ли переключить/паять под spi интерфейс, там же только резисторы нужно правильно перепаять?