【雕爷学编程】Arduino动手做(149)---MAX9814咪头传感器模块5
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器
项目四十一:六十四位音乐频谱灯十六位音乐反应动态频谱灯
Arduino实验开源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 | /* 【Arduino】168种传感器模块系列实验(资料代码 +图形编程 +仿真编程) 实验一百四十六:64位WS2812B 8 * 8 xRGB 5050 LED模块 ws2812s像素点阵屏 项目四十一:六十四位音乐频谱灯十六位音乐反应动态频谱灯 */ #include "FastLED.h" #define OCTAVE 1 // // Group buckets into octaves (use the log output function LOG_OUT 1) #define OCT_NORM 0 // Don't normalise octave intensities by number of bins #define FHT_N 256 // set to 256 point fht #include <FHT.h> // include the library //int noise[] = {204,188,68,73,150,98,88,68}; // noise level determined by playing pink noise and seeing levels [trial and error]{204,188,68,73,150,98,88,68} // int noise[] = {204,190,108,85,65,65,55,60}; // noise for mega adk int noise[] = {204, 195, 100, 90, 85, 80, 75, 75}; // noise for NANO //int noise[] = {204,198,100,85,85,80,80,80}; float noise_fact[] = {15, 7, 1.5, 1, 1.2, 1.4, 1.7, 3}; // noise level determined by playing pink noise and seeing levels [trial and error]{204,188,68,73,150,98,88,68} float noise_fact_adj[] = {15, 7, 1.5, 1, 1.2, 1.4, 1.7, 3}; // noise level determined by playing pink noise and seeing levels [trial and error]{204,188,68,73,150,98,88,68} #define LED_PIN 6 #define LED_TYPE WS2812 #define COLOR_ORDER GRB // Params for width and height const uint8_t kMatrixWidth = 8; const uint8_t kMatrixHeight = 8; //----------was 27 //#define NUM_LEDS (kMatrixWidth * kMatrixHeight) #define NUM_LEDS 64 CRGB leds[NUM_LEDS]; int counter2 = 0; void setup() { Serial.begin(9600); delay(1000); FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness (33); fill_solid(leds, NUM_LEDS, CRGB::Black); FastLED.show(); // TIMSK0 = 0; // turn off timer0 for lower jitter ADCSRA = 0xe5; // set the adc to free running mode ADMUX = 0x40; // use adc0 DIDR0 = 0x01; // turn off the digital input for adc0 } void loop() { int prev_j[8]; int beat = 0; int prev_oct_j; int counter = 0; int prev_beat = 0; int led_index = 0; int saturation = 0; int saturation_prev = 0; int brightness = 0; int brightness_prev = 0; while (1) { // reduces jitter cli(); // UDRE interrupt slows this way down on arduino1.0 for ( int i = 0 ; i < FHT_N ; i++) { // save 256 samples while (!(ADCSRA & 0x10)); // wait for adc to be ready ADCSRA = 0xf5; // restart adc byte m = ADCL; // fetch adc data byte j = ADCH; int k = (j << 8) | m; // form into an int k -= 0x0200; // form into a signed int k <<= 6; // form into a 16b signed int fht_input[i] = k; // put real data into bins } fht_window(); // window the data for better frequency response fht_reorder(); // reorder the data before doing the fht fht_run(); // process the data in the fht fht_mag_octave(); // take the output of the fht fht_mag_log() // every 50th loop, adjust the volume accourding to the value on A2 (Pot) if (counter >= 50) { ADMUX = 0x40 | (1 & 0x07); // set admux to look at Analogpin A1 - Master Volume while (!(ADCSRA & 0x10)); // wait for adc to be ready ADCSRA = 0xf5; // restart adc delay(10); while (!(ADCSRA & 0x10)); // wait for adc to be ready ADCSRA = 0xf5; // restart adc byte m = ADCL; // fetch adc data byte j = ADCH; int k = (j << 8) | m; // form into an int float master_volume = (k + 0.1) / 1000 + .75; // so the valu will be between ~0.5 and 1.---------------------+.75 was .5 Serial.println (master_volume); for ( int i = 1; i < 8; i++) { noise_fact_adj[i] = noise_fact[i] * master_volume; } ADMUX = 0x40 | (0 & 0x07); // set admux back to look at A0 analog pin (to read the microphone input counter = 0; } sei(); counter++; // End of Fourier Transform code - output is stored in fht_oct_out[i]. // i=0-7 frequency (octave) bins (don't use 0 or 1), fht_oct_out[1]= amplitude of frequency for bin 1 // for loop a) removes background noise average and takes absolute value b) low / high pass filter as still very noisy // c) maps amplitude of octave to a colour between blue and red d) sets pixel colour to amplitude of each frequency (octave) for ( int i = 1; i < 8; i++) { // goes through each octave. skip the first 1, which is not useful int j; j = (fht_oct_out[i] - noise[i]); // take the pink noise average level out, take the asbolute value to avoid negative numbers if (j < 10) { j = 0; } j = j * noise_fact_adj[i]; if (j < 10) { j = 0; } else { j = j * noise_fact_adj[i]; if (j > 180) { if (i >= 7) { beat += 2; } else { beat += 1; } } j = j / 30; j = j * 30; // (force it to more discrete values) } prev_j[i] = j; // Serial.print(j); // Serial.print(" "); // this fills in 11 LED's with interpolated values between each of the 8 OCT values if (i >= 2) { led_index = 2 * i - 3; prev_oct_j = (j + prev_j[i - 1]) / 2; saturation = constrain(j + 50, 0, 255); //-----------50 was 30 saturation_prev = constrain(prev_oct_j + 50, 0, 255); brightness = constrain(j, 0, 255); brightness_prev = constrain(prev_oct_j, 0, 255); if (brightness == 255) { saturation = 50; brightness = 200; } if (brightness_prev == 255) { saturation_prev = 50; brightness_prev = 200; } for (uint8_t y = 0; y < kMatrixHeight; y++) { leds[XY(led_index - 1, y)] = CHSV(j + y * 30, saturation, brightness); if (i > 2) { prev_oct_j = (j + prev_j[i - 1]) / 2; leds[ XY(led_index - 2, y)] = CHSV(prev_oct_j + y * 30, saturation_prev, brightness_prev); } } } } if (beat >= 7) { fill_solid(leds, NUM_LEDS, CRGB::Gray); FastLED.setBrightness(200); } else { if (prev_beat != beat) { FastLED.setBrightness(40 + beat * beat * 5); prev_beat = beat; } } FastLED.show(); if (beat) { counter2 += ((beat + 4) / 2 - 2); if (counter2 < 0) { counter2 = 1000; } if (beat > 3 && beat < 7) { FastLED.delay (20); } beat = 0; } // Serial.println(); } } // Param for different pixel layouts const bool kMatrixSerpentineLayout = false ; // Set 'kMatrixSerpentineLayout' to false if your pixels are // laid out all running the same way, like this: // Set 'kMatrixSerpentineLayout' to true if your pixels are // laid out back-and-forth, like this: uint16_t XY( uint8_t x, uint8_t y) { uint16_t i; if ( kMatrixSerpentineLayout == false ) { i = (y * kMatrixWidth) + x; } if ( kMatrixSerpentineLayout == true ) { if ( y & 0x01) { // Odd rows run backwards uint8_t reverseX = (kMatrixWidth - 1) - x; i = (y * kMatrixWidth) + reverseX; } else { // Even rows run forwards i = (y * kMatrixWidth) + x; } } i = (i + counter2) % NUM_LEDS; return i; } |
项目四十一:六十四位音乐频谱灯十六位音乐反应动态频谱灯
实验视频剪辑
https://v.youku.com/v_show/id_XNTgwODYyMzEwMA==.html?firsttime=0
Arduino实验场景图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器
项目四十二:快速哈特利变换FHT音乐反应灯条
Arduino实验开源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器 项目四十二:快速哈特利变换FHT音乐反应灯条 */ /* 这是带有 FastLED 的 FHT 库的项目 FHT 库位于 http://wiki.openmusiclabs.com/wiki/ArduinoFHT 开始的例子是: https://github.com/TJC/arduino/blob/master/fhttest/fhttest.cpp 注意:如果您使用的是由 3.3V 信号供电的麦克风,例如 Sparkfun MEMS 麦克风,则将 3.3V 连接到 AREF 引脚。 还要确保取消对 analogReference(EXTERNAL); 的注释。 在设置()中。 在线频率发生器 测试:http://onlinetonegenerator.com/frequency-sweep-generator.html */ #define qsubd(x, b) ((x>b)?wavebright:0) // A digital unsigned subtraction macro. if result <0, then => 0. Otherwise, take on fixed value. #define qsuba(x, b) ((x>b)?x-b:0) // Unsigned subtraction macro. if result <0, then => 0. #define wavebright 128 // qsubd result will be this value if subtraction is >0. #include "FastLED.h" // FastLED library. Preferably the latest copy of FastLED 2.1. #if FASTLED_VERSION < 3001000 #error "Requires FastLED 3.1 or later; check github for latest code." #endif // Fixed definitions cannot change on the fly. #define LED_DT 6 // Data pin to connect to the strip. //#define LED_CK 11 // Clock pin for APA102 or WS2801 #define COLOR_ORDER GRB // It's GRB for WS2812 #define LED_TYPE WS2812B // What kind of strip are you using (APA102, WS2801 or WS2812B) #define NUM_LEDS 16 // Number of LED's. // Initialize changeable global variables. uint8_t max_bright = 255; // Overall brightness definition. It can be changed on the fly. struct CRGB leds[NUM_LEDS]; // Initialize our LED array. #define LOG_OUT 1 #define FHT_N 256 // Set to 256 point fht. #define inputPin A0 //#define potPin A4 #include <FHT.h> // FHT library uint8_t hueinc = 0; // A hue increment value to make it rotate a bit. uint8_t micmult = 25; uint8_t fadetime = 900; uint8_t noiseval = 25; // Increase this to reduce sensitivity. 30 seems best for quiet void setup() { analogReference(EXTERNAL); // Connect 3.3V to AREF pin for any microphones using 3.3V Serial.begin(9600); // use the serial port LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); // LEDS.addLeds<LED_TYPE, LED_DT, LED_CK, COLOR_ORDER>(leds, NUM_LEDS); FastLED.setBrightness(max_bright); set_max_power_in_volts_and_milliamps(5, 500); // FastLED Power management set at 5V, 500mA. } void loop() { // noiseval = map(analogRead(potPin), 0, 1023, 16, 48); // Adjust sensitivity of cutoff. EVERY_N_MILLISECONDS(13) { fhtsound(); } show_at_max_brightness_for_power(); Serial.println(LEDS.getFPS(), DEC); // Display frames per second on the serial monitor. Serial.println( " " ); // Display frames per second on the serial monitor. Serial.println(analogRead(inputPin)); // print as an ASCII-encoded decimal */ } void fhtsound() { // hueinc++; // A cute little hue incrementer. GetFHT(); // Let's take FHT_N samples and crunch 'em. for ( int i = 0; i < NUM_LEDS; i++) { // Run through the LED array. int tmp = qsuba(fht_log_out[2 * i + 2], noiseval); // Get the sample and subtract the 'quiet' normalized values, but don't go < 0. if (tmp > (leds[i].r + leds[i].g + leds[i].b) / 2) // Refresh an LED only when the intensity is low leds[i] = CHSV((i * 4) + tmp * micmult, 255, tmp * micmult); // Note how we really cranked up the tmp value to get BRIGHT LED's. Also increment the hue for fun. leds[i].nscale8(fadetime); // Let's fade the whole thing over time as well. } } // fhtsound() void GetFHT() { cli(); for ( int i = 0 ; i < FHT_N ; i++) fht_input[i] = analogRead(inputPin); sei(); fht_window(); // Window the data for better frequency response. fht_reorder(); // Reorder the data before doing the fht. fht_run(); // Process the data in the fht. fht_mag_log(); } // GetFHT() |
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器
项目四十二:快速哈特利变换FHT音乐反应灯条
实验视频剪辑
https://v.youku.com/v_show/id_XNTgwODY0ODEyOA==.html?firsttime=0
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器
项目四十三:快速哈特利变换FHT音乐反应64位灯板
Arduino实验开源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器 项目四十三:快速哈特利变换FHT音乐反应64位灯板 */ /* 这是带有 FastLED 的 FHT 库的项目 FHT 库位于 http://wiki.openmusiclabs.com/wiki/ArduinoFHT 开始的例子是: https://github.com/TJC/arduino/blob/master/fhttest/fhttest.cpp 注意:如果您使用的是由 3.3V 信号供电的麦克风,例如 Sparkfun MEMS 麦克风,则将 3.3V 连接到 AREF 引脚。 还要确保取消对 analogReference(EXTERNAL); 的注释。 在设置()中。 在线频率发生器 测试:http://onlinetonegenerator.com/frequency-sweep-generator.html */ #define qsubd(x, b) ((x>b)?wavebright:0) // A digital unsigned subtraction macro. if result <0, then => 0. Otherwise, take on fixed value. #define qsuba(x, b) ((x>b)?x-b:0) // Unsigned subtraction macro. if result <0, then => 0. #define wavebright 128 // qsubd result will be this value if subtraction is >0. #include "FastLED.h" // FastLED library. Preferably the latest copy of FastLED 2.1. #if FASTLED_VERSION < 3001000 #error "Requires FastLED 3.1 or later; check github for latest code." #endif // Fixed definitions cannot change on the fly. #define LED_DT 6 // Data pin to connect to the strip. //#define LED_CK 11 // Clock pin for APA102 or WS2801 #define COLOR_ORDER GRB // It's GRB for WS2812 #define LED_TYPE WS2812B // What kind of strip are you using (APA102, WS2801 or WS2812B) #define NUM_LEDS 64 // Number of LED's. // Initialize changeable global variables. uint8_t max_bright = 255; // Overall brightness definition. It can be changed on the fly. struct CRGB leds[NUM_LEDS]; // Initialize our LED array. #define LOG_OUT 1 #define FHT_N 256 // Set to 256 point fht. #define inputPin A0 //#define potPin A4 #include <FHT.h> // FHT library uint8_t hueinc = 0; // A hue increment value to make it rotate a bit. uint8_t micmult = 25; uint8_t fadetime = 900; uint8_t noiseval = 25; // Increase this to reduce sensitivity. 30 seems best for quiet void setup() { analogReference(EXTERNAL); // Connect 3.3V to AREF pin for any microphones using 3.3V Serial.begin(9600); // use the serial port LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); // LEDS.addLeds<LED_TYPE, LED_DT, LED_CK, COLOR_ORDER>(leds, NUM_LEDS); FastLED.setBrightness(max_bright); set_max_power_in_volts_and_milliamps(5, 500); // FastLED Power management set at 5V, 500mA. } void loop() { // noiseval = map(analogRead(potPin), 0, 1023, 16, 48); // Adjust sensitivity of cutoff. EVERY_N_MILLISECONDS(13) { fhtsound(); } show_at_max_brightness_for_power(); Serial.println(LEDS.getFPS(), DEC); // Display frames per second on the serial monitor. Serial.println( " " ); // Display frames per second on the serial monitor. Serial.println(analogRead(inputPin)); // print as an ASCII-encoded decimal */ } void fhtsound() { // hueinc++; // A cute little hue incrementer. GetFHT(); // Let's take FHT_N samples and crunch 'em. for ( int i = 0; i < NUM_LEDS; i++) { // Run through the LED array. int tmp = qsuba(fht_log_out[2 * i + 2], noiseval); // Get the sample and subtract the 'quiet' normalized values, but don't go < 0. if (tmp > (leds[i].r + leds[i].g + leds[i].b) / 2) // Refresh an LED only when the intensity is low leds[i] = CHSV((i * 4) + tmp * micmult, 255, tmp * micmult); // Note how we really cranked up the tmp value to get BRIGHT LED's. Also increment the hue for fun. leds[i].nscale8(fadetime); // Let's fade the whole thing over time as well. } } // fhtsound() void GetFHT() { cli(); for ( int i = 0 ; i < FHT_N ; i++) fht_input[i] = analogRead(inputPin); sei(); fht_window(); // Window the data for better frequency response. fht_reorder(); // Reorder the data before doing the fht. fht_run(); // Process the data in the fht. fht_mag_log(); } // GetFHT() |
项目四十三:快速哈特利变换FHT音乐反应64位灯板
实验视频剪辑
https://v.youku.com/v_show/id_XNTgwODY2NzkzMg==.html?spm=a2hcb.playlsit.page.1
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器
项目四十四:Adafruit_NeoPixel音乐节奏灯板
Arduino实验开源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器 项目四十四:Adafruit_NeoPixel音乐节奏灯板 */ #include <Adafruit_NeoPixel.h> #include <math.h> #define N_PIXELS 64 #define MIC_PIN A0 #define LED_PIN 6 #define SAMPLE_WINDOW 5 #define PEAK_HANG 24 #define PEAK_FALL 4 #define INPUT_FLOOR 10 #define INPUT_CEILING 50 byte peak = 16; unsigned int sample; byte Count = 0; byte HangCount = 0; Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800); void setup() { Serial.begin(9600); analogReference(EXTERNAL); strip.setBrightness(22); strip.show(); strip.begin(); } float fscale( float originalMin, float originalMax, float newBegin, float newEnd, float inputValue, float curve) { float OriginalRange = 0; float NewRange = 0; float zeroRefCurVal = 0; float normalizedCurVal = 0; float rangedValue = 0; boolean invFlag = 0; if (curve > 10) curve = 10; if (curve < -10) curve = -10; curve = (curve * -.1) ; curve = pow(10, curve); if (inputValue < originalMin) { inputValue = originalMin; } if (inputValue > originalMax) { inputValue = originalMax; } OriginalRange = originalMax - originalMin; if (newEnd > newBegin) { NewRange = newEnd - newBegin; } else { NewRange = newBegin - newEnd; invFlag = 1; } zeroRefCurVal = inputValue - originalMin; normalizedCurVal = zeroRefCurVal / OriginalRange; // normalize to 0 - 1 float Serial.print(OriginalRange, DEC); Serial.print( " " ); Serial.print(NewRange, DEC); Serial.print( " " ); Serial.println(zeroRefCurVal, DEC); Serial.println(); delay(10); if (originalMin > originalMax ) { return 0; } if (invFlag == 0) { rangedValue = (pow(normalizedCurVal, curve) * NewRange) + newBegin; } else { rangedValue = newBegin - (pow(normalizedCurVal, curve) * NewRange); } return rangedValue; } void loop() { unsigned long startMillis = millis(); float peakToPeak = 0; unsigned int signalMax = 0; unsigned int signalMin = 1023; unsigned int c, y; while (millis() - startMillis < SAMPLE_WINDOW) { sample = analogRead(MIC_PIN); if (sample < 1024) { if (sample > signalMax) { signalMax = sample; } else if (sample < signalMin) { signalMin = sample; } } } peakToPeak = signalMax - signalMin; for ( int i = 0; i <= strip.numPixels() - 1; i++) { strip.setPixelColor(i, Wheel(map(i, 0, strip.numPixels() - 1, 30, 150))); } c = fscale(INPUT_FLOOR, INPUT_CEILING, strip.numPixels(), 0, peakToPeak, 2); if (c < peak) { peak = c; HangCount = 0; } if (c <= strip.numPixels()) { drawLine(strip.numPixels(), strip.numPixels() - c, strip.Color(0, 0, 0)); } y = strip.numPixels() - peak; strip.setPixelColor(y - 1, Wheel(map(y, 0, strip.numPixels() - 1, 30, 150))); strip.show(); if (HangCount > PEAK_HANG) { if (++Count >= PEAK_FALL) { peak++; Count = 0; } } else { HangCount++; } } void drawLine(uint8_t from , uint8_t to, uint32_t c) { uint8_t fromTemp; if ( from > to) { fromTemp = from ; from = to; to = fromTemp; } for ( int i = from ; i <= to; i++) { strip.setPixelColor(i, c); } } uint32_t Wheel( byte WheelPos) { if (WheelPos < 85) { return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } else if (WheelPos < 170) { WheelPos -= 85; return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } else { WheelPos -= 170; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } } |
Arduino实验场景图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器
项目四十四:Adafruit_NeoPixel音乐节奏灯板
实验视频剪辑
https://v.youku.com/v_show/id_XNTgwODgwMzk5Ng==.html?spm=a2hcb.playlsit.page.1
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器
项目四十五:动态音乐频谱仪
Arduino实验开源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器 项目四十五:动态音乐频谱仪 接脚连线: MAX7219 UNO VCC →→→→→ 5V GND →→→→→ GND DIN →→→→→ D12(数据,数据接收引脚) CS →→→→→ D11(负载,命令接收引脚) CLK →→→→→ D10(时钟,时钟引脚) */ #include "LedControl.h" /* Led matrix - Max7219 Declared */ LedControl lc = LedControl(12, 11, 10, 1); const int maxScale = 11; /* Sensor - Max9812 Declared */ const int sensorPin = A4; const int sampleWindow = 50; // 50ms = 20Hz unsigned int sample; unsigned long startMillis; unsigned long timeCycle; unsigned int signalMax = 0; unsigned int signalMin = 1024; unsigned char index = 0; unsigned int peakToPeak[8]; unsigned int displayPeak[8]; unsigned int temp[8]={0,0,0,0,0,0,0,0}; unsigned int signalMaxBuff[8]; unsigned int signalMinBuff[8]; void setup() { // Led matrix lc.shutdown(0, false ); // bật hiện thị lc.setIntensity(0, 1); // chỉnh độ sáng lc.clearDisplay(0); // tắt tất cả led Serial.begin(9600); } void loop() { startMillis = millis(); //peakToPeak = 0; signalMax = 0; signalMin = 1024; // Get data in 50ms while (millis() - startMillis < sampleWindow) { sample = analogRead(sensorPin); if (sample < 1024) { if (sample > signalMax) { signalMax = sample; } if (sample < signalMin) { signalMin = sample; } } // 20Hz - 64Hz - 125Hz - 250Hz - 500Hz - 1kHz (timeCycle = 1/F)(ms) timeCycle = millis() - startMillis; if (timeCycle == 1 || timeCycle == 2 || timeCycle == 4 || timeCycle == 8 || timeCycle == 16 || timeCycle == 32 || timeCycle == 40 || timeCycle == 50) { signalMaxBuff[index] = signalMax; signalMinBuff[index] = signalMin; index = (index + 1) % 8; delay(1); //Serial.println(timeCycle); } } // Delete pointer to array index = 0; // Calculation after get samples for ( int i = 0; i < 8; i++) { // i = row (led matrix) // sound level peakToPeak[i] = signalMaxBuff[i] - signalMinBuff[i]; // Map 1v p-p level to the max scale of the display displayPeak[i] = map(peakToPeak[i], 0, 1023, 0, maxScale); // Show to led matrix displayLed(displayPeak[i], i); // Led drop down if (displayPeak[i] >= temp[i]) { temp[i] = displayPeak[i]; } else { temp[i]--; } lc.setLed(0, i, temp[i], true ); delayMicroseconds(250); } } void displayLed( int displayPeak, int row) { switch (displayPeak) { case 0 : lc.setRow(0, row, 0x80); break ; case 1 : lc.setRow(0, row, 0xC0); break ; case 2 : lc.setRow(0, row, 0xE0); break ; case 3 : lc.setRow(0, row, 0xF0); break ; case 4 : lc.setRow(0, row, 0xF8); break ; case 5 : lc.setRow(0, row, 0xFC); break ; case 6 : lc.setRow(0, row, 0xFE); break ; case 7 : lc.setRow(0, row, 0xFF); break ; } } |
Arduino实验场景图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器
项目四十五:动态音乐频谱仪
实验视频剪辑
https://v.youku.com/v_show/id_XNTgxMDQ1Mjk4NA==.html?spm=a2hcb.playlsit.page.1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)