Статьи » Разработки
Добавить статью

Портируем код под OLED i2c дисплей

2022-01-09 в 13:44 (последнее изменение 2024-03-08 в 21:31)

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

Однако, недавно наш читатель bogdan_2006k обратился за помощью в изменении кода микроконтроллера под OLED дисплей с i2c интерфейсом на контроллере SSD1306. Изначально проект делался под дисплей 1602 и 2002. В первой ссылке это видно.

Тут на самом деле стало интересно самому это провернуть. Да и благо у меня завалялся один OLED дисплей. Хорошо когда есть на чем проводить тесты. Задача была вроде как не сложной.

Нам для работы нужна простая библиотека OLED i2c.Она настолько простая, что в ней нет большого шрифта. Но мне это не потребовалось. Зато в ней уже сразу есть русский язык и красивые большие цифры. Что нам подходит.

Что делать с маленькими буквами? Я пошел по другому пути. Вспомнил один из описанных мною способов по выводу любой картинки на дисплей. И просто в Paint написал подходящим шрифтом (Сourier) и размером нужные мне слова. Данный шрифт подходит для такого идеально, он пиксельный.

И в этот раз без лого нашего портала не обошлось.

Вот какая красота получается=)

А теперь приступим к коду. Скетч для загрузки оставлю в конце.

Сама программа.

Код

#include <OLED_I2C.h>

int bta = 13; //Вывод к котрому подключен симистор
int svarka = 8; // Вывод клавиши сварки
int secplus = 9; // Вывод клавиши увеличении времени варки
int secminus = 10; // Вывод клавиши уменьшении времени варки
int razplus = 11; // Вывод клавиши увеличения количества проварок
int razminus = 12; // Вывод клавиши уменьшении количества проварок

int lastReportedPos = 1;
int lastReportedPos2 = 1;

int sec = 40;
int raz = 0;

OLED  myOLED(SDA, SCL, 8);

extern uint8_t logo[];
extern uint8_t sec_text[];
extern uint8_t raz_text[];
extern uint8_t SmallFont[];
extern uint8_t BigNumbers[];
extern uint8_t RusFont[];

void setup()
{
  myOLED.begin();
  myOLED.clrScr();
  myOLED.drawBitmap(15, 15, logo, 97, 36);
  myOLED.update();
  delay(4000);
  myOLED.clrScr();
  pinMode(svarka, INPUT);
  pinMode(secplus, INPUT);
  pinMode(secminus, INPUT);
  pinMode(razplus, INPUT);
  pinMode(razminus, INPUT);
  pinMode(bta, OUTPUT);
  myOLED.begin();
  myOLED.setFont(SmallFont);
  myOLED.print("Svarka - Tehnopage.ru", CENTER, 0); // текст "Сварка"
  myOLED.drawBitmap(0, 15, sec_text, 88, 24);
  myOLED.drawBitmap(0, 53, raz_text, 70, 11);
  myOLED.update();
}

void fire() {

  for (int i = 1; i <= raz; i++) {
    digitalWrite(bta, HIGH);
    delay (sec);
    digitalWrite(bta, LOW);
    delay (sec);
  }
  delay(1000);
}

void loop() {
  if (sec <= 9 ) {
    sec = 10;
    lastReportedPos = 11;
  }

  if (sec >= 201 ) {
    sec = 200;
    lastReportedPos = 199;
  }
  else
  { if (lastReportedPos != sec) {
      myOLED.setFont(BigNumbers);
      myOLED.print("", RIGHT, 15);
      myOLED.printNumI(sec, RIGHT, 15);
      myOLED.update();
      lastReportedPos = sec;
    }
  }

  if (raz <= 0 ) {
    raz = 1;
    lastReportedPos2 = 2;
  }

  if (raz >= 11 ) {
    raz = 10;
    lastReportedPos2 = 9;
  }
  else
  { if (lastReportedPos2 != raz) {
      myOLED.setFont(BigNumbers);
      myOLED.print("", RIGHT, 40);
      myOLED.printNumI(raz, RIGHT, 40);
      myOLED.update();
      lastReportedPos2 = raz;
    }
  }

  if (digitalRead(secplus) == HIGH ) {
    sec += 1;
    delay(250);
  }

  if (digitalRead(secminus) == HIGH ) {
    sec -= 1;
    delay(250);
  }

  if (digitalRead(razplus) == HIGH ) {
    raz += 1;
    delay(250);
  }

  if (digitalRead(razminus) == HIGH ) {
    raz -= 1;
    delay(250);
  }

  if (digitalRead(svarka) == HIGH ) {
    fire();
  }

}

Содержимое файла graphics.c с картинками.

Код

#include <avr/pgmspace.h>

const uint8_t logo[] PROGMEM={ //-- width: 97, height: 36
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x80,0x80,0xbc,0xbe,0xbe,
0xbc,0x80,0x80,0x80,0x80,0xbc,0xbe,0xbe,0xbc,0x80,0x80,0x80,0x80,0xbc,0xbe,0xbe,
0xbc,0x80,0x80,0x80,0x80,0xbc,0xbe,0xbe,0xbc,0x80,0x80,0x80,0x80,0xbc,0xbe,0xbe,
0xbc,0x80,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x60,0xf0,0xf0,0xf0,0xf0,0x0,0xf8,0xfe,0xff,0xff,0xf,0x1f,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x1,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xf8,0x0,0xf0,0xf0,0xf0,0xf0,0x60,0x0,0x0,
0x80,0x80,0x80,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x60,0xf0,0xf0,0xf0,0xf0,0x0,0xff,0xff,0xfe,0xfe,0x0,0x0,0xfe,
0xfe,0xff,0xff,0x1,0x0,0xce,0xce,0xce,0xc0,0xe1,0xff,0xff,0x0,0x0,0xfe,0xfe,
0xfe,0x0,0x1,0xff,0xff,0x1,0x0,0xfe,0xfe,0xfe,0x0,0x1,0xff,0xff,0x1,0x0,
0xfe,0xfe,0xfe,0x0,0x1,0xff,0xff,0xff,0xff,0x0,0xf0,0xf0,0xf0,0xf0,0x60,0x0,
0xff,0xff,0x1,0x1,0x1,0xff,0xff,0x0,0x0,0xe7,0xf7,0x31,0x31,0x31,0xff,0xff,
0x0,0x0,0xfc,0xff,0x3,0x1,0x1,0xff,0xff,0x0,0x0,0xfe,0xff,0x31,0x31,0x31,
0x3f,0x3f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x7,0xf,0x1f,0x1c,0x18,
0xdb,0xdb,0xdf,0xdf,0x1c,0x18,0x1b,0x1b,0xdb,0xd8,0xdc,0xdf,0x1f,0x18,0x18,0x1f,
0xdf,0xdf,0xd8,0xd8,0x1f,0x1f,0x18,0x18,0xdf,0xdf,0xdf,0xd8,0x18,0x1f,0x1f,0x1c,
0xd8,0xdb,0xdb,0xdb,0x18,0x1c,0x1f,0xf,0x7,0x1,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x7f,0x7f,0x6,0x6,0x6,0x7,0x3,0x0,0x0,0x3,0x7,0x4,0x4,0x4,0x7,
0x7,0x0,0x0,0x1,0x77,0x46,0x44,0x44,0x7f,0x7f,0x0,0x0,0x3,0x7,0x4,0x4,
0x4,0x7,0x7,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x3,0x7,0x7,0x3,0x0,0x0,0x0,0x0,0x3,0x7,0x7,0x3,0x0,0x0,0x0,
0x0,0x3,0x7,0x7,0x3,0x0,0x0,0x0,0x0,0x3,0x7,0x7,0x3,0x0,0x0,0x0,
0x0,0x3,0x7,0x7,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0
};

const uint8_t sec_text[] PROGMEM={ //-- width: 88, height: 24
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x80,0x0,0x0,
0xc0,0xe0,0x30,0x10,0x10,0x10,0x30,0x20,0x40,0x60,0x20,0x20,0x20,0x20,0xe0,0xc0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x90,
0x1f,0x1f,0x6,0x6,0x1f,0x1f,0x10,0x0,0x7,0xf,0x18,0x10,0x10,0x10,0x18,0x8,
0x10,0x30,0x22,0x22,0x22,0x22,0x3f,0x1d,0x0,0x18,0x3d,0x25,0x25,0x25,0x3f,0x3e,
0x20,0x0,0xe,0x5f,0xd1,0x91,0x91,0xff,0x7f,0x1,0x0,0x1e,0x3f,0x25,0x25,0x25,
0x25,0x37,0x16,0x0,0x81,0xff,0xff,0xa1,0x21,0x21,0x3f,0x1e,0x0,0x21,0x3b,0x1e,
0x3f,0x3f,0x1e,0x3b,0x21,0x0,0x21,0x3f,0x3f,0x4,0x1f,0x3b,0x21,0x20,0x0,0x18,
0x3d,0x25,0x25,0x25,0x3f,0x3e,0x20,0x0,0x1,0x2,0x4,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

const uint8_t raz_text[] PROGMEM={ //-- width: 70, height: 11
0x1,0xff,0xff,0x1,0x1,0xff,0xff,0x1,0x0,0x8,0xf8,0xf8,0x8,0x8,0x8,0xf8,
0xf0,0x0,0xf0,0xf8,0x8,0x8,0x8,0x8,0xf8,0xf0,0x0,0x8,0xd8,0xf0,0xf8,0xf8,
0xf0,0xd8,0x8,0x0,0x8,0xf8,0xf8,0x0,0x88,0xf8,0xf8,0x0,0x0,0x90,0xd8,0x48,
0x68,0x28,0xb8,0x90,0x0,0x0,0xf0,0xf8,0x8,0x8,0x8,0x8,0xf8,0xf0,0x0,0xfc,
0xfe,0x12,0x12,0x1e,0xfc,0xe0,0x1,0x1,0x1,0x0,0x0,0x1,0x1,0x1,0x0,0x4,
0x7,0x7,0x5,0x1,0x1,0x1,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,
0x0,0x1,0x1,0x0,0x1,0x1,0x0,0x1,0x1,0x0,0x0,0x0,0x1,0x1,0x1,0x1,
0x1,0x1,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x1,0x1,0x1,
0x1,0x1,0x1,0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x0
};

Скетч к проекту - загрузить
OLED i2C дисплей - заказать
Библиотека OED i2c
Первая статья про сварочный аппарат
Разработка и копирование печатных плат
Готовый модуль управления сварочного аппарата - заказать


Не пропустите обновления! Подписывайтесь на нашу группу Вконтакте.
Так же у нас есть Telegram канал.
Вам понравился наш материал? Поделитесь с коллегами!

Просмотров: 3319. Оценка статьи: 5.0 из 5. Уже оценило 1 читатель

Об авторе - Администратор

More by Администратор

Всего комментариев: 11
konan38
konan38 2023-05-28 18:55
Я не силен в Ардуино, может поправите скеч

Ответ Автора: Уберите строку с:
Код
delay(1000);
konan38
konan38 2023-05-24 17:15
ТОгда не компилируеться, я убирал

Ответ Автора: Видимо где-то ошибка.
konan38
konan38 2023-05-22 18:10
У Вас ошибка в коде. ВЫ заставили 13 порт открываться раз в сек.

void fire() {

for (int i = 1; i <= raz; i++) {
digitalWrite(bta, HIGH);
delay (sec);
digitalWrite(bta, LOW);
delay (sec);
}
delay(1000);
}
Зачем? И я не могу его поравить что бы нормально работало.

Ответ Автора: Это пауза между проварками в одну секунду. Можете убрать эту строчку чтобы ее не было.
konan38
konan38 2023-05-17 18:58
библиотеку брал в конце статьи

konan38
konan38 2023-05-17 18:57
так и не получается, на 13порту так и  идет "Blinc" 1 раз в сек мигает

Администратор
Администратор 2023-05-05 13:50
А вы точно брали библиотеку в конце статьи?

konan38
konan38 2023-05-04 18:07
C:\kontroller\now\new_svarka_oled\new_svarka_oled.ino: In function 'void setup()':

C:\kontroller\now\new_svarka_oled\new_svarka_oled.ino:41:50: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

   myOLED.print("Svarka - Tehnopage.ru", CENTER, 0); // текст "Сварка"

                                                  ^

C:\kontroller\now\new_svarka_oled\new_svarka_oled.ino: In function 'void loop()':

C:\kontroller\now\new_svarka_oled\new_svarka_oled.ino:71:33: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

       myOLED.print("", RIGHT, 15);

                                 ^

C:\kontroller\now\new_svarka_oled\new_svarka_oled.ino:90:33: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

       myOLED.print("", RIGHT, 40);

                                 ^

Archiving built core (caching) in: C:\Users\Admin\AppData\Local\Temp\arduino_cache_902520\core\core_arduino_avr_uno_0c812875ac70eb4a9b385d8fb077f54c.a

Вот такие ошибки при компиляции

konan38
konan38 2023-05-04 18:05
Добрый вечер, так он постоянно мигает, и на 13 порту 1 и семистор включается, и на кнопки не реагирует

konan38
konan38 2023-05-04 17:49
Загрузил Ваш скеч, а на 13 порту вместе со светодиодом L мигание. Как победить?

Ответ Автора: Добрый день. Все верно, ведь светодиод L подключен на 13 порт.
bogdan_2006k
bogdan_2006k 2022-01-21 12:57
Вы имеете ввиду поменять значение задержки от дребезге здесь на меньшее значение?
Код
if (digitalRead(secplus) == HIGH ) {
sec += 1;
delay(250);
}

if (digitalRead(secminus) == HIGH ) {
sec -= 1;
delay(250);
}
if (digitalRead(razplus) == HIGH ) {
raz += 1;
delay(250);
}
if (digitalRead(razminus) == HIGH ) {
raz -= 1;
delay(250);

Ответ Автора: Именно, 250 уменьшаете и срабатывать будет быстрее.
С кнопкой сварки разобрались?
bogdan_2006k
bogdan_2006k 2022-01-20 15:11
Спасибо за проделанную работу. Загрузил Ваш скетч. У меня такой результат: переключение кнопками задержки и прожига идет как то медленно по сравнению с дисплеем 1602, а говорят экранчик шустрый. И при включении идет самопроизвольный прожиг, не пойму вчем проблема? На кнопку прожига не реагирует. С Дисплеем 1602 всё работает отлично

Ответ Автора: Там в скетче стоит задержка 250 мс в качестве защиты от дребезга. Это значение можно уменьшить. По поводу кнопки сварки проверьте подключение.
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]