37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百五十二:ESP32-S3-RGB-LED矩阵 WiFi蓝牙陀螺仪姿态传感器QMI8658C开发板

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百五十二:ESP32-S3 RGB-LED矩阵开发板 Matrix陀螺仪QMI8658C模块
项目之六:ESP32S3矩阵Matrix开发板之循环显示文本字符
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百五十二:ESP32-S3 RGB-LED矩阵开发板 Matrix陀螺仪QMI8658C模块
项目之六:ESP32S3矩阵Matrix开发板之循环显示文本字符
*/
#include <Adafruit_NeoPixel.h>
#define LED_PIN 14
#define LED_COUNT 64 // 8x8矩阵,共64个LED
#define BRIGHTNESS 50 // 设置亮度
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);
// 定义 A-B-C-E-F-G 的 LED 点阵(正常显示)
const uint8_t alphabet[][8] = {
{0x3E, 0x09, 0x09, 0x09, 0x3E, 0x00, 0x00, 0x00}, // A
{0x3F, 0x25, 0x25, 0x25, 0x1A, 0x00, 0x00, 0x00}, // B
{0x1E, 0x21, 0x21, 0x21, 0x12, 0x00, 0x00, 0x00}, // C
{0x3F, 0x21, 0x21, 0x21, 0x1E, 0x00, 0x00, 0x00}, // E
{0x3F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x00, 0x00}, // F
{0x1E, 0x21, 0x29, 0x29, 0x3A, 0x00, 0x00, 0x00} // G
};
char textArray[] = {'A', 'B', 'C', 'E', 'F', 'G'};
int textIndex = 0;
void setup() {
strip.begin();
strip.setBrightness(BRIGHTNESS);
strip.show();
}
void loop() {
strip.clear();
displayCharacter(textArray[textIndex]); // 显示当前字符
textIndex = (textIndex + 1) % 6; // 循环切换字符
delay(1000); // 延时
}
void displayCharacter(char character) {
int index = getCharacterIndex(character);
if (index == -1) return;
for (int row = 0; row < 8; row++) {
uint8_t line = alphabet[index][row]; // 获取当前行数据
line = reverseBits(line); // **镜像翻转行数据**
for (int col = 0; col < 8; col++) {
if (line & (1 << col)) { // 判断该像素是否应该亮起
int ledIndex = row * 8 + col;
strip.setPixelColor(ledIndex, strip.Color(255, 255, 255)); // 显示白色
}
}
}
strip.show();
}
// **新增:左右翻转位数据**
uint8_t reverseBits(uint8_t b) {
uint8_t reversed = 0;
for (int i = 0; i < 8; i++) {
reversed <<= 1;
reversed |= (b & 1);
b >>= 1;
}
return reversed;
}
int getCharacterIndex(char character) {
for (int i = 0; i < 6; i++) {
if (textArray[i] == character) return i;
}
return -1;
}
这段代码的作用是让 WS2812 LED矩阵 按 A-B-C-D-F-G 的顺序循环显示字符。它的主要逻辑如下:
1、初始化LED矩阵:
设置 LED 的引脚和数量 (LED_PIN, LED_COUNT)。
设置 LED 亮度 (BRIGHTNESS)。
strip.begin() 开启 LED 控制。
2、定义要显示的字符:
使用 textArray 存储需要循环展示的字符:{‘A’, ‘B’, ‘C’, ‘E’, ‘F’, ‘G’}。
3、循环显示字符:
每次进入 loop():
清除 LED (strip.clear())。
调用 displayCharacter() 显示当前字符。
更新索引 (textIndex) 以显示下一个字符,确保循环。
4、显示字符逻辑:
displayCharacter(char character) 让 LED 矩阵展示某个字符。
shouldLightUp(char character, int ledIndex) 计算哪些 LED 需要点亮,展示不同字符。
5、优化点:
shouldLightUp() 只是个简单示例,实际应用中需要定义具体 LED 点亮位置,使字符更清晰。
你可以修改 delay(1000) 调整字符切换速度。
可以增加颜色变换效果,让显示更丰富。
实验场景图 动态图