VU meter SH1106 OLED 1.3″ + LGT8F328 (Arduino)

SH1106 OLED 1.3″ — компактный дисплей используемый в электронных устройствах для отображения информации. Он имеет разрешение 128×64 пикселей и диагональ 1,3 дюйма. Экран использует технологию OLED (Organic Light Emitting Diode), которая позволяет получить яркие и контрастные изображения при низком энергопотреблении.

Основные параметры SH1106 OLED 1.3″:

  • Размер: 1,3 дюйма
  • Разрешение: 128×64 пикселей
  • Технология: OLED
  • Драйвер: SH1106
  • Цветность: одноцветный
  • Интерфейс: SPI или I2C
  • Угол обзора: более 160 градусов
  • Напряжение питания: 3,3 В или 5 В
  • Рабочая температура: от -40 до +85 градусов Цельсия

SH1106 OLED 1.3″ имеет высокую яркость и контрастность, что делает его удобным для использования даже в ярких условиях освещения. Кроме того, благодаря технологии OLED, он потребляет меньше энергии, чем традиционные ЖК-экраны, что позволяет увеличить время работы устройства от батарей.

Дисплей выпускается в двух интерфейса — SPI или I2C, что позволяет подключать его к различным устройствам с разными типами интерфейсов. Большинство микроконтроллеров и микрокомпьютеров имеют поддержку этих интерфейсов, поэтому экран легко подключается к таким устройствам.

SH1106 OLED 1.3″ также имеет широкий угол обзора более 160 градусов, что делает его удобным для использования в различных углах обзора. Рабочая температура от -40 до +85 градусов Цельсия позволяет использовать экран в широком диапазоне условий эксплуатации.

SH1106 драйвер OLED-дисплеев разработан компанией Solomon Systech Limited и является усовершенствованным вариантом предыдущего драйвера SH1101A.

Основные характеристики драйвера SH1106:

  • Интерфейсы: 8-битный параллельный, 4-битный параллельный, I2C и SPI
  • Разрешение: от 128×32 до 132×64 пикселей
  • Поддержка режимов отображения: текст, графика, анимация
  • Встроенный контроллер памяти: 256 байт

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

Кроме того, SH1106 имеет встроенный контроллер памяти, который позволяет хранить до 8 страниц информации на дисплее. Это дает возможность создавать различные режимы отображения, такие как текст, графика и анимация, что делает его удобным для использования в различных приложениях.

На базе недорого контроллера LGT8F328P и дисплея SH1106 OLED 1.3″ можно собрать простой простой индикатор уровня звукового сигнала.

На рисунке показана схема простого индикатора уровня звукового сигнала (VU meter) имитирующего работу стрелочного индикатора. На входы А0 подается звуковой сигнал через резисторы номиналом 4,7 кОм. Индикатор уровня имеет 90 ступеней, содержит шкалу в дБ и %.

Как добавить поддержку LGT8F328P (плата) в Arduino IDE и прошить микроконтроллер написано в LGT8F328P-LQFP32 MiniEVB в Arduino IDE.

Плата LGT8F328P-LQFP32 MiniEVB 

LGT8F328P-LQFP32 MiniEVB — это миниатюрная платформа для разработки на основе микроконтроллера LGT8F328P. Он имеет форм-фактор LQFP32, позволяющий подключать его к различным периферийным устройствам и компонентам. На плате есть все необходимые элементы для разработки, включая микроконтроллер, кварцевый резонатор, регулятор напряжения и др.

LGT8F328P-LQFP32 MiniEVB может быть использован для разных проектов, включая автоматизацию дома, робототехнику, медицинское оборудование, и многие другие. Плата поддерживает программирование через USB интерфейс, что делает ее легким в использовании и доступной для начинающих разработчиков.

Эта платформа оснащена множеством периферийных устройств, включая UART, I2C, SPI, а также цифровые и аналоговые порты ввода-вывода, что позволяет подключать к ней множество датчиков и устройств. Кроме того, на плате есть кнопка и светодиоды для отладки и контроля состояния устройства.

Для прошивке платы используйте следующие настройки:

#include <Wire.h>
#include <U8glib.h>  // http://rcl-radio.ru/wp-content/uploads/2023/04/U8glib.zip

U8GLIB_SH1106_128X64 myOLED(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
#define GAIN      100
#define STEP      5
#define LOW_SOUND 100
#define MAX_SOUND 600
 
  extern uint8_t SmallFont[];
  int strela=-45;
  int hMeter = 65;                      
  int vMeter = 85;                      
  int rMeter = 80;
  int ur,urr;
  unsigned long times;
 
 
void setup() {
  Serial.begin(9600);
  Wire.begin();Wire.setClock(800000L);
  myOLED.begin();
 // myOLED.setRot180();
  myOLED.setFont(u8g_font_profont11r);
  analogReadResolution(10);// АЦП 10 БИТ
  analogReference(DEFAULT);// DEFAULT(Uп)
  pinMode(A0,INPUT);
}
 
void loop() {
 // times=millis(); 
  strela = map(log(analogRead(A0))*GAIN, LOW_SOUND,MAX_SOUND, -45,45);
  strela = constrain(strela, -45, 45);
  urr = strela;if(urr<ur){ur=ur-STEP;}else{ur = strela;}  
 
/////// PRINT //////////////////////////////////////////////////////////////// 
 myOLED.firstPage();  
  do {
  myOLED.drawLine(10, 20, 85, 20);// line 1
  myOLED.drawLine(88, 20, 125, 20);myOLED.drawLine(88, 19, 125, 19);// line 2
  myOLED.drawLine(3, 23, 85, 23);// line3
 
  byte b1_2[10]{95,108,124,10,33,60,84,50,68,77};
  byte c1_2[10]{15,17,15,15,15,15,15,17,18,18};
  for(int i=0;i<10;i++){myOLED.drawLine(b1_2[i], 20, b1_2[i], c1_2[i]);} 
  byte b3[5]{3,25,48,67,84};
  for(int i=0;i<5;i++){myOLED.drawLine(b3[i], 23, b3[i], 27);}
 
  myOLED.drawStr(3, 10,F("20  10   3   0 1"));
  myOLED.drawStr(0, 40,F("0  25"));
  myOLED.drawStr(42, 40,F("50"));
  myOLED.drawStr(61, 40,F("75"));
  myOLED.drawStr(77, 40,F("100"));
  myOLED.drawStr(106, 10,F("2"));
  myOLED.drawStr(122, 10,F("3"));
  myOLED.drawStr(3, 60, F("-"));
  myOLED.drawStr(119, 60,F("+"));
  myOLED.drawStr(40,60,F("VU meter"));
 
  int a1 = (hMeter + (sin(ur / 57.296) * rMeter)); // meter needle horizontal coordinate
  int a2 = (vMeter - (cos(ur / 57.296) * rMeter)); // meter needle vertical coordinate
  myOLED.drawLine(a1, a2, hMeter, vMeter);  
  } while( myOLED.nextPage() );
//////// END PRINT /////////////////////////////////////////////////////////
}

Скетч содержит ряд настроек которые можно изменить:

  • #define GAIN 100 — уровень усиления
  • #define STEP 3 — плавность хода стрелки (от 1 до 10, чем больше число тем выше скорость стрелки)
  • #define LOW_SOUND 100 — уровень нуля сигнала (устранение ложного срабатывания стрелки при отсутствии аудиосигнала)
  • #define MAX_SOUND 600 — уровень максимального сигнала (при максимальном уровне сигнала стрелка должна доходить до +3 дБ)

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

Comments

    1. Не могу понять почему так. Загрузите скетч BLINK:

      void setup() {
      // initialize digital pin LED_BUILTIN as an output.
      pinMode(LED_BUILTIN, OUTPUT);
      }

      // the loop function runs over and over again forever
      void loop() {
      digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
      delay(1000); // wait for a second
      digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
      delay(1000); // wait for a second
      }

      Проверьте интервалы мигания светодиода, секунда горит, секунда гаснет, если не так значит не верные настройки платы

Добавить комментарий

Войти с помощью: