Создание собственных шрифтов для u8glib

Оглавление

Библиотеки для экранов, индикаторов и дисплеев

Библиотека I2C

Библиотека, предназначенная для работы периферийного устройства по протоколу I2C.

Пример использования:

#ifndef I2C_MASTER_H

#define I2C_MASTER_H

void I2C_init (void) – создание объекта, настройка на правильную частоту для шины.

uint8_t I2C_start () – установка соединения с новым устройством.

uint8_t I2C_write() – запись данных на текущее устройство.

uint8_t I2C_read_ack() – считывание байта с устройства, запрос следующего байта.

Библиотека  LiquidCrystal

Стандартная библиотека, установленная в Arduino IDE. Предназначена для управления жидкокристаллическими дисплеями LCD.

Пример использования:

#include <LiquidCrystal.h>. Также, чтобы не ошибиться при написании, можно подключить через меню Sketch – Import Library – LiquidCrystal.

Конструктор класса –  LiquidCristal(…). Аргументами являются rs, rw, en, do…d7. Первые 3 соответствую выводам сигналов RS, RW и Enable. Выводы d соответствуют номерам шин данных, к которым подключен дисплей.

void begin(cols, rows) – метод, который инициализирует интерфейс дисплея. Аргументами являются количество знаков в строке (cols) и число строк (rows). Этот метод должен задаваться первым.

void createChar(num, data) – метод, необходимый для создания пользовательских символов.

Библиотека UTFT

Стандартная библиотека, необходимая для работы Ардуино с TFT экранами разных типов. Все поддерживаемые дисплеи представлены в сопроводительном документе с библиотекой.

Пример использования:

#include <UTFT.h>

UTFT(); – создание экземпляра UTFT.

textRus(char*st, int x, int y); – метод, позволяющий выводить строку из указателя. Например, char *dht = “Температура,С”;

textRus(string st, int x, int y); – вывод строки с указанием в параметре. Например, g.textRus(“Температура, С”, 0, 20);

Библиотека LedControl

Позволяет управлять семисегментными дисплеями, объединять массив из светодиодов в одну матрицу.

Пример использования:

#include <LedControl.h>

LedControl  lc1= LedControl( );

– требуется для инициализации библиотеки. Должна состоять из четырех аргументов – номера пинов, к которым подключен дисплей (первые 3 аргумента) и количество подключенных чипов.

writeArduinoOn7Segment() – отображение на дисплее всех чисел от 0 до 15. Использует функции setChar() для символов a и d и setRow() для создания макета пропущенных символов.

LedControl.shutdown() – отключение изображения.

setIntensity() – контроль яркости.

Framebuffer callback¶

Each display type can be initialized to provide the framebuffer contents in run-length encoded format to a Lua callback. This mode is enabled when a callback function is specified for the setup function. Hardware display and framebuffer callback can be operated in parallel. If the callback function is the only parameter then no signals for a hardware display are generated, leaving a virtual display.

The callback function can be used to process the framebuffer line by line. It’s called with either as parameter to indicate the start of a new frame or with a string containing a line of the framebuffer with run-length encoding. First byte in the string specifies how many pairs of (x, len) follow, while each pair defines the start (leftmost x-coordinate) and length of a sequence of lit pixels. All other pixels in the line are dark.

Parameters

  • , , , , , see above
  • callback function. is a string containing a run-length encoded framebuffer line, or to indicate start of frame.

Служебные функции

Поворот экрана

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

  • setRot90() – поворот на 90 градусов
  • setRot180() – поворот на 180 градусов
  • setRot270() – поворот на 270 градусов

Функция undoRotation отменяет поворот экрана, возвращая его в исходное положение.

Синтаксис: undoRotation().

Изменение цвета

Функция setColorIndex задает цвет пикселя.

Синтаксис: setColorIndex(uint8_t color_index).

  • color_index – цвет пикселя,
  • 0 – пиксель не горит,
  • 1 – пиксель горит.

Масштабирование

Функция setScale2x2 уменьшает разрешение дисплея в 2 раза. Если раньше 1 точка занимала один пиксель, то теперь она занимает 4.

Синтаксис: setScale2x2().

Функция undoScale отменяет действие функции setScale2x2.

Синтаксис: undoScale().

Основные функции будут описаны ниже. Полный список можно посмотреть на GitHub автора библиотеки.

Что такое библиотеки в Arduino?

Библиотека ардуино – это некий программный код, хранящийся не в скетче, а во внешних файлах, которые можно подключить к вашему проекту. В библиотеке хранятся различные методы и структуры данных, которые нужны для упрощения работы с датчиками, индикаторами, модулями и другими компонентами. Использование готовых программ существенно упрощает работу над проектами, потому что можно сосредоточиться на основной логике, не тратя время на множество мелочей.

Сегодня создано огромное количество библиотек, которые можно легко найти и скачать в интернете.  Подавляющее большинство библиотек распространяются по свободной лицензии, поэтому необходимости в поиске “пиратских” версий нет. Главное, это научиться искать нужные библиотеки, подходящие к вашей Arduino IDE, подключать их и правильно использовать.

Проверка работоспособности экрана

При первом подключении экрана к Arduino стоит убедиться в том, что он корректно работает:

  • Правильно подключены пины управления
  • Сам экран и его драйвер не повреждены
  • Объект экрана правильно инициализирован в программе

1. В Arduino IDE открыть: Файл -> Примеры

2. Пролистать вниз до U8glib и выбрать пункт GraphicsTest:

3. Посмотреть тип своего дисплея.

Раскомментировать инициализацию, с названием, похожим на наименование подключаемого дисплея. Если не сработало – попробовать другую похожую инициализацию.

Если закончились все похожие инициализации – проверить правильность подключения дисплея и повторить предпредыдущий пункт.

Если и тут не сработало — перепроверить тип и наименование дисплея, повторить предпредпредыдущий пункт. Если даже так не сработает – убедиться, что плата Arduino жива и звать шамана.

4. Загрузить код в Arduino и смотреть на демонстрацию возможностей библиотеки.

Библиотеки в Arduino IDE

Среди всего разнообразия библиотек можно выделить 3 основных группы:

  • Встроенные – это библиотеки, изначально установленные в среде Arduino IDE. Их не нужно скачивать и устанавливать дополнительно, они доступны для использования в программе сразу после запуска среды разработки.
  • Дополнительные – это библиотеки, которые нужно самостоятельно скачивать устанавливать. Обычно такой вид библиотек разрабатывает производитель датчиков, сенсоров и других компонентов для облегчения работы с ардуино.
  • Зависимые библиотеки – устанавливаются как помощник дополнительной библиотеки, отдельно от нее не работает.

Самым простым способом работы с библиотеками в ардуино является использование встроенных возможностей среды разработки Arduino IDE. Об этом мы поговорим в отдельной статье.

u8g.disp:drawBitmap()¶

Draw a bitmap at the specified x/y position (upper left corner of the bitmap).
Parts of the bitmap may be outside the display boundaries. The bitmap is specified by the array bitmap. A cleared bit means: Do not draw a pixel. A set bit inside the array means: Write pixel with the current color index. For a monochrome display, the color index 0 will usually clear a pixel and the color index 1 will set a pixel.

Parameters

  • X-position (left position of the bitmap)
  • Y-position (upper position of the bitmap)
  • number of bytes of the bitmap in horizontal direction. The width of the bitmap is cnt*8.
  • height of the bitmap
  • bitmap data supplied as string

The general essence of the algorithm

Among the fonts already registered in the library, they support little the Cyrillic alphabet, that is, the Russian alphabet, and in some projects unique characters are needed. And what to do in such a situation? Create a font yourself.

The author of the library himself offers us a special program – a converter. She is from the one given to her .bdf file with font data will create a ready-made data array, which we just need to insert into the library data file.

The first thing we need to do is create a font and save its data in .bdf format. To do this, you can use the programs

Fontforge (for Windows)

fontforge.org/en-US/

Fony (for Windows)

hukka.ncn.fi/?fony

Fontlab (for Windows and Mac)

fontlab.com/font-editor/fontlab/

Bdfeditor (for Linux)

hea-www.harvard.edu/~fine/Tech/bdfedit.html

Overview¶

Library Usage

The Lua bindings for this library closely follow u8g2’s object oriented C++ API. Based on the u8g2 class, you create an object for your display type. The communication interface has to be initialized up front, refer to the examples below on how to do this.

SSD1306 via I²C:

SSD1306 via SPI:

This object provides all of u8g2’s methods to control the display. Refer to graphics_test.lua to get an impression how this is achieved with Lua code. Visit the u8g2 homepage for technical details.

Displays selection

I²C and HW SPI based displays with support in u8g2 can be enabled.

The procedure is different for ESP8266 and ESP32 platforms.

ESP8266

Add the desired entries to the I²C or SPI display tables in app/include/u8g2_displays.h:

Alternatively, you can define them as and in an external file to avoid changing the source tree. Include the extra file on the command line:

ESP32

Enable the desired entries for I²C and SPI displays in u8g2’s sub-menu (run ).

Fonts selection

U8g2 comes with a wide range of fonts for small displays. Fonts can be supplied as strings or compiled into the firmware image to decrease the RAM footprint. If compiled into the firmware they become available as in Lua.

The procedure is different for ESP8266 and ESP32 platforms.

ESP8266

Add the desired fonts to the font table in app/include/u8g2_fonts.h:

Alternatively, you can define this as in an external file to avoid changing the source tree. Include the extra file on the command line:

ESP32

Add the desired fonts to the font selection sub-entry via .

Bitmaps

XBM bitmaps are supplied as strings to in contrast to the source code based inclusion of XBMs in upstream u8g2 library. This off-loads all data handling from the u8g2 module to generic methods for binary files. See graphics_test.lua.

Conversion of XBM bitmaps can be performed online with Online-Utility’s Image Converter: Convert from XBM to MONO format and upload the binary result.

Библиотека U8glib

Библиотека U8glib является одной из самых популярных библиотек для графических дисплеев, и сейчас я более подробно о ней расскажу.

U8glib

u8glib.zip
Version: 1.17

1.1 MiB
3055 Downloads

Библиотека для графических дисплеев U8glib

Категория: Arduino библиотеки
Лицензия: Freeware
Дата: 07.03.2015

Устанавливаем и открываем в скетч GraphicsTest в Arduino IDE

U8glib sketch GraphicsTest

Ищем строки, которые отвечают за подключение нашего дисплея

и раскоментируем одну из них

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

Тест библиотеки U8glib

Ну и конечно видео демонстрация работы дисплея

https://youtube.com/watch?v=gOdaK_-u7OE

На этом все, до скорых встреч.

Overview¶

I²C Connection

Hook up SDA and SCL to any free GPIOs. Eg. u8g_graphics_test.lua expects SDA=5 (GPIO14) and SCL=6 (GPIO12). They are used to set up nodemcu’s I²C driver before accessing the display:

SPI connection

The HSPI module is used (more information), so certain pins are fixed:

  • HSPI CLK = GPIO14
  • HSPI MOSI = GPIO13
  • HSPI MISO = GPIO12 (not used)

All other pins can be assigned to any available GPIO:

  • CS
  • D/C
  • RES (optional for some displays)

Also refer to the initialization sequence eg in u8g_graphics_test.lua:

Library Usage

The Lua bindings for this library closely follow u8glib’s object oriented C++ API. Based on the u8g class, you create an object for your display type.

SSD1306 via I²C:

SSD1306 via SPI:

This object provides all of u8glib’s methods to control the display. Again, refer to u8g_graphics_test.lua to get an impression how this is achieved with Lua code. Visit the u8glib homepage for technical details.

Displays

I²C and HW SPI based displays with support in u8glib can be enabled. To get access to the respective constructors, add the desired entries to the I²C or SPI display tables in app/include/u8g_config.h:

Fonts

u8glib comes with a wide range of fonts for small displays. Since they need to be compiled into the firmware image, you’d need to include them in app/include/u8g_config.h and recompile. Simply add the desired fonts to the font table:

They’ll become available as in Lua.

Bitmaps

Bitmaps and XBMs are supplied as strings to and . This off-loads all data handling from the u8g module to generic methods for binary files. See u8g_bitmaps.lua.
In contrast to the source code based inclusion of XBMs into u8glib, it’s required to provide precompiled binary files. This can be performed online with Online-Utility’s Image Converter: Convert from XBM to MONO format and upload the binary result with nodemcu-uploader.py.

u8g.disp:drawXBM()¶

Draw a XBM Bitmap. Position (x,y) is the upper left corner of the bitmap.
XBM contains monochrome, 1-bit bitmaps. This procedure only draws pixel values 1. The current color index is used for drawing (see setColorIndex). Pixel with value 0 are not drawn (transparent).

Bitmaps and XBMs are supplied as strings to and . This off-loads all data handling from the u8g module to generic methods for binary files. In contrast to the source code based inclusion of XBMs into u8glib, it’s required to provide precompiled binary files. This can be performed online with Online-Utility’s Image Converter: Convert from XBM to MONO format and upload the binary result with nodemcu-uploader.py or ESPlorer.

Parameters

  • X-position (left position of the bitmap)
  • Y-position (upper position of the bitmap)
  • width of the bitmap
  • height of the bitmap
  • XBM data supplied as string

Служебные функции

Поворот экрана

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

Синтаксис:

  • setRot90() – поворот на 90 градусов
  • setRot180() – поворот на 180 градусов
  • setRot270() – поворот на 270 градусов

Пример:

u8g.setFont(u8g_font_unifont);  
u8g.setPrintPos(0, 20); 
u8g.print("Hello World!");

u8g.setRot90();
u8g.setFont(u8g_font_unifont);  
u8g.setPrintPos(0, 20); 
u8g.print("Hello World!");

u8g.setRot180();
u8g.setFont(u8g_font_unifont); 
u8g.setPrintPos(0, 20);
u8g.print("Hello World!");

u8g.setRot270();
u8g.setFont(u8g_font_unifont); 
u8g.setPrintPos(0, 20);
u8g.print("Hello World!");

Функция undoRotation отменяет поворот экрана, возвращая его в исходное положение.

Синтаксис: undoRotation().

Пример:

u8g. undoRotation();

Изменение цвета

Функция setColorIndex задает цвет пикселя.

Синтаксис: setColorIndex(uint8_t color_index).

Где:

  • color_index – цвет пикселя,
  • 0 – пиксель не горит,
  • 1 – пиксель горит.

Пример:

u8g.setColorIndex(1);
u8g.drawBox(10, 10, 60, 20);
u8g.setColorIndex(0);
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(10, 30);
u8g.print("Hello World!");

Масштабирование

Функция setScale2x2 уменьшает разрешение дисплея в 2 раза. Если раньше 1 точка занимала один пиксель, то теперь она занимает 4.

Синтаксис: setScale2x2().

Пример:

u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 20);
u8g.print("Hello World!");
u8g.drawPixel(30, 30);

u8g.setFont(u8g_font_unifont);
u8g.setScale2x2();
u8g.setPrintPos(0, 20);
u8g.print("Hello World!");
u8g.drawPixel(30, 30);

Функция undoScale отменяет действие функции setScale2x2.

Синтаксис: undoScale().

Пример:

u8g.undoScale();

Основные функции будут описаны ниже. Полный список можно посмотреть на GitHub автора библиотеки.

Создание самого шрифта

Рисовать весь шрифт долго, да и я не художник, поэтому для примера создадим в Fony простой шрифт для отображения часов (он будет включать только цифры и символ «:» для их разделения).

Работа в fony

Если вы умеете работать в другой программе, пропустите этот блок.

Запускаем fony.

File -> New (или Ctrl + N)

Ascent здесь — высота в пикселях над базовой линией.

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

Так, что если мы хотим шрифт символ высотой в 20 пикселей, параметр Ascent нужно взять с запасом в расстояние между строками, например 24 пикселя. Height – общая высота (Ascent + высота нижнего выносного элемента). Так же необходимо указать какие символы мы собираемся рисовать. По таблице кодов ASCII.

Мы создаем шрифт, начинающийся с «0» и заканчивающийся «:». «0» имеет 48 номер, записываем его в параметр First char, а «:» — 58, записываем в Last char.

Жмем ОК.

Видим такое окно:

Красной чертой обозначена базовая линия.

И тут мы вспоминаем, что не указали ширину символа, ее нужно вписать в поле сверху.

При этом также необходимо помнить, что символы не должны соприкасаться с соседями и взять ширину с запасом, например 14.

Инструменты карандаш – 1, линия – 2, заливка – 3, позволяют заполнять пиксели, а окошко – 4 изменяет их масштаб.

Стрелки 5 и 6 двигают закрашенные пиксели влево и в право, а 7 и 8 – вверх и вниз. Панель служит для выбора и отображения рисуемого символа, а поле слева для предпросмотра.

Теперь рисуем наши символы от «0» до «:».

Теперь можно посмотреть, как будет выглядеть текст в нарисованном шрифте, для примера 12:58.

После того, как закончили рисовать, жмем:

File -> Export -> BDF Font

Назовем созданный шрифт Clock_font.

Сохраняем.

Конвертация дата-файла шрифта в код

Хорошо, теперь мы имеем файл bdf, который нужно перевести в формат, с которым сможет работать библиотека U8glib. Для этого ее автор предлагает воспользоваться программой bdf2u8g_101.

Убедитесь, что bdf2u8g_101.exe и файл вашего шрифта лежат в одной папке.

Теперь нужно с помощью командной строки запустить программу конвертации.

Win + R -> cmd -> OK -> cd “путь к папке, где лежат файлы”

Пример терминала:

Теперь вписываем следующую команду

start bdf2u8g.exe "опции" "полное название файла шрифта" "название шрифта для вызова" "полное название выходного файла"

опции:

начать с номера num из таблицы ASCII. Диапазон num: 0..255.

закончить номером num из таблицы ASCII. Диапазон num: 0..255.

и взять диапазон символов из таблицы ASCII от 0 до 512. page = 0 выбирает диапазон 0..127, page = 1 диапазон 128..255 и так далее.

Для создания конвертирования шрифта Clock_font вводим следующую команду:

start bdf2u8g.exe -b 48 -e 58 Clock_font.bdf clock_font Clock_font.c

и жмем Enter.

В папке теперь появился дата-файл.

Открываем его. Я использую редактор кода Visual Studio Code, но подойдет любой текстовый редактор вплоть до стандартного блокнота.

Теперь необходимо вставить этот фрагмент кода в дата-файлы библиотеки.

Для этого переходим в папку clib. Она лежит по адресу:

«путь, где храниться U8glib»\U8glib\src\

В этой директории необходимо найти и открыть файл u8g_font_data.c

Теперь копируем текст из Clock_font.c в u8g_font_data.c и, конечно, же сохраняем.

Но это еще не все. Там же находим и открываем файл u8g.h.

В этом файле пролистываем до начала объявления шрифтов.

Копируем сюда только объявление своего шрифта, дописав в начало extern, и также сохраняем.

Поздравляю, на этом собственный шрифт успешно интегрирован в библиотеку.

Test sketch

Let’s write a simple sketch showing the time to test the font’s functionality.

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI

byte _hour = 0, _minet = 0; // переменные, хранящие время. Часы и минуты
long long last_millis = 0;  // переменная хранящая предыдущее значение числа миллисекунд
long delay_time = 1000;      // задержка по истечению котрой наступит следующя минута. Устанавливается в миллисекундах.

void setup(void) {
  // u8g.setRot180(); // поворот экрана, если нужен
}

void loop(void) {
  if (millis() - last_millis > delay_time) {    // если пришло время следующей минуты
    last_millis = millis();
    _minet ++;                                  // увеличиваем число минут
    if (_minet > 59) _minet = 0, _hour ++;      // если это уже следующий час, увеличиваем число часов, а минуты сбрасываем в 0
    if (_hour > 23) _minet = 0, _hour = 0;      // если это уже следующий день, сбрасываем в 0 часы и минуты
    
    u8g.firstPage();              // начало цикла отрисовки
    do {
      u8g.setFont(clock_font);      // устанавливаем свой шрифт
      u8g.setPrintPos(30, 40);      // устанавливаем позицию печати
      u8g.print(_hour);             // печатаем часы
      u8g.print(':');               // печатаем разделяющий знак
      u8g.print(_minet);            // печатаем минуты
    } while ( u8g.nextPage() );   // конец цикла отрисовки
  }
}

For delay_time I set it to 1000 so that the minutes are updated once a second.

If you want a real update rate, set it to 60,000 (if you want absolute accuracy, then calculate this parameter based on the test run time and the frequency of the microcontroller. There will be a couple of tens of milliseconds more).

Графический ЖК (жидкокристаллический) дисплей 128х64

Данный дисплей отличается малым энергопотреблением и подходит для использования в устройствах, питание которых осуществляется от батареек. Он поддерживает диапазон питающих напряжений от 2.2v до 5.5v, 8/4-битный параллельный режим работы и поставляется вместе с микросхемой контроллера/драйвера ST7290. Кроме параллельного режима работы можно также использовать последовательный режим работы по шине PSB (processor side bus) (PIN 15). Этот графический ЖК дисплей имеет автоматическое управление мощностью и возможность программного сброса, что позволяет без проблем подключать его к большинству современных микропроцессорных платформ, например, 8051, AVR, ARM, Arduino и Raspberry Pi.

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

Назначение контактов графического ЖК дисплея ST7920 приведено в следующей таблице.

№ контакта Название контакта Описание
1 Gnd земля
2 Vcc входное питающее напряжение (от 2.7v до 5.5v)
3 Vo контрастность
4 RS Выбор регистра: RS = 0 — регистр инструкций, RS = 1 — регистр данных
5 R/W управление чтением/записью
6 E Enable (доступность)
7,8,9,10,11,12,13,14 DB0, DB1, DB2, DB3, DB4, DB5, DB6, DB7 контакты данных (возможна работа в 8 и 4-битном режиме)
15 PSB выбор интерфейса: Low(0) — последовательная связь, High (1) — 8/4 параллельный режим
16 NC Not connected (не соединен)
17 RST Reset Pin (сброс)
18 Vout выходное напряжение (Vout<=7 В)
19 BLA подсветка (положительный вывод)
20 BLK подсветка (отрицательный вывод)

u8g.fb_rle¶

Initialize a virtual display that provides run-length encoded framebuffer contents to a Lua callback.

The callback function can be used to process the framebuffer line by line. It’s called with either as parameter to indicate the start of a new frame or with a string containing a line of the framebuffer with run-length encoding. First byte in the string specifies how many pairs of (x, len) follow, while each pair defines the start (leftmost x-coordinate) and length of a sequence of lit pixels. All other pixels in the line are dark.

Parameters

  • callback function. is a string containing a run-length encoded framebuffer line, or to indicate start of frame.
  • of display. Must be a multiple of 8, less than or equal to 248.
  • of display. Must be a multiple of 8, less than or equal to 248.

Библиотеки датчиков ардуино

Библиотека DHT

Библиотека, которая позволяет считать данные с температурных датчиков DHT-11 и DHT-22.

#include < DHT.h>

DHT dht(DHTPIN, DHT11); – инициализирует датчик (в данном случае DHT11).

dht.begin(); – запуск датчика.

float t = dht.readTemperature(); – считывание текущего значения температуры в градусах Цельсия.

Библиотека DallasTemperature

Предназначается для работы с датчиками Dallas. Работает совместно с библиотекой OneWire.

#include <DallasTemperature.h>

DallasTemperature dallasSensors(&oneWire); – передача объекта oneWire для работы с датчиком.

requestTemperatures() – команда считать температуру с датчика и

положить ее в регистр.

printTemperature(sensorAddress); – запрос получить измеренное значение температуры.

Библиотека Ultrasonic

Обеспечивает работу Ардуино с ультразвуковым датчиком измерения расстояния HC-SR04.

#include <Ultrasonic.h>

Ultrasonic ultrasonic (tig , echo) – объявление объекта, аргументы – контакт Trig и контакт Echo.

dist = ultrasonic.distanceRead(); – определение расстояния до объекта. Агрумент – сантиметры(СМ) или дюймы (INC).

Timing() – считывание длительности импульса на выходе Echo, перевод в необходимую систему счисления.

Библиотека ADXL345

Предназначается для работы с акселерометром ADXL345.

Пример использования:

#include <Adafruit_ ADXL345.h>

ADXL345_ADDRESS – создание объекта, указание его адреса.

ADXL345_REG_DEVID  – идентификация устройства.

ADXL345_REG_OFSX – смещение по оси Х.

ADXL345_REG_BW_RATE – управление скоростью передачи данных.

Библиотека BME280

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

Пример использования:

#include <Adafruit_BME280.h>

BME280_ADDRESS  – создание объекта BME280, указание его адреса.

begin(uint8_t addr = BME280_ADDRESS); – начало работы датчика.

getTemperature – получение измеренной температуры.

getPressure – получение измеренного давления.

Библиотека BMP280

Требуется для работы с датчиком атмосферного давления BMP280.

Пример использования:

#include <Adafruit_BMP280.h>

BMP280_CHIPID – создание экземпляра, указание его адреса.

getTemperature(float *temp); – получение измеренной температуры.

getPressure(float *pressure); – получение измеренного значения давления.

Библиотека BMP085

Требуется для работы с датчиком давления BMP085.

Пример использования:

#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp; – создание экземпляра BMP085.

dps.init(MODE_ULTRA_HIGHRES, 25000, true); – измерение давления, аргумент 25000 – высота над уровнем моря (в данном случае 250 м. над уровнем моря).

dps.getPressure(&Pressure); – определение давления.

Библиотека FingerPrint

Требуется для работы со сканером отпечатков пальцев.

Пример использования

#include <Adafruit_Fingerprint.h>

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); – объявление объекта Finger. Параметр – ссылка на объектр для работы с UART, кокторому подключен модуль.

finger.begin();  – инициализация модуля отпечатков пальцев.

Func_sensor_communication(); – вызов модуля отпечатков пальцев.

Creating the font itself

It takes a long time to draw the whole font, and I’m not an artist either, so for example, let’s create a simple font in Fony to display the clock (it will include only numbers and the “:” symbol to separate them).

Work at fony

If you are familiar with another program, skip this block.

Follow the link above, download and extract the archive.

Launch fony.

File -> New (or Ctrl + N)

Ascent here is the height in pixels above the baseline.

When calculating this parameter, it is necessary to take into account that there may be other lines above the symbol and it should not touch them.

So, if we want a font of a character with a height of 20 pixels, the Ascent parameter must be taken with a margin of distance between lines, for example, 24 pixels. Height – the overall height (Ascent + the descender height). It is also necessary to indicate which symbols we are going to draw. According to the ASCII code table.

We create a font starting at “0” and ending with “:”. “0” has number 48, we write it into the First char parameter, and “:” – 58, we write it into the Last char.

Click OK.

We see such a window:

The baseline is the red line.

And then we remember that we did not indicate the width of the character, it needs to be entered in the field above.

It should also be remembered that the characters should not touch their neighbors and take the width with a margin, for example 14.

Pencil tools – 1, line – 2, fill – 3, allow you to fill in the pixels, and the box – 4 changes their scale.

Arrows 5 and 6 move filled pixels left and right, and arrows 7 and 8 up and down. The panel is used to select and display the drawn symbol, and the field on the left for preview.

Now we draw our symbols from “0” to “:”.

Now you can see how the text will look in the drawn font, for example 12:58.

After we have finished drawing, click:

File -> Export -> BDF Font

Let’s call the created font Clock_font.

We save.

Converting font data file to code

Ok, now we have a bdf file that needs to be converted into a format that the U8glib library can handle. To do this, its author suggests using the bdf2u8g_101 program.

Make sure bdf2u8g_101.exe and your font file are in the same folder.

Now you need to run the conversion program using the command line.

Win + R -> cmd -> OK -> cd “path to the folder where the files are located”

Terminal example:

Now we enter the following command

start bdf2u8g.exe "опции" "полное название файла шрифта" "название шрифта для вызова" "полное название выходного файла"

options:

start at number num from ASCII table. Range num: 0..255.

end with num from ASCII table. Range num: 0..255.

and take the range of characters from the ASCII table from 0 to 512. page = 0 selects the range 0..127, page = 1 selects the range 128..255, and so on.

To create a font conversion Clock_font, enter the following command:

start bdf2u8g.exe -b 48 -e 58 Clock_font.bdf clock_font Clock_font.c

and press Enter.

A date file has now appeared in the folder.

We open it. I use the Visual Studio Code editor, but any text editor up to notepad will work.

Now you need to insert this piece of code into the library data files.

To do this, go to the clib folder. It lies at:

“path where U8glib is stored” U8glib src

In this directory you need to find and open the file u8g_font_data.c

Now copy the text from Clock_font.c to u8g_font_data.c and, of course, save it.

But that’s not all. We also find and open the u8g.h file there.

In this file, scroll to the start of the font declaration.

We copy only the declaration of our font here, adding extern to the beginning, and also save it.

Congratulations, on this the custom font has been successfully integrated into the library.

Тестовый скетч

Напишем простой скетч, показывающий время, чтобы проверить работоспособность шрифта.

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI

byte _hour = 0, _minet = 0; // переменные, хранящие время. Часы и минуты
long long last_millis = 0;  // переменная хранящая предыдущее значение числа миллисекунд
long delay_time = 1000;      // задержка по истечению котрой наступит следующя минута. Устанавливается в миллисекундах.

void setup(void) {
  // u8g.setRot180(); // поворот экрана, если нужен
}

void loop(void) {
  if (millis() - last_millis > delay_time) {    // если пришло время следующей минуты
    last_millis = millis();
    _minet ++;                                  // увеличиваем число минут
    if (_minet > 59) _minet = 0, _hour ++;      // если это уже следующий час, увеличиваем число часов, а минуты сбрасываем в 0
    if (_hour > 23) _minet = 0, _hour = 0;      // если это уже следующий день, сбрасываем в 0 часы и минуты
    
    u8g.firstPage();              // начало цикла отрисовки
    do {
      u8g.setFont(clock_font);      // устанавливаем свой шрифт
      u8g.setPrintPos(30, 40);      // устанавливаем позицию печати
      u8g.print(_hour);             // печатаем часы
      u8g.print(':');               // печатаем разделяющий знак
      u8g.print(_minet);            // печатаем минуты
    } while ( u8g.nextPage() );   // конец цикла отрисовки
  }
}

Для delay_time я поставил 1000, чтобы минуты обновлялись раз в секунду.

Если хотите реальную скорость обновления, поставьте 60000 (если хотите абсолютную точность, то рассчитайте этот параметр, исходя из времени выполнения проверки и частоты работы микроконтроллера. Там будет на пару десятков миллисекунд больше).

LCD ST7920 и Arduino: Вывод различных данных

В статье познакомлю вас со способом, как можно вывести некоторую информацию на LCD дисплей разрешением 128×64 пикселей и контроллере ST7920 с помощью Arduino Mega. Будем выводить температуру и влажность датчиком DHT 11, время и дату с помощью модуля реального времени, уровень освещения двумя аналоговыми датчиками освещенности на фоторезисторах. А как вывести картинку на такой дисплей узнаете здесь.

Начнем с подключения библиотек.

Библиотека U8glib — скачать Библиотека dht11 — скачать Библиотека RTClib — скачать

Далее производим объявление переменных.

Следующий шаг — назначение вводов и выводов.

Теперь нужно сделать прорисовку на дисплее. Сверху делаем белую строку сплошной закраски.

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

Шрифт LCD дисплея u8g_font_5x8 — скачать.

Нужно указать, что следующие символы мы будем писать на белом фоне отключая пиксели (0).

В этой строке мы выведем время и дату.

u8g.setPrintPos( 2, 8); u8g.print(now.day() / 10); u8g.setPrintPos( 7, 8); u8g.print(now.day() % 10); u8g.setPrintPos( 11, 8); u8g.print(«.»); u8g.setPrintPos( 15, 8); u8g.print(now.month() / 10); u8g.setPrintPos( 20, 8); u8g.print(now.month() % 10); u8g.setPrintPos( 24, 8); u8g.print(«.»); u8g.setPrintPos( 29, 8); u8g.print(now.year(), DEC);

u8g.setPrintPos( 101, 8); u8g.print(now.hour() / 10); u8g.setPrintPos( 107, 8); u8g.print(now.hour() % 10); u8g.setPrintPos( 112, 8); u8g.print(«:»); u8g.setPrintPos( 117, 8); u8g.print(now.minute() / 10); u8g.setPrintPos( 122, 8); u8g.print(now.minute() % 10);

Заметьте, каждому символу в строке попиксельно указано, где он будет находиться.

Теперь настроим вывод температуры и влажности. Все это уже будет написано другим шрифтом 6х10.

Шрифт LCD дисплея u8g_font_6x10 — скачать.

u8g.setPrintPos( 3, 20); u8g.print(«Humidity»); u8g.setPrintPos( 53, 21); u8g.print(«=»); u8g.setPrintPos( 60, 20); u8g.print(DHT.humidity, 1); u8g.setPrintPos( 73, 20); u8g.print(«%»);

u8g.setPrintPos( 3, 31); u8g.print(«Temp»); u8g.setPrintPos( 29, 32); u8g.print(«=»); u8g.setPrintPos( 37, 31); u8g.print(DHT.temperature, 1); u8g.setPrintPos( 49, 31); u8g.print(«°C»);

u8g.setPrintPos( 3, 42); u8g.print(«Light»); u8g.setPrintPos( 29, 43); u8g.print(» — «); if (digitalRead(sensor1) == HIGH) u8g.setPrintPos( 45, 42); u8g.print(«On»); > else u8g.setPrintPos( 45, 42); u8g.print(«Off»); >

И тут добавляем число, которое в процентом отношении показывает уровень освещенности. Подробнее об этом уже рассказывалось.

int val = analogRead(sensor2); val = map(val, 0, 1023, 0, 100); u8g.setPrintPos( 73, 42); u8g.print(val); u8g.setPrintPos( 86, 42); u8g.print(«%»);

И вот что должно получиться.

#include «U8glib.h» \\библиотека для работы с LCD дисплеем #include «dht11.h» \\библиотека для работы с датчиком влажности и температуры #include \\библиотека для работы с I2C интерфесом #include «RTClib.h» \\библиотека для работы с модулем часов реального времени (RTC — Real_time_clock)

RTC_DS1307 rtc; dht11 DHT; // Объявление переменной класса dht11

int chk; #define DHT11_PIN 12 // Датчик DHT11 подключен к цифровому пину номер 13 const int ledlight = 9; const int sensor1 = 2; const int sensor2 = 0;

U8GLIB_ST7920_128X64_1X u8g( 13, 11, 10); // Создаём объект u8g для работы с дисплеем, указывая номер вывода CS для аппаратной шины SPI

pinMode(ledlight, OUTPUT); pinMode(sensor1, INPUT);

источник