首页 > 其他分享 >0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

时间:2023-11-27 14:33:24浏览次数:29  
标签:index int double SCREEN 5V 液晶屏 IIC display newHeight

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十六:0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V

 项目二十三:黄色屏声音可视化器

 实验接线: max9814接A0

 oled模块  Ardunio Uno

 GND---------GND接地线

 VCC---------5V 接电源

 SDA---------A4

 SCL ------- A5

*/

#include "arduinoFFT.h"

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#define SAMPLES 64 // power of 2

#define SAMPLING_FREQ 8000 // 12 kHz Fmax = sampleF /2 

#define AMPLITUDE 100 // 灵敏度

#define FREQUENCY_BANDS 14

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 32

#define BARWIDTH 11

#define BARS 11

#define ANALOG_PIN A0

#define OLED_RESET   -1 // 重置引脚 #(如果共享 Arduino 重置引脚,则为 -1)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

double vImag[SAMPLES];

double vReal[SAMPLES];

unsigned long sampling_period_us;

arduinoFFT fft = arduinoFFT(vReal, vImag, SAMPLES, SAMPLING_FREQ);

//调整参考以去除背景噪声

float reference = log10(60.0);

double coutoffFrequencies[FREQUENCY_BANDS];

void setup() {

 // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally

 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32

  for (;;); // Don't proceed, loop forever

 }

 // Setup display

 display.clearDisplay();

 display.display();

 display.setRotation(0);

 display.invertDisplay(false);

 sampling_period_us = (1.0 / SAMPLING_FREQ ) * pow(10.0, 6);

 // 计算截止频率,以对数标度为基数 POt

 double basePot = pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS);

 coutoffFrequencies[0] = basePot;

 for (int i = 1 ; i < FREQUENCY_BANDS; i++ ) {

  coutoffFrequencies[i] = basePot * coutoffFrequencies[i - 1];

 }

 // 绘制虚线以分离频段

 for (int i = 0; i < BARS - 1 ; i++) {

  for (int j = 0; j < SCREEN_HEIGHT ; j += 4) {

   display.writePixel((i + 1)*BARWIDTH + 2 , j, SSD1306_WHITE );

  }

 }

 display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE);

}

int oldHeight[20];

int oldMax[20];

double maxInFreq;

void loop() {

 // 采样

 for (int i = 0; i < SAMPLES; i++) {

  unsigned long newTime = micros();

  int value = analogRead(ANALOG_PIN);

  vReal[i] = value;

  vImag[i] = 0;

  while (micros() < (newTime + sampling_period_us)) {

   yield();

  }

 }

 // 计算 FFT

 fft.DCRemoval();

 fft.Windowing(FFT_WIN_TYP_HAMMING, FFT_FORWARD);

 fft.Compute(FFT_FORWARD);

 fft.ComplexToMagnitude();

 double median[20];

 double max[20];

 int index = 0;

 double hzPerSample = (1.0 * SAMPLING_FREQ) / SAMPLES; //

 double hz = 0;

 double maxinband = 0;

 double sum = 0;

 int count = 0;

 for (int i = 2; i < (SAMPLES / 2) ; i++) {

  count++;

  sum += vReal[i];

  if (vReal[i] > max[index] ) {

   max[index] = vReal[i];

  }

  if (hz > coutoffFrequencies[index]) {

   median[index] = sum / count;

   sum = 0.0;

   count = 0;

   index++;

   max[index] = 0;

   median[index] = 0;

  }

  hz += hzPerSample;

 }

 // 计算每个频段的中值和最大值

 if ( sum > 0.0) {

  median[index] = sum / count;

  if (median[index] > maxinband) {

   maxinband = median[index];

  }

 }

 int bar = 0;

 for (int i = FREQUENCY_BANDS - 1; i >= 3; i--) {

  int newHeight = 0;

  int newMax = 0;

  // 计算实际分贝

  if (median[i] > 0 && max[i] > 0 ) {

   newHeight = 20.0 * (log10(median[i] ) - reference);

   newMax = 20.0 * (log10(max[i] ) - reference);

  }

  // 调整最小和最大级别

  if (newHeight < 0 || newMax < 0) {

   newHeight = 1;

   newMax = 1;

  }

  if (newHeight >= SCREEN_HEIGHT - 2) {

   newHeight = SCREEN_HEIGHT - 3;

  }

  if (newMax >= SCREEN_HEIGHT - 2) {

   newMax = SCREEN_HEIGHT - 3;

  }

  int barX = bar * BARWIDTH + 5;

  // 删除旧水平中位数

  if (oldHeight[i] > newHeight) {

   display.fillRect(barX, newHeight + 1, 7, oldHeight[i], SSD1306_BLACK);

  }

  // 删除旧的最大级别

  if ( oldMax[i] > newHeight) {

   for (int j = oldMax[i]; j > newHeight; j -= 2) {

    display.drawFastHLine(barX , j, 7, SSD1306_BLACK);

   }

  }

  // 绘制新的最大级别

  for (int j = newMax; j > newHeight; j -= 2) {

   display.drawFastHLine(barX , j, 7, SSD1306_WHITE);

  }

  // 绘制新的级别中位数

  display.fillRect(barX , 1, 7, newHeight, SSD1306_WHITE);

  oldMax[i] = newMax;

  oldHeight[i] = newHeight;

  bar++;

 }

 display.drawFastHLine(0 , SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE);

 display.display();

}

 

 

标签:index,int,double,SCREEN,5V,液晶屏,IIC,display,newHeight
From: https://www.cnblogs.com/lovefast/p/17859290.html

相关文章

  • PC8231恒流恒压输出同步降压芯片5V/2.4A内置限流补偿带EN引脚
    一.概述PC8231是一款同步降压转换器,该转换器可驱动输出2.4A负载电流。设计允许PC8231在9V到40V宽输入电压范围内工作。通过将COMP/EN引脚逻辑电平拉低来实现外部关断功能,并进入待机模式。外部补偿使反馈控制环路具有良好的线压调整率和负载调整率,且外围设计灵活。PC8231......
  • FS2110同步整流5V1A频率PWM同步升压IC转换器DC-DC
    描述FS2110是一种高效,固定频率550 KHz,电流模式PWM升压直流/直流转换器,可以操作电池,如输入电压降至2.5V。转换器输出电压可通过外部电阻分压器调节到最大5.25V。此外,转换器还包括一个0.08Ωn通道MOSFET开关和0.12Ωp通道同步整流器。因此,不需要外部肖特基二极管,可以得到更好的效率,......
  • USB(2.0 / Type-C) to MPSSE(JTAG / SPI / IIC) / UART / FIFO: FTDI 的FT4232H配成SP
    Ti60Demo板FT4232H串口使用易灵思FPGA技术交流2022-04-1508:43Ti60F225demo板使用的是FT4232H,有4个通道A,B,C和D。其中A通道用于SPI接口,可以是AS也可以是PS。通道B用于JTAG,通道C连接了UART,通道D连接了FX3。A,B,C和D四个通道分别对应Zadig中的TitraniumTi60F225develo......
  • Electrical(Hardware) Protocols: FIFO / JTAG / SPI / IIC / IIS / UART / SWD / ICS
    Electrical(Hardware)Protocols:JTAG(JointTestActionGroup),JTAGisactuallyaprotocoloverSPI.5pins/connections(GND,TMS,TCK,TDI,TDO),Outputtype:Maximumvoltage:5.5volts(5voltsafe),3.3voltnormal,oropencollector(pull-upresistorsre......
  • FS2957 降压恒压芯片内置120V功率管36V48V60V72V80v降压5V
    随着科技的不断进步,电子设备在我们的生活中越来越普及,而电源管理芯片作为电子设备中的重要组成部分,也得到了广泛的应用。今天,我们要介绍的是一款具有高性价比的FS2957降压恒压芯片,它内置120V功率管,适用于36V、48V、60V、72V、80V的降压5V输出。FS2957降压恒压芯片采用专利的电流模......
  • FS4001单节4.2V4.35V4.4V锂电池线性充电IC
    在电池充电过程中,FS4001是一个重要的元器件,它是一款适用于单节4.2V、4.35V及4.4V锂电池的线性充电IC。这款芯片具有高效率、高集成度、低成本等优点,广泛应用于各种需要充电的设备中。一、FS4001的主要特点FS4001采用同步整流技术,具有较高的充电效率其,充同电时电充压电精过度程高安,......
  • FS4059B原厂是5V输入升压充电8.4V1.5A双节锂离子电池充电管理芯片
    FS4059B是一款原厂生产的5V升压充电8.4V1.5双节锂离子电池充电管理芯片,它具有高效率、低功耗、低成本、易于使用等优点。它采用了原厂生产的专利技术,可以在短时间内将电池充电至80%,有效延长电池使用寿F命S。4059B具有多种保护功能,包括过温保护、过充电保护、过放电保护等,可以保证充......
  • FS4059A是5V升压8.4V锂电池充电IC
    FS4059A是5V升压8.4V锂电池充电IC一、概述FS4059A是一种高效、低功耗的5V升压8.4V锂电池充电IC,它集成了多种先进的充电管理功能,如过温保护、过充电保护、过放电保护等,为此电外池,F充S电4提0供5全9方A位还的具保有护简。单易用的外设接口,方便用户进行充电控制和状态查询。二、特点5V......
  • AH6971-9V-15v电压升降12V2A芯片解决方案:参数特性和应用领域
    9V-15V升降12V2A芯片解决方案:参数特性和应用领域随着科技的发展,各种智能设备的需求在不断增长,而电源作为智能设备的重要组成部分,其稳定性和效率直接影响着设备的性能。在此背景下,9V-15V升降12V2A芯片解决方案应运而生。参数特性:宽输入电压范围:5V~35V,能够适应多种电源环境。高效......
  • 基于高性能Cortex®-M7内核STM32F765VGT7、STM32F745IET6嵌入式微控制器
    STM32F732位MCU+FPU基于高性能的ARM®Cortex-M732位RISC内核®,工作频率高达216MHz。Cortex®-M7内核具有单浮点单元(SFPU)精度,支持所有ARM®单精度数据处理指令与数据类型。同时执行全套DSP指令和存储保护单元(MPU),增强应用安全性。1、STM32F765VGT7ICMCU32BIT1MB......