Некорректно выводится текст на дисплей
- Войдите на сайт для отправки комментариев
Вс, 02/08/2020 - 20:39
#define ENC_TYPE TYPE2 #define CLK 2 #define DT 3 #define SW 4 #define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13 #include "GyverEncoder.h" #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> Encoder enc1(CLK, DT, SW); // для работы c энкодером Adafruit_SSD1306 display(128, 64, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); // Для работы с дисплеем static const PROGMEM uint8_t image_data_Image3[1024] = {}; // Тут была заставка, убрал, чтобы удобнее было читать код int value[3]; // Значения настроек const int lenght = 4; // Количество пунктов в меню int cursor_disp; // Выбранный пункт меню bool state_setting; // Мы сейчас находимя в меню настроек? void setup() { Serial.begin(115200); // Открываем соединение с компьютером (необходимо для отладки) enc1.setType(ENC_TYPE); // Установка типа энкодера display.begin(SSD1306_SWITCHCAPVCC); // Инициализируем дисплей display.cp437(true); // Необходимо для корректного вывода русских символов на дисплей display.clearDisplay(); // Очищаем дисплей display.drawBitmap(0, 0, image_data_Image3, 128, 64, 1); // Выводим заставку-картинку display.display(); // Отправляем на дисплей (обновляем) } void loop() { enc1.tick(); // Обрабатываем энкодер if (enc1.isRight()) { // Если повернули вправо if (state_setting) { // Если сейчас идет отображение меню настроек cursor_disp++; // Передвигаем курсор if (cursor_disp == lenght) { // Если вылезли за пределы cursor_disp--; // Возвращаем курсор } } } if (enc1.isLeft()) { // Если повернули влево if (state_setting) { // Если сейчас идет отображение меню настроек cursor_disp--; // Передвигаем курсор if (cursor_disp == -1) { // Если вылезли за пределы cursor_disp = 0; // Возвращаем } } } if (enc1.isRightH()) { // Если крутим вправо + удержание if (state_setting) { // Если сейчас идет отображение меню настроек if (cursor_disp != 0) { // Если хотим что-то изменить value [cursor_disp - 1]++; // Меняем } } } if (enc1.isLeftH()) { // Если крутим влево + удержание if (state_setting) { // Если сейчас идет отображение меню настроек if (cursor_disp != 0) { // Если хотим что-то изменить value [cursor_disp - 1]--; // Меняем } } } if (enc1.isClick()) { } if (enc1.isSingle()) { if (state_setting) { if (cursor_disp == 0) { state_setting = false; display.clearDisplay(); // Очищаем дисплей display.setTextSize(1); display.setTextColor(WHITE); display.setCursor (0, 0); display.println (rus("Основной экран - в разработке")); display.display (); } } } if (enc1.isDouble()) { if (!state_setting) { state_setting = true; } } if (enc1.isHolded()) { } if (enc1.isTurn()) { if (state_setting) { update_disp (); } } } void update_disp () { // Функция отрисовки на дисплей display.clearDisplay(); // Очищаем дисплей display.setTextSize(1); display.setTextColor(WHITE); display.setCursor (0, 0); if (cursor_disp == 0) { display.print ((char)26); } display.println (rus ("Настройки: ")); if (cursor_disp == 1) { display.print ((char)26); } display.print (rus ("Сон через: ")); display.println (value [0]); if (cursor_disp == 2) { display.print ((char)26); } display.print (rus ("Тип настройки: ")); display.println (value [1]); if (cursor_disp == 3) { display.print ((char)26); } display.print (rus ("Температура: ")); display.println (value [2]); display.display (); }
Скетч использует 17128 байт (55%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 676 байт (33%) динамической памяти, оставляя 1372 байт для локальных переменных. Максимум: 2048 байт.
Основное меню выводится корректно, но когда перехожу на основной экран (проблемный вывод происходит в 92-ой строке), вместо того, чтобы вывести строку "Основной экран - в разработке" выводится просто "разработке". Почему? Заранее спасибо.
Дисплей OLED 4-wire SPI 128x64
Думаю, строчка "Основной экран - в разработке" просто слишком длинная для экранчика шириной всего 128 точек. Для проверки попробуйте оставить, например, только надпись "Основной экран" - ставлю на то, что такая надпись выведется правильно
Сейчас попробую, но когда я оставляю только инициализацию и вывод текста, текст выводится правильно (занимает 2 строки)
Забыл добавить в код функцию rus (в ArduinoIDE она была в отдельном файле)
Да, "Основной экран" вводится корректно, но почему тогда скетч с только инициализацией и выводом длинного текста работает корректно?