【雕爷学编程】Arduino动手做(149)---MAX9814咪头传感器模块7

news2024/11/24 13:32:15

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器

在这里插入图片描述
在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器

项目五十二:Adafruit_NeoPixel库的音乐可视化环灯

Arduino实验开源代码

/*

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

  实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器

 项目五十二:Adafruit_NeoPixel库的音乐可视化环灯

*/

#include <Adafruit_NeoPixel.h>

#define MIC A0 // 麦克风与A0相连接

#define LED_PIN 6 // LED are connected to D6

#define N_PIXELS 12 // Number of LED 

#define N 100 //样本数 

#define fadeDelay 10 // 淡出量

#define noiseLevel 15 // 降噪下限

Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int samples[N]; // 存储样本

int periodFactor = 0; // 用于周期计算

int t1 = -1;

int T;

int slope;

byte periodChanged = 0;

void setup() {

 // Serial.begin(9600);

 strip.begin();

 ledsOff();

 delay(500);

 displayColor(Wheel(100));

 strip.show();

 delay(500);

}

void loop() {

 Samples();

}

void Samples() {

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

  samples[i] = analogRead(0);

  if (i > 0) {

   slope = samples[i] - samples[i - 1];

  }

  else {

   slope = samples[i] - samples[N - 1];

  }

  if (abs(slope) > noiseLevel) {

   if (slope < 0) {

    calculatePeriod(i);

    if (periodChanged == 1) {

     displayColor(getColor(T));

    }

   }

  }

  else {

   ledsOff();

  }

  periodFactor += 1;

  delay(1);

 }

}

void calculatePeriod(int i) {

 if (t1 == -1) {

  t1 = i;

 }

 else {

  int period = periodFactor * (i - t1);

  periodChanged = T == period ? 0 : 1;

  T = period;

  // Serial.println(T);

  t1 = i;

  periodFactor = 0;

 }

}

uint32_t getColor(int period) {

 if (period == -1)

  return Wheel(0);

 else if (period > 400)

  return Wheel(5);

 else

  return Wheel(map(-1 * period, -400, -1, 50, 255));

}

void fadeOut()

{

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

  strip.setBrightness(110 - i * 20);

  strip.show(); // Update strip

  delay(fadeDelay);

  periodFactor += fadeDelay;

 }

}

void fadeIn() {

 strip.setBrightness(100);

 strip.show();

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

  //strip.setBrightness(20*i + 30);

  //strip.show();

  delay(fadeDelay);

  periodFactor += fadeDelay;

 }

}

void ledsOff() {

 fadeOut();

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

  strip.setPixelColor(i, 0, 0, 0);

 }

}

void displayColor(uint32_t color) {

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

  strip.setPixelColor(i, color);

 }

 fadeIn();

}

uint32_t Wheel(byte WheelPos) {

 // Serial.println(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】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器

项目五十二:Adafruit_NeoPixel库的音乐可视化环灯

实验视频剪辑

https://v.youku.com/v_show/id_XNTgxMTg4NTQzMg==.html?spm=a2hcb.playlsit.page.1

实验场景 动态图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器

项目五十三:十六位直条WS2812音乐可视化柱灯

Arduino实验开源代码

/*

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

  实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器

 项目五十三:十六位直条WS2812音乐可视化柱灯

*/

#include <Adafruit_NeoPixel.h>

#define N_PIXELS 16 // Number of pixels in strand

#define MIC_PIN  A0 // Microphone is attached to this analog pin

#define LED_PIN  6 // NeoPixel LED strand is connected to this pin

#define DC_OFFSET 0 // DC offset in mic signal - if unusure, leave 0

#define NOISE   300 // Noise/hum/interference in mic signal

#define SAMPLES  50 // Length of buffer for dynamic level adjustment

#define TOP    (N_PIXELS + 2) // Allow dot to go slightly off scale

#define PEAK_FALL 60 // Rate of peak falling dot

byte

peak   = 0,   // Used for falling dot

dotCount = 0,   // Frame counter for delaying dot-falling speed

volCount = 0;   // Frame counter for storing past volume data

int

vol[SAMPLES],    // Collection of prior volume samples

  lvl    = 100,   // Current "dampened" audio level

  minLvlAvg = 0,   // For dynamic adjustment of graph low & high

  maxLvlAvg = 512;

Adafruit_NeoPixel

strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {

 // This is only needed on 5V Arduinos (Uno, Leonardo, etc.).

 // Connect 3.3V to mic AND TO AREF ON ARDUINO and enable this

 // line. Audio samples are 'cleaner' at 3.3V.

 // COMMENT OUT THIS LINE FOR 3.3V ARDUINOS (FLORA, ETC.):

  

 analogReference(EXTERNAL);

 memset(vol, 0, sizeof(vol));

 strip.setBrightness(66);

 strip.begin();

}

void loop() {

 uint8_t i;

 uint16_t minLvl, maxLvl;

 int   n, height;

 n  = analogRead(MIC_PIN);  // Raw reading from mic

 n  = abs(n - 512 - DC_OFFSET); // Center on zero

 n  = (n <= NOISE) ? 0 : (n - NOISE);       // Remove noise/hum

 lvl = ((lvl * 7) + n) >> 3;  // "Dampened" reading (else looks twitchy)

 // Calculate bar height based on dynamic min/max levels (fixed point):

 height = TOP * (lvl - minLvlAvg) / (long)(maxLvlAvg - minLvlAvg);

 if (height < 0L)    height = 0;   // Clip output

 else if (height > TOP) height = TOP;

 if (height > peak)   peak  = height; // Keep 'peak' dot at top

 // Color pixels based on rainbow gradient

 for (i = 0; i < N_PIXELS; i++) {

  if (i >= height)        strip.setPixelColor(i,  0,  0, 0);

  else strip.setPixelColor(i, Wheel(map(i, 0, strip.numPixels() - 1, 30, 150)));

 }

 // Draw peak dot

 if (peak > 0 && peak <= N_PIXELS - 1) strip.setPixelColor(peak, Wheel(map(peak, 0, strip.numPixels() - 1, 30, 150)));

 strip.show(); // Update strip

 // Every few frames, make the peak pixel drop by 1:

 if (++dotCount >= PEAK_FALL) { //fall rate

  if (peak > 0) peak--;

  dotCount = 0;

 }

 vol[volCount] = n;           // Save sample for dynamic leveling

 if (++volCount >= SAMPLES) volCount = 0; // Advance/rollover sample counter

 // Get volume range of prior frames

 minLvl = maxLvl = vol[0];

 for (i = 1; i < SAMPLES; i++) {

  if (vol[i] < minLvl)   minLvl = vol[i];

  else if (vol[i] > maxLvl) maxLvl = vol[i];

 }

 // minLvl and maxLvl indicate the volume range over prior frames, used

 // for vertically scaling the output graph (so it looks interesting

 // regardless of volume level). If they're too close together though

 // (e.g. at very low volume levels) the graph becomes super coarse

 // and 'jumpy'...so keep some minimum distance between them (this

 // also lets the graph go to zero when no sound is playing):

 if ((maxLvl - minLvl) < TOP) maxLvl = minLvl + TOP;

 minLvlAvg = (minLvlAvg * 63 + minLvl) >> 6; // Dampen min/max levels

 maxLvlAvg = (maxLvlAvg * 63 + maxLvl) >> 6; // (fake rolling average)

}

// Input a value 0 to 255 to get a color value.

// The colors are a transition r - g - b - back to r.

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话筒声音放大/咪头传感器

项目五十三:十六位直条WS2812音乐可视化柱灯

实验视频剪辑

https://v.youku.com/v_show/id_XNTgxMTkwNjMwNA==.html?spm=a2hcb.playlsit.page.1

实验场景动态图

在这里插入图片描述

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

实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器

项目五十四:八段分频8X8点阵屏的音乐频谱灯

Arduino实验开源代码

/*

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

  实验一百四十九:MAX9814麦克风放大器模块 MIC话筒声音放大/咪头传感器

 项目五十四:八段分频8X8点阵屏的音乐频谱灯

接脚连线:MAX9814 接A0

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话筒声音放大/咪头传感器

项目五十四:八段分频8X8点阵屏的音乐频谱灯

实验视频剪辑

https://v.youku.com/v_show/id_XNTgxMjY3Nzc4MA==.html?firsttime=0

实验场景动态图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​LeetCode解法汇总​979. 在二叉树中分配硬币

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给定一个有 N 个结点的二叉树的根结点 root&#xff0c;树中的每个结点上都对应…

从0到1学习Yalmip工具箱(2)-决策变量进阶

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 1.决策变量的定义 1.1 sdpvar 上文简单介绍了sdpvar函数的用法&#xff0c;接下来将对其进行详细介绍。复习一下&#xff0c;sdpvar函数的基本语…

模板方法模式:简化代码,提高复用性

在软件开发中&#xff0c;我们经常会遇到一些算法或业务流程&#xff0c;其中的步骤或顺序是固定的&#xff0c;但某些步骤的具体实现方式可能会有所不同。这时&#xff0c;模板方法模式就能派上用场。模板方法模式是一种行为设计模式&#xff0c;它定义了一个算法的骨架&#…

环肽科研试剂:161552-03-0,Cyclo(-Arg-Gly-Asp-D-Phe-Lys),IC50为0.94nM

资料编辑|陕西新研博美生物科技有限公司小编MISSwu 五元环肽Cyclo(-Arg-Gly-Asp-D-Phe-Lys) &#xff08;CAS号&#xff1a;161552-03-0&#xff09;&#xff0c;是αvβ3整联蛋白的有效和选择性抑制剂&#xff0c;IC50为0.94nM。可以高放射化学纯度&#xff08;>97&#xf…

高数笔记2(第一章函数 极限 连续-无穷小量与无穷大量)

目录 二、无穷小量与无穷大量概念 &#xff08;1&#xff09;无穷小的概念&#xff08;2&#xff09;无穷小的性质无穷个无穷小的和不是无穷小-证明无穷个无穷小量的乘积不是无穷小-证明&#xff08;没看懂&#xff09;无穷小量与有界量的乘积仍是无穷小-证明 &#xff08;3&am…

IIS部署vue项目刷新404问题

在dist目录下新建web.config文件 <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><rewrite><rules><rule name"Handle History Mode and custom 404/500" stopProcessing"t…

前端(六)——TypeScript在前端中的重要性与应用

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;TypeScript在前端中的重要性与应用 文章目录 什么是TypeScript&#xff1f;TypeScript与JavaScript的关系如何使用TypeScriptTypeScript在前端开发中的应用场景提升开发效率减少错误和调试时间优化…

剑指offer04:在有序二维数组中查找某个数字

文章目录 一、题目描述二、解题思路与代码实现1.解题思路2.代码实现 一、题目描述 二、解题思路与代码实现 1.解题思路 方法一&#xff1a; 暴力遍历&#xff0c;可以做剪枝操作&#xff0c;如果遍历的数字大于target&#xff0c;就直接break。 方法二&#xff1a; 二分查找…

javaweb使用Thymeleaf 最凝练的CRUD项目-下

javaweb使用Thymeleaf 最凝练的CRUD项目-下 10、执行保存 ①目标 提交表单后&#xff0c;将表单数据封装为Soldier对象&#xff0c;然后将Soldier对象保存到数据库。 ②思路 ③代码 [1]Servlet方法 protected void saveSoldier(HttpServletRequest request, HttpServletR…

第三方api对接怎么做?淘宝1688api接口怎么对接?

在今天的互联网上&#xff0c;第三方API对接是必不可少的。这种技术将不同的应用程序/服务连接在一起&#xff0c;创造了无限的可能性。 第三方api对接怎么做&#xff1f; 1、与支付公司签约 首先&#xff0c;通过正规的渠道&#xff0c;如支付公司官网或正规服务商&#xf…

spring boot学习第二篇:spring boot2.6.4版本启动接口服务

1、先启动好 参考我的spring boot学习第一篇文档&#xff1a;spring boot 1.5.x版本启动接口服务_veminhe的博客-CSDN博客 需要改动2个地方 pom.xml里面 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par…

第八章 SSD 电源管理

从 SATA 链路、PCIe 链路、NVMe 协议以及 SSD 内部主控管理等方面介绍 SSD 上的电源管理技术。 8.1 SATA 省电模式 Partial 和 Slumber PHY&#xff1a;物理层。 1. SATA 提供了两种低功耗模式&#xff0c;Partial 和 Slumber&#xff1a; &#xff08;1&#xff09; Part…

复习Javascript数组

JavaScript 数组 JS 数字属性JS 数组方法 JavaScript 数组用于在单一变量中存储多个值。 var cars ["Saab", "Volvo", "BMW"]; 什么是数组&#xff1f; 数组是一种特殊的变量&#xff0c;它能够一次存放一个以上的值。 如果您有一个项目清…

[GFCTF 2021]Baby_Web(CVE-2021-41773) 从一道题入门PHP代码审计 (保姆级)

[GFCTF 2021]Baby_Web(CVE-2021-41773) 题目标签&#xff1a;WEB、PHP、CVE-2021-41773、变量覆盖 做后考点总结&#xff1a;CVEPHP中量代码审计 CVE-2021-41773是一个Apache Httpd Server 路径穿越漏洞 详情见&#xff1a;CVE-2021-41773_Jay 17的博客-CSDN博客 在源码中…

Docker安全开放远程访问连接权限

1、Docker完全开放远程访问 Docker服务完全开放对外访问权限操作如下&#xff1a; # 开启端口命令 &#xff08;--permanent永久生效&#xff0c;没有此参数重启后失效&#xff09; firewall-cmd --zonepublic --add-port2375/tcp --permanent # 重新载入 firewall-cmd --re…

模型与计算平台

说明&#xff1a;部分内容摘自参考文献&#xff0c;如有侵权&#xff0c;联系删除 模型概念 计算量 FLOPs FLOPs&#xff1a;floating point operations 指的是浮点运算次数&#xff0c;理解为计算量&#xff0c;可以用来衡量算法/模型时间的复杂度, 单位是 FLOPs。FLOPS&…

【Arduino小车实践】陀螺仪的使用

一、MPU6050简介 MPU6050是一款陀螺仪模块&#xff0c;可以测量X、Y、Z三轴的角速度和加速度&#xff0c;还带有温度传感器和数字运动处理器(DMP)。 二、学习步骤 1. I2C协议 MPU6050是通过I2C协议进行驱动的&#xff0c;配置寄存器和获取数据都需要通过I2C协议去实现开发板与…

OpenMMLab MMTracking目标跟踪环境搭建(一)

1、环境搭建 创建conda虚拟环境并激活。 conda create -n mmtrack python3.8 -y conda activate mmtrack 按照官方说明安装 PyTorch 和 torchvision 可以通过指定版本号切换到其他版本。 #如果网不好&#xff0c;可以这样安装 pip3 install torch1.8.2cu102 torchvision0.9…

基于SpringBoot+vue的校园闲置物品租售系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

postman:模拟发送一个需要 cookie 认证的请求

目录 前言&#xff1a; 1、chrome 已安装插件 intercept。 2、chrome 浏览器要设置打开&#xff0c;在运行期间浏览器要一直打开。 3、本人是用 fiddler 对 app 的请求进行抓包&#xff0c;也可以使用其他工具。查看 headers 里的 cookie&#xff0c;并复制。 4、将复制的…