VU meter 0.96′ I2C 128X64 OLED (Arduino)

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

0.96′ I2C 128X64 OLED

В OLED дисплее отсутствует дополнительный слой подсветки всей поверхности экрана. Каждый пиксел, формирующий изображение, испускает самостоятельное свечение. При этом картинка получается яркой и контрастной.

Управление OLED дисплеем в данном примере осуществляется при помощи шины I2C.

Параметры дисплея SSD1306:

  • Технология дисплея: OLED
  • Разрешение дисплея: 128 на 64 точки
  • Диагональ дисплея: 0,96 дюйма
  • Угол обзора: 160°
  • Напряжение питания: 2.8 В ~ 5.5 В
  • Мощность: 0,08 Вт
  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм
#include <Wire.h> 
#include <OLED_I2C.h>           // http://rcl-radio.ru/wp-content/uploads/2022/01/OLED_I2C.zip
 
#define GAIN      100
#define STEP      3
#define LOW_SOUND 100
#define MAX_SOUND 600
 
  OLED  myOLED(SDA, SCL, 8);
  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(400000L);
  myOLED.begin();
  myOLED.setBrightness(100);
  //  myOLED.invert(true);// invert
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  analogReference(INTERNAL);  // если очень маленький уровень сигнала
  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.clrScr();
  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.print(F("20  10   3   0 1"), 3, 5);
  myOLED.print(F("0  25"), 0, 30);
  myOLED.print(F("50"), 42, 30);
  myOLED.print(F("75"), 61, 30);
  myOLED.print(F("100"), 75, 30);
  myOLED.print(F("2"), 106, 5);
  myOLED.print(F("3"), 120, 5);
  myOLED.print(F("-"), 3, 50);myOLED.print(F("+"), 119, 50);
  myOLED.print(F("VU meter"), CENTER, 50);
 
  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);  
  myOLED.update();
 // Serial.println(millis()-times);
//////// END PRINT /////////////////////////////////////////////////////////
}

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

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

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

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=503 

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

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