#2 Re: Програмування Arduino » Переробляю скетч i2c на дисплей SPI OLED » 2025-05-24 09:06:22

В Adafruit SSD1306 у мене так виходить:
void printPointer(uint8_t pointer) {          // Навигация по меню
  if (flag) {                                             // Если флаг установлен
    display.setCursor(0, pointer);               // Указываем на параметр
    display.print(">");
  } else {                                                 // Иначе
    display.setCursor(116, pointer);            // Указываем на значение параметра
    display.print("<");
  }
}
Але тут курсор встановлюється на піксель. У гувері є дві можливості встановлення на піксель та на рядок: oled.setCursorXY и
oled.setCursor

#3 Програмування Arduino » Переробляю скетч i2c на дисплей SPI OLED » 2025-05-23 22:26:59

chipaka
відповідей: 8

Допоможіть!
Переробляю скетч i2c на дисплей SPI OLED. Була бібліотека GyverOLED. Переробляю під Adafruit SSD1306. Виникла така проблема: є курсор такого типу ">", який переміщається по меню з 8 рядків при натисканні на кнопку. У старому коді з Гувер бібліотекою можна встановлювати курсор рядками:
void printPointer(uint8_t pointer) { // Навігація по меню
if (flag) {                                     // Якщо прапор встановлено
oled.setCursor(0, pointer);            // Вказуємо на параметр
oled.print(">");
} else {                                       // Інакше
oled.setCursor(124, pointer);        // Вказуємо значення параметра
oled.print("<");
}
}
В Adafruit SSD1306 курсор можна встановлювати тільки за координатами х і у. Як зробити переміщення курсору рядками

#4 Re: Програмування Arduino » Бібліотека GyverOLED та OLED дисплей SSH1106 не працює » 2025-05-02 21:37:18

Є такий код, і у мене є OLED дисплей SPI SSH1106. Хотів його прикрутити

#define OLED_SOFT_BUFFER_64     // Буфер на стороне МК
#include <GyverOLED.h>          // Библиотека дисплея
GyverOLED<SSD1306_128x64> oled; // Обьект дисплея

#include <GyverButton.h>      // Либа кнопок
GButton up(3, HIGH_PULL);     // Кнопки
GButton down(4, HIGH_PULL);
GButton ok(2, HIGH_PULL);

#define ITEMS 24               // Общее кол во пунктов (больше 8 - нужно несколько страниц)

// Битмап с картинкой стрелочки (Если нужен)
const uint8_t ptr_bmp[] PROGMEM = {
  0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0xFF, 0xFF, 0x7E, 0x3C, 0x18,
};

void setup() {
  oled.init();           // Инциализация дисплея
  oled.setContrast(255); // Макс. яркость
}

void loop() {
  static int8_t pointer = 0; // Переменная указатель

  /* Кнопки */
  up.tick();                 // Опрос кнопок
  down.tick();
  ok.tick();

  if (up.isClick() or up.isHold()) {                // Если кнопку нажали или удерживают
    pointer = constrain(pointer - 1, 0, ITEMS - 1); // Двигаем указатель в пределах дисплея
  }

  if (down.isClick() or down.isHold()) {
    pointer = constrain(pointer + 1, 0, ITEMS - 1);
  }

  if (ok.isClick()) {   // Нажатие на ОК - переход в пункт меню
    switch (pointer) {  // По номеру указателей располагаем вложенные функции (можно вложенные меню)
      case 0: func(); break;  // По нажатию на ОК при наведении на 0й пункт вызвать функцию
      case 1: break;
      case 2: break;
      case 3: break;
      case 4: break;
      case 5: break;
      case 6: break;
      case 7: break;
        // И все остальные
    }
  }

  /* меню */
  oled.clear();           // Очищаем буфер
  oled.home();            // Курсор в левый верхний угол

  if (pointer < 8) {      // Первая страница
    oled.print            // Вывод всех пунктов
    (F(
       "  Parameter 0:n" // Не забываем про 'n' - символ переноса строки
       "  Parameter 1:n"
       "  Parameter 2:n"
       "  Parameter 3:n"
       "  Parameter 4:n"
       "  Parameter 5:n"
       "  Parameter 6:n"
       "  Parameter 7:n"
     ));
  } else if (pointer < 16) {// Вторая страница
    oled.print
    (F(
       "  Parameter 8:n"
       "  Parameter 9:n"
       "  Parameter 10:n"
       "  Parameter 11:n"
       "  Parameter 12:n"
       "  Parameter 13:n"
       "  Parameter 14:n"
       "  Parameter 15:n"
     ));
  } else {                  // Последняя страница
    oled.print
    (F(
       "  Parameter 16:n"
       "  Parameter 17:n"
       "  Parameter 18:n"
       "  Parameter 19:n"
       "  Parameter 20:n"
       "  Parameter 21:n"
       "  Parameter 22:n"
       "  Parameter 23:n"
     ));
  }

  printPointer(pointer);  // Вывод указателя
  oled.update();          // Выводим кадр на дисплей
}
void printPointer(uint8_t pointer) {
  // Символьный указатель - лучший выбор в многостраничном меню
  // Указатель в начале строки
  oled.setCursor(0, pointer);
  oled.print(">");
  // Можно еще в конце
  /*oled.setCursor(20, pointer);
    oled.print("<");*/
  // Указатель в виде прямоугольной рамки со скругленными углами
  /*oled.roundRect(0, pointer * 8, 127, (pointer * 8) + 6);*/
  // Указатель в виде битмапа (картинки)
  /*oled.drawBitmap(0, pointer * 8, ptr_bmp, 10, 8);*/
}

/* пример вложеной функции, которую можно вызвать из под меню */
void func(void) {
  oled.clear();
  oled.home();
  oled.print(F("Press OK to return"));
  oled.update();
  while (1) {
    ok.tick();
    if (ok.isClick()) return; // return возвращает нас в предыдущее меню
  }
}

#6 Re: Програмування Arduino » Бібліотека GyverOLED та OLED дисплей SSH1106 не працює » 2025-05-01 21:56:01

А взагалі можна з цією бібліотекою використовувати SPI дисплеї або вона лише під I2C

#7 Re: Програмування Arduino » Бібліотека GyverOLED та OLED дисплей SSH1106 не працює » 2025-05-01 20:45:34

Це просто приклад. Пробував розкоментувати рядок GyverOLED<SSD1306_128x64, OLED_BUFFER, OLED_SPI, 8, 7, 6> oled;
Але нічого не вийшло

#9 Програмування Arduino » Бібліотека GyverOLED та OLED дисплей SSH1106 не працює » 2025-04-28 21:38:08

chipaka
відповідей: 31

Доброго вечора. Бібліотека GyverOLED та OLED дисплей SSH1106 не працює.
Брав приклад:
// дефайн перед подключением либы - использовать microWire (лёгкая либа для I2C)
//#define USE_MICRO_WIRE

// дефайн перед подключением либы - скорость SPI
//#define OLED_SPI_SPEED 4000000ul

#include <GyverOLED.h>

// инициализация:
// GyverOLED<модель, буфер, интерфейс, CS, DC, RST> oled;
// "по умолчанию" - можно не указывать

// модель дисплея:
// SSD1306_128x32
// SSD1306_128x64
// SSH1106_128x64 (ТОЛЬКО С БУФЕРОМ)

// буфер:
// OLED_NO_BUFFER (без буфера)
// OLED_BUFFER (с буфером на стороне МК) - по умолчанию

// интерфейс:
// OLED_I2C - по умолчанию
// OLED_SPI (указать пины CS, DC, RST/RES)

// примеры:
//GyverOLED<SSD1306_128x32, OLED_BUFFER> oled;
//GyverOLED<SSD1306_128x32, OLED_NO_BUFFER> oled;
//GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
//GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
//GyverOLED<SSD1306_128x64, OLED_BUFFER, OLED_SPI, 8, 7, 6> oled;
GyverOLED<SSH1106_128x64> oled;

// для I2C можно передать адрес: GyverOLED oled(0x3C);

// битмап создан в ImageProcessor https://github.com/AlexGyver/imageProcessor
// с параметрами вывода vertical byte (OLED)
const uint8_t bitmap_32x32[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, 0x70, 0x70, 0x30, 0x30, 0x30, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0x70, 0x30, 0x30, 0x20, 0x00, 0x00,
  0x00, 0x30, 0x78, 0xFC, 0x7F, 0x3F, 0x0F, 0x0F, 0x1F, 0x3C, 0x78, 0xF0, 0xE0, 0xC0, 0x80, 0x80, 0x80, 0x40, 0xE0, 0xF0, 0xF8, 0xFC, 0xFF, 0x7F, 0x33, 0x13, 0x1E, 0x1C, 0x1C, 0x0E, 0x07, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF9, 0xF7, 0xEF, 0x5F, 0x3F, 0x7F, 0xFE, 0xFD, 0xFB, 0xF1, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x33, 0x33, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x1F, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00,
};

void setup() {
  Serial.begin(9600);
  oled.init();  // инициализация

  // --------------------------
  // настройка скорости I2C
  //Wire.setClock(800000L);   // макс. 800'000

  // --------------------------
  oled.clear();   // очистить дисплей (или буфер)
  oled.update();  // обновить. Только для режима с буфером! OLED_BUFFER

  // --------------------------
  oled.home();            // курсор в 0,0
  oled.print("Hello!");   // печатай что угодно: числа, строки, float, как Serial!
  oled.update();
  delay(2000);

  // --------------------------
  oled.setCursor(5, 1);   // курсор в (пиксель X, строка Y)
  oled.setScale(2);
  oled.print("Hello!");
  oled.update();
  delay(2000);

  // --------------------------
  oled.setCursorXY(15, 30); // курсор в (пиксель X, пиксель Y)
  oled.setScale(3);
  oled.invertText(true);    // инвертируй текст!
  oled.print("Привет!");
  oled.update();
  delay(2000);

  // --------------------------
  oled.clear();
  oled.home();
  oled.setScale(1);
  oled.invertText(false);
  oled.autoPrintln(true);   // автоматически переносить текст
  oled.print(F("Lorem ipsum dolor sit amet, лорем ипсум долор сит амет привет народ ё, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam"));
  oled.update();
  delay(2000);

  // --------------------------
  oled.home();
  oled.textMode(BUF_ADD);
  // BUF_ADD - наложить текст
  // BUF_SUBTRACT - вычесть текст
  // BUF_REPLACE - заменить (весь прямоугольник буквы)
  oled.home();
  oled.setScale(3);
  oled.print("KEK!");
  oled.update();
  delay(2000);

  // --------------------------
  // СЕРВИС
  //oled.setContrast(10);   // яркость 0..15
  //oled.setPower(true);    // true/false - включить/выключить дисплей
  //oled.flipH(true);       // true/false - отзеркалить по горизонтали
  //oled.flipV(true);       // true/false - отзеркалить по вертикали
  //oled.isEnd();           // возвращает true, если дисплей "кончился" - при побуквенном выводе

  // --------------------------
  oled.clear();
  oled.dot(0, 0);     // точка на x,y
  oled.dot(0, 1, 1);  // третий аргумент: 0 выкл пиксель, 1 вкл пиксель (по умолч)
  oled.line(5, 5, 10, 10);        // линия x0,y0,x1,y1
  //oled.line(5, 5, 10, 10, 0);   // пятый аргумент: 0 стереть, 1 нарисовать (по умолч)
  oled.fastLineH(0, 5, 10);       // горизонтальная линия (y, x1, x2)
  //oled.fastLineH(0, 5, 10, 0);  // четвёртый аргумент: 0 стереть, 1 нарисовать (по умолч)
  oled.fastLineV(0, 5, 10);       // аналогично верт. линия (x, y1, y2)
  oled.rect(20, 20, 30, 25);      // прямоугольник (x0,y0,x1,y1)
  oled.rect(5, 35, 35, 60, OLED_STROKE);      // прямоугольник (x0,y0,x1,y1)
  // параметры фигуры:
  // OLED_CLEAR - очистить
  // OLED_FILL - залить
  // OLED_STROKE - нарисовать рамку
  oled.roundRect(50, 5, 80, 25, OLED_STROKE);  // аналогично скруглённый прямоугольник
  oled.circle(60, 45, 15, OLED_STROKE);        // окружность с центром в (x,y, с радиусом)
  oled.circle(60, 45, 5, OLED_FILL);           // четвёртый аргумент: параметр фигуры

  // битмап
  oled.drawBitmap(90, 16, bitmap_32x32, 32, 32, BITMAP_NORMAL, BUF_ADD);
  //oled.drawBitmap(90, 16, bitmap_32x32, 32, 32);  // по умолч. нормал и BUF_ADD
  // x, y, имя, ширина, высота, BITMAP_NORMAL(0)/BITMAP_INVERT(1), BUF_ADD/BUF_SUBTRACT/BUF_REPLACE
 
  oled.update();
}

void loop() {
}

Дисплей OLED 1.3 SPI. Підключав до Ардуін UNO. Дисплей чорний. У чому може бути причина? sad

#11 Програмування Arduino » Шкала, що заливається » 2024-04-27 09:05:34

chipaka
відповідей: 3

Доброго часу.
Народ допоможіть початківцу. Є такий скетч. Ніяк не можу повернути шкалу, що заливається. заливання починається зверху. Як зробити знизу.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#define SENSOR A0
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SH1106 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup() {
  display.begin(SH1106_SWITCHCAPVCC);
  display.display();
  delay(1000);
  display.clearDisplay();
  display.setRotation(0);
  }
 
void loop() {
   
  display.clearDisplay();
  display.setTextSize(1);      // Normal 1:1 pixel scale
  display.setTextColor(WHITE); // Draw white text
  display.setCursor(0, 3);     // Start at top-left corner 
   
  display.drawRect(100, 0, 18, 64, 1); // рисуем прямоугольник 1

  int raw = analogRead(SENSOR);

  static int avgVadc = 0;
  avgVadc = (avgVadc * 3 + raw)/4;
  avgVadc = constrain(avgVadc, 0, 500);
  int FuelLevel = map(avgVadc, 0, 500, 0, 300);
  display.setCursor(20, 10);
  display.setTextSize(3);
  display.println(FuelLevel);
  int FuelLeve2 = map(avgVadc, 0, 500, 0, 64);
  display.fillRect (100, 0, 18, FuelLeve2, 1);
   
  display.display();
  delay(100);
}

Підвал форуму