Microphone input functional and mostly calibrated!
This commit is contained in:
264
Core/Src/main.c
264
Core/Src/main.c
@@ -24,7 +24,7 @@
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
#include <stdbool.h>
|
||||
//#include <stdio.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* USER CODE END Includes */
|
||||
@@ -71,7 +71,7 @@ static void MX_TIM6_Init(void);
|
||||
static void MX_ADC3_Init(void);
|
||||
/* USER CODE BEGIN PFP */
|
||||
|
||||
void updateWS2812BData(void);
|
||||
uint8_t getSoundLevel(void);
|
||||
void LEDDesign_Off(void);
|
||||
void LEDDesign_ColorWhite(void);
|
||||
void LEDDesign_ColorBlue(void);
|
||||
@@ -80,12 +80,20 @@ void LEDDesign_ColorRed(void);
|
||||
void LEDDesign_Crazy(void);
|
||||
void LEDDesign_Smile(void);
|
||||
void LEDDesign_SuperCrazy(void);
|
||||
void updateWS2812BData(void);
|
||||
|
||||
/* USER CODE END PFP */
|
||||
|
||||
/* Private user code ---------------------------------------------------------*/
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
int _write(int32_t file, uint8_t *ptr, int32_t len)
|
||||
{
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
ITM_SendChar(*ptr++);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/**
|
||||
@@ -123,6 +131,8 @@ int main(void)
|
||||
|
||||
updateWS2812BData();
|
||||
HAL_SPI_Transmit_IT(&hspi4, (uint8_t*) &LEDData, (uint16_t) 66 * 3 * 3);
|
||||
HAL_ADC_Start(&hadc3);
|
||||
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
@@ -231,7 +241,7 @@ static void MX_ADC3_Init(void)
|
||||
hadc3.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
|
||||
hadc3.Init.Resolution = ADC_RESOLUTION_8B;
|
||||
hadc3.Init.ScanConvMode = DISABLE;
|
||||
hadc3.Init.ContinuousConvMode = ENABLE;
|
||||
hadc3.Init.ContinuousConvMode = DISABLE;
|
||||
hadc3.Init.DiscontinuousConvMode = DISABLE;
|
||||
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
||||
hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
||||
@@ -606,116 +616,36 @@ static void MX_GPIO_Init(void)
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 4 */
|
||||
void updateWS2812BData(void){
|
||||
uint8_t byteToConvert;
|
||||
for (uint8_t i = 0; i < 64; ++i) {
|
||||
for (uint8_t j = 0; j < 3; ++j) {
|
||||
byteToConvert = LEDData[i][j];
|
||||
switch((byteToConvert & 0xF0) >> 4){
|
||||
case 0x00:
|
||||
WS2812BConvertedData = 0x00924000;
|
||||
break;
|
||||
case 0x01:
|
||||
WS2812BConvertedData = 0x00926000;
|
||||
break;
|
||||
case 0x02:
|
||||
WS2812BConvertedData = 0x00934000;
|
||||
break;
|
||||
case 0x03:
|
||||
WS2812BConvertedData = 0x00936000;
|
||||
break;
|
||||
case 0x04:
|
||||
WS2812BConvertedData = 0x009A4000;
|
||||
break;
|
||||
case 0x05:
|
||||
WS2812BConvertedData = 0x009A6000;
|
||||
break;
|
||||
case 0x06:
|
||||
WS2812BConvertedData = 0x009B4000;
|
||||
break;
|
||||
case 0x07:
|
||||
WS2812BConvertedData = 0x009B6000;
|
||||
break;
|
||||
case 0x08:
|
||||
WS2812BConvertedData = 0x00D24000;
|
||||
break;
|
||||
case 0x09:
|
||||
WS2812BConvertedData = 0x00D26000;
|
||||
break;
|
||||
case 0x0A:
|
||||
WS2812BConvertedData = 0x00D34000;
|
||||
break;
|
||||
case 0x0B:
|
||||
WS2812BConvertedData = 0x00D36000;
|
||||
break;
|
||||
case 0x0C:
|
||||
WS2812BConvertedData = 0x00DA4000;
|
||||
break;
|
||||
case 0x0D:
|
||||
WS2812BConvertedData = 0x00DA6000;
|
||||
break;
|
||||
case 0x0E:
|
||||
WS2812BConvertedData = 0x00DB4000;
|
||||
break;
|
||||
default: // 0x0F
|
||||
WS2812BConvertedData = 0x00DB6000;
|
||||
uint8_t getSoundLevel(void){
|
||||
// Adjustment / Calibration
|
||||
static uint8_t divisor = 2;
|
||||
static uint8_t postscale_DownShift = 0;
|
||||
static uint8_t prescale_DownShift = 180;
|
||||
static uint8_t multiplier = 3;
|
||||
|
||||
}
|
||||
switch(byteToConvert & 0x0F){
|
||||
case 0x00:
|
||||
WS2812BConvertedData |= 0x00000924;
|
||||
break;
|
||||
case 0x01:
|
||||
WS2812BConvertedData |= 0x00000926;
|
||||
break;
|
||||
case 0x02:
|
||||
WS2812BConvertedData |= 0x00000934;
|
||||
break;
|
||||
case 0x03:
|
||||
WS2812BConvertedData |= 0x00000936;
|
||||
break;
|
||||
case 0x04:
|
||||
WS2812BConvertedData |= 0x000009A4;
|
||||
break;
|
||||
case 0x05:
|
||||
WS2812BConvertedData |= 0x000009A6;
|
||||
break;
|
||||
case 0x06:
|
||||
WS2812BConvertedData |= 0x000009B4;
|
||||
break;
|
||||
case 0x07:
|
||||
WS2812BConvertedData |= 0x000009B6;
|
||||
break;
|
||||
case 0x08:
|
||||
WS2812BConvertedData |= 0x00000D24;
|
||||
break;
|
||||
case 0x09:
|
||||
WS2812BConvertedData |= 0x00000D26;
|
||||
break;
|
||||
case 0x0A:
|
||||
WS2812BConvertedData |= 0x00000D34;
|
||||
break;
|
||||
case 0x0B:
|
||||
WS2812BConvertedData |= 0x00000D36;
|
||||
break;
|
||||
case 0x0C:
|
||||
WS2812BConvertedData |= 0x00000DA4;
|
||||
break;
|
||||
case 0x0D:
|
||||
WS2812BConvertedData |= 0x00000DA6;
|
||||
break;
|
||||
case 0x0E:
|
||||
WS2812BConvertedData |= 0x00000DB4;
|
||||
break;
|
||||
default: // 0x0F
|
||||
WS2812BConvertedData |= 0x00000DB6;
|
||||
static uint16_t averagedDifferences = 0;
|
||||
uint16_t returnValue;
|
||||
uint8_t samples[16];
|
||||
uint16_t sumOfDifferences = 0;
|
||||
|
||||
}
|
||||
LEDData_WS2812B[i][j][0] = (WS2812BConvertedData & 0x00FF0000) >> 16;
|
||||
LEDData_WS2812B[i][j][1] = (WS2812BConvertedData & 0x0000FF00) >> 8;
|
||||
LEDData_WS2812B[i][j][2] = WS2812BConvertedData & 0x000000FF;
|
||||
}
|
||||
for(uint8_t i = 0; i < sizeof(samples); ++i){
|
||||
HAL_Delay(1);
|
||||
HAL_ADC_Start(&hadc3);
|
||||
HAL_ADC_PollForConversion(&hadc3, (uint32_t) 20);
|
||||
samples[i] = HAL_ADC_GetValue(&hadc3);
|
||||
}
|
||||
|
||||
for(uint8_t i = 0; i < sizeof(samples) - 1; ++i){
|
||||
sumOfDifferences += abs(samples[i] - samples[i + 1]);
|
||||
}
|
||||
|
||||
averagedDifferences += ((int32_t) sumOfDifferences - (int32_t) averagedDifferences) / 4;
|
||||
|
||||
if(averagedDifferences < prescale_DownShift){returnValue = 0;}else{returnValue = averagedDifferences - prescale_DownShift;}
|
||||
returnValue = (returnValue / divisor) * multiplier;
|
||||
if(returnValue < postscale_DownShift){returnValue = 0;}else{returnValue -= postscale_DownShift;}
|
||||
|
||||
if(returnValue >= 0xFF){return 0xFF;} else{return returnValue;}
|
||||
}
|
||||
void LEDDesign_Off(void){
|
||||
for(uint8_t i = 0; i < 64; ++i){
|
||||
@@ -773,6 +703,7 @@ void LEDDesign_Crazy(void){
|
||||
}
|
||||
}
|
||||
void LEDDesign_Smile(void){
|
||||
uint8_t currentSoundLevel = getSoundLevel();
|
||||
LEDData[0][0] = 0x00;
|
||||
LEDData[0][1] = 0x00;
|
||||
LEDData[0][2] = 0x00;
|
||||
@@ -981,6 +912,117 @@ void LEDDesign_SuperCrazy(void){
|
||||
LEDData[i][2] = randomByte;
|
||||
}
|
||||
}
|
||||
void updateWS2812BData(void){
|
||||
uint8_t byteToConvert;
|
||||
for (uint8_t i = 0; i < 64; ++i) {
|
||||
for (uint8_t j = 0; j < 3; ++j) {
|
||||
byteToConvert = LEDData[i][j];
|
||||
switch((byteToConvert & 0xF0) >> 4){
|
||||
case 0x00:
|
||||
WS2812BConvertedData = 0x00924000;
|
||||
break;
|
||||
case 0x01:
|
||||
WS2812BConvertedData = 0x00926000;
|
||||
break;
|
||||
case 0x02:
|
||||
WS2812BConvertedData = 0x00934000;
|
||||
break;
|
||||
case 0x03:
|
||||
WS2812BConvertedData = 0x00936000;
|
||||
break;
|
||||
case 0x04:
|
||||
WS2812BConvertedData = 0x009A4000;
|
||||
break;
|
||||
case 0x05:
|
||||
WS2812BConvertedData = 0x009A6000;
|
||||
break;
|
||||
case 0x06:
|
||||
WS2812BConvertedData = 0x009B4000;
|
||||
break;
|
||||
case 0x07:
|
||||
WS2812BConvertedData = 0x009B6000;
|
||||
break;
|
||||
case 0x08:
|
||||
WS2812BConvertedData = 0x00D24000;
|
||||
break;
|
||||
case 0x09:
|
||||
WS2812BConvertedData = 0x00D26000;
|
||||
break;
|
||||
case 0x0A:
|
||||
WS2812BConvertedData = 0x00D34000;
|
||||
break;
|
||||
case 0x0B:
|
||||
WS2812BConvertedData = 0x00D36000;
|
||||
break;
|
||||
case 0x0C:
|
||||
WS2812BConvertedData = 0x00DA4000;
|
||||
break;
|
||||
case 0x0D:
|
||||
WS2812BConvertedData = 0x00DA6000;
|
||||
break;
|
||||
case 0x0E:
|
||||
WS2812BConvertedData = 0x00DB4000;
|
||||
break;
|
||||
default: // 0x0F
|
||||
WS2812BConvertedData = 0x00DB6000;
|
||||
|
||||
}
|
||||
switch(byteToConvert & 0x0F){
|
||||
case 0x00:
|
||||
WS2812BConvertedData |= 0x00000924;
|
||||
break;
|
||||
case 0x01:
|
||||
WS2812BConvertedData |= 0x00000926;
|
||||
break;
|
||||
case 0x02:
|
||||
WS2812BConvertedData |= 0x00000934;
|
||||
break;
|
||||
case 0x03:
|
||||
WS2812BConvertedData |= 0x00000936;
|
||||
break;
|
||||
case 0x04:
|
||||
WS2812BConvertedData |= 0x000009A4;
|
||||
break;
|
||||
case 0x05:
|
||||
WS2812BConvertedData |= 0x000009A6;
|
||||
break;
|
||||
case 0x06:
|
||||
WS2812BConvertedData |= 0x000009B4;
|
||||
break;
|
||||
case 0x07:
|
||||
WS2812BConvertedData |= 0x000009B6;
|
||||
break;
|
||||
case 0x08:
|
||||
WS2812BConvertedData |= 0x00000D24;
|
||||
break;
|
||||
case 0x09:
|
||||
WS2812BConvertedData |= 0x00000D26;
|
||||
break;
|
||||
case 0x0A:
|
||||
WS2812BConvertedData |= 0x00000D34;
|
||||
break;
|
||||
case 0x0B:
|
||||
WS2812BConvertedData |= 0x00000D36;
|
||||
break;
|
||||
case 0x0C:
|
||||
WS2812BConvertedData |= 0x00000DA4;
|
||||
break;
|
||||
case 0x0D:
|
||||
WS2812BConvertedData |= 0x00000DA6;
|
||||
break;
|
||||
case 0x0E:
|
||||
WS2812BConvertedData |= 0x00000DB4;
|
||||
break;
|
||||
default: // 0x0F
|
||||
WS2812BConvertedData |= 0x00000DB6;
|
||||
|
||||
}
|
||||
LEDData_WS2812B[i][j][0] = (WS2812BConvertedData & 0x00FF0000) >> 16;
|
||||
LEDData_WS2812B[i][j][1] = (WS2812BConvertedData & 0x0000FF00) >> 8;
|
||||
LEDData_WS2812B[i][j][2] = WS2812BConvertedData & 0x000000FF;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* USER CODE END 4 */
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user