用Arduino打造会"张嘴"的LED点阵屏

ChangeCode
原创
发布时间: 2025-06-14 15:15:29 | 阅读数 0收藏数 0评论数 0
封面
本项目通过Arduino Uno结合FC-04声音传感器与MAX7219驱动的8x8点阵屏,实现声音可视化互动装置。当环境音量变化时,LED点阵会动态显示从微笑到张大嘴的四种口型变化。利用声音模块实时采集声压信号,经Arduino处理后转换为对应表情帧,最终通过级联寄存器驱动点阵屏呈现生动动画效果。

准备工作:

材料:

Arduino Uno主板、FC-04声音模块、MAX7219驱动板、8x8红色点阵屏、杜邦线10根(5公对公+5母对公)、USB数据线

1

材料准备

Arduino Uno主板、FC-04声音模块、MAX7219驱动板、8x8红色点阵屏、杜邦线10根(5公对公+5母对公)、USB数据线

2

电路接线图

  1. MAX7219模块:VCC接5V,GND共地,DIN接D12,CS接D10,CLK接D11
  2. FC-04模块:AO引脚接A0,GND共地,VCC接3.3V
  3. 点阵屏与驱动板通过排针直连
3

库文件安装

  1. 在Arduino IDE中安装LedControl库
  2. 通过库管理器搜索安装或手动导入
4

初始化设置


5

声音检测校准

  1. 串口监视器读取环境基准噪音值
  2. 设置静态阈值:quiet=300,loud=700
  3. 添加20ms消抖延时防止误触发
6

设计口型图案

使用8x8十六进制矩阵定义5种嘴型:

byte Mouth1[8] = {0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}; //闭嘴 闷
byte Mouth2[8] = {0x00,0x00,0x7E,0x81,0xFF,0x00,0x00,0x00}; //小口 哼
byte Mouth3[8] = {0x00,0x00,0x7E,0x81,0x81,0x7E,0x00,0x00}; //张口 啊
byte Mouth4[8] = {0x00,0x3C,0x42,0x81,0x81,0x42,0x3C,0x00}; //中口 哈
byte Mouth5[8] = {0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C}; //大口 大声
7

主程序逻辑

#include <LedControl.h>

int DIN = 12;//SPI模式,MOSI主设备输出,从设备输入
int CS = 10;//SPI模式,CS片选
int CLK = 11;//SPI模式,CLK

int sound = 0;//声音

byte Mouth1[8] = {0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}; //闭嘴 闷
byte Mouth2[8] = {0x00,0x00,0x7E,0x81,0xFF,0x00,0x00,0x00}; //小口 哼
byte Mouth3[8] = {0x00,0x00,0x7E,0x81,0x81,0x7E,0x00,0x00}; //张口 啊
byte Mouth4[8] = {0x00,0x3C,0x42,0x81,0x81,0x42,0x3C,0x00}; //中口 哈
byte Mouth5[8] = {0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C}; //大口 大声

LedControl lc = LedControl(DIN, CLK, CS, 0);//新建一个类对象

void setup()
{
pinMode(A1,INPUT);
Serial.begin(9600);
lc.shutdown(0, false); //初始化时设置点阵为正常使用模式
lc.setIntensity(0, 1); //设置亮度值,范围0~15
lc.clearDisplay(0); //点阵清屏
}

void loop()
{
sound = map(analogRead(A1),0,1024,1,150);

if(sound > 0 && sound <= 50){
printByte(Mouth1);
}else if(sound > 50 && sound <= 100){
printByte(Mouth2);
}else if(sound > 100 && sound <= 130){
printByte(Mouth3);
}else if(sound > 130 && sound <= 148){
printByte(Mouth4);
}else{
printByte(Mouth5);
}

Serial.println(sound);
delay(20);
}

void printByte(byte character [])
{
int i = 0;
for (i = 0; i < 8; i++)
{
lc.setRow(0, i, character[i]);//设置点阵单行8个LED状态,每行数据用16进制表示
}
}
8

实机调试

  1. 通过拍手/发声测试响应灵敏度
  2. 旋转FC-04模块上电位器调节增益
  3. 微调阈值参数优化表情过渡效果
  4. 测试最大识别距离(建议50cm内)
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载