Данный урок предназначен для изучения основных приемов работы с OLED-дисплеем SH1106 128×64.

ПЕРЕЧЕНЬ КОМПОНЕНТОВ СХЕМЫ

  • ARDUINO NANO (чипсет ATmega328P Old bootloader )
  • OLED-дисплей SH1106 128×64.
  • Соединительные провода
  • Монтажная плата

В этом уроке мы будем использовать плату Arduino NANO с достаточно редким USB-контроллером FTDI 1807-C  FT232RL. Драйвер к этому контроллеру можно скачать по ссылке [guest]  >>> [/guest]

ТЕОРИЯ

В разделе теории говорить об OLED дисплеях можно либо много или ничего. Поэтому преведу фрагмент datashitа )))))

МАКЕТ СХЕМЫ

Макетная сборка

КОД ПРОГРАММЫ

Для проверки работоспособности схемы напишем небольшой скетч. Результат выполнения скетча представлен на фотографии в разделе «Макет схемы»

  1. #include <Wire.h> // Подключаем библиотеку для работы с протоколом I2C
  2.  
  3. #include <U8glib.h> // Подключаем библиотеку для работы с OLED-дисплеем
  4. // Инициализируем дисплей под именем u8g
  5. U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
  6.  
  7. // Специально для дисплея в блоке setup ничего не нужно прописывать
  8. // хотя, можно устанавливать тип шрифта, используемого при выводе информации,
  9. // но в данном примере шрифт устанавливается в процедуре draw()
  10. void setup(void){
  11. }
  12.  
  13. void loop(void)
  14. {
  15. // данная конструкция является основным кодом вывода на дисплей
  16. // того или иного экрана
  17. u8g.firstPage();
  18. do
  19. {
  20. draw();
  21. }
  22. while(u8g.nextPage());
  23. }
  24.  
  25. // Процедура формирования экрана. Вызывается из основной программы
  26. void draw(void) {
  27. u8g.setFont(u8g_font_helvR12);
  28. u8g.drawStr(0, 15, "liprobot.ru"); u8g.drawStr(0, 40, "Screen 1");
  29. }

Увы, размеры OLED-дисплея не позволяют выводить сразу большой объем информации. И тут приходит на выручку особенность библиотеки U8glib.h. А именно, возможность создавать несколько экранов и выводить их на дисплей при необходимости. В качестве домашнего задания предлагается разобраться в следующей учебной программе ))))

 

На видео представлен результат работы программы.

  1. #include <Wire.h>
  2. #include <U8glib.h>
  3. U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
  4. // Объявляем глобальную переменную draw_state
  5. uint8_t draw_state = 0;
  6.  
  7. void setup(){
  8. }
  9.  
  10. void loop(void){
  11. u8g.firstPage();
  12. do
  13. {draw();}
  14. while(u8g.nextPage());
  15. // Увеличиваем значение переменной draw_state на 1
  16. // Если значение становится больше 1, принудительно устанавливаем 0
  17. draw_state++;
  18. if ( draw_state >1 ) draw_state = 0;
  19. delay(1000);}
  20.  
  21. void draw(void)
  22. {
  23. switch(draw_state) {
  24. case 0: screen1(); break;
  25. case 1: screen2(); break;}
  26. }
  27. void screen1(void) {
  28. u8g.setFont(u8g_font_helvR12);u8g.drawStr(0, 12, "liprobot.ru"); u8g.drawStr( 0, 40, "Screen 1");}
  29. void screen2(void) {
  30. u8g.setFont(u8g_font_helvR12);u8g.drawStr(0, 12, "liprobot.ru"); u8g.drawStr(60, 45, "Screen 2");}