【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组2
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百一十七:P10单红V706模组 32*16单元板LED显示屏
补充:LedP10库功能:
1、最多可驱动320×16像素(10个面板级联)
2、支持双行显示,即一个面板分为两个面板。
3、支持动态屏幕刷新。可以编程以在面板上显示动态内容。
4、支持不同的滚动速度。
5、静态和滚动文本模式。可以在运行时从一个切换到另一个。
6、现在仅支持基于文本的内容(Linkboy3.5仿真编程已能支持图片显示)
7、256级亮度控制。
找到的P10V706LED屏模组的电原理图
P10(1R)V706模组技术参数
实验接线示意图
程序七:滚动显示Hello World 1234567890
(1)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 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序七:滚动显示Hello World 1234567890 */ #include <SPI.h>//导入驱动库 #include <DMD.h> #include <TimerOne.h> #include "SystemFont5x7.h" #include "Arial_black_16.h" #define ROW 1 #define COLUMN 1 #define FONT Arial_Black_16//字体16 DMD led_module(ROW, COLUMN); //行、列 void scan_module() { led_module.scanDisplayBySPI(); //模块扫描显示 By SPI } void setup() { Timer1.initialize(2000); Timer1.attachInterrupt(scan_module); led_module.clearScreen( true ); } void loop() { led_module.selectFont(FONT); //设置字体 led_module.drawMarquee( "Hello World 1234567890" , 25, (32 * ROW), 0); long start = millis(); long timming = start; boolean flag = false ; while (!flag) { if ((timming + 20) < millis()) { flag = led_module.stepMarquee(-1, 0); timming = millis(); delay(50); //通过延时时间来调整字幕滚动快慢 } } } |
(2)实验场景图
(3)实验的视频记录
https://v.youku.com/v_show/id_XNTg3MjI2MjE0MA==.html
程序八:使用 Arduino 在 P10 LED 显示模块上显示光照度
(1)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 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序八:使用 Arduino 在 P10 LED 显示模块上显示光照度 */ /* 插入文件库 */ #include <SPI.h> #include <DMD.h> #include <TimerOne.h> #include <SystemFont5x7.h> #define Panjang 1 // 显示 P10 的长度数 #define Lebar 1 //显示 P10 的宽度数 #define sensor A0 // 定义光敏传感器引脚 A0 DMD dmd(Panjang, Lebar); // 长 x 宽 float suhu; //定义变量 char chr[5]; void ScanDMD() { dmd.scanDisplayBySPI(); } void setup( void ) { // 设置 DMDDMD Timer1.initialize( 5000 ); Timer1.attachInterrupt( ScanDMD ); dmd.selectFont(SystemFont5x7); // 使用的字体 dmd.clearScreen( true ); Serial.begin(9600); // 激活通讯串口功能 } void loop( void ) { dmd.clearScreen( true ); suhu = 0; suhu = analogRead(sensor); suhu = (5.0 * suhu * 100.0) / 1024.0; Serial.println(suhu); dtostrf(suhu, 4, 2, chr); dmd.drawString( 2, 0, chr, 5, GRAPHICS_NORMAL ); dmd.drawString( 7, 9, "'OK" , 4, GRAPHICS_NORMAL ); delay(1000); } |
(2)实验串口返回情况
(3)实验场景图
程序九:Freetronics DMD 的时钟读出项目
(1)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 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序九:Freetronics DMD 的时钟读出项目 */ //SPI.h 必须包含,因为 DMD 是由 SPI 写入的(否则 IDE 会抱怨) #include <SPI.h> #include <DMD.h> #include <TimerOne.h> #include "Arial_black_16.h" //以 dmd 的身份启动 DMD 库 DMD dmd(1, 1); /*------------------------------------------------------------------- Timer1 (TimerOne) 驱动的 DMD 刷新扫描的中断处理程序,这得到 在 Timer1.initialize() 中设置的周期调用; -------------------------------------------------------------------*/ void ScanDMD() { dmd.scanDisplayBySPI(); } /*------------------------------------------------------------------- 从 4 位时间值在屏幕上显示时钟数字,并选择是否 闪烁的冒号打开或关闭 -------------------------------------------------------------------*/ void ShowClockNumbers( unsigned int uiTime, byte bColonOn ) { dmd.clearScreen( true ); dmd.drawChar( 1, 3, '0' + ((uiTime % 10000) / 1000), GRAPHICS_NORMAL ); // 数千 dmd.drawChar( 8, 3, '0' + ((uiTime % 1000) / 100), GRAPHICS_NORMAL ); // 数百 dmd.drawChar( 17, 3, '0' + ((uiTime % 100) / 10), GRAPHICS_NORMAL ); //十位 dmd.drawChar( 25, 3, '0' + (uiTime % 10), GRAPHICS_NORMAL ); // 个位 if ( bColonOn ) dmd.drawChar( 15, 3, ':' , GRAPHICS_OR ); //时钟冒号覆盖 else dmd.drawChar( 15, 3, ':' , GRAPHICS_NOR ); //时钟冒号覆盖 } /*------------------------------------------------------------------- 设置 在主循环开始之前由 Arduino 架构调用 -------------------------------------------------------------------*/ void setup( void ) { //初始化TimerOne用于扫描和刷新显示的中断/CPU使用率 Timer1.initialize( 5000 ); //调用 ScanDMD 的周期(以微秒为单位)。任何超过 5000 (5ms) 的时间都可以看到闪烁。 Timer1.attachInterrupt( ScanDMD ); //将 Timer1 中断附加到 ScanDMD 到 dmd.scanDisplayBySPI() //清除/初始化内存中的DMD像素 dmd.clearScreen( true ); //true 为正常(所有像素关闭),false 为负(所有像素打开) dmd.selectFont(Arial_Black_16); } /*------------------------------------------------------------------- 环形 Arduino架构主循环 --------------------------------------------------------------------*/ void loop( void ) { unsigned int ui; // 10 x 14 字体时钟,包括像素的 OR 和 NOR 模式演示,以便可以覆盖闪烁的冒号 ui = 1234; ShowClockNumbers( ui, true ); delay( 1000 ); ShowClockNumbers( ui, false ); delay( 1000 ); ShowClockNumbers( ui, true ); delay( 1000 ); ShowClockNumbers( ui, false ); delay( 1000 ); ui = 2245; ShowClockNumbers( ui, true ); delay( 1000 ); ShowClockNumbers( ui, false ); delay( 1000 ); ShowClockNumbers( ui, true ); delay( 1000 ); ShowClockNumbers( ui, false ); delay( 1000 ); } |
(2)实验场景图
程序十:Freetronics DMD库的综合测试
(1)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 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序十:Freetronics DMD库的综合测试 */ #include <SPI.h> //导入相关驱动库 #include <DMD.h> #include <TimerOne.h> #include "SystemFont5x7.h" #include "Arial_black_16.h" //以 dmd 的身份启动 DMD 库 #define DISPLAYS_ACROSS 1 #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); /*------------------------------------------------------------------- Timer1 (TimerOne) 驱动的 DMD 刷新扫描的中断处理程序,这得到 在 Timer1.initialize() 中设置的周期调用; -------------------------------------------------------------------*/ void ScanDMD() { dmd.scanDisplayBySPI(); } /*------------------------------------------------------------------- 设置 在主循环开始之前由 Arduino 架构调用 -------------------------------------------------------------------*/ void setup( void ) { //初始化TimerOne用于扫描和刷新显示的中断/CPU使用率 Timer1.initialize( 5000 ); //调用 ScanDMD 的周期(以微秒为单位)。任何超过 5000 (5ms) 的时间都可以看到闪烁。 Timer1.attachInterrupt( ScanDMD ); //将 Timer1 中断附加到 ScanDMD 到 dmd.scanDisplayBySPI() //清除/初始化内存中的DMD像素 dmd.clearScreen( true ); //true 为正常(所有像素关闭),false 为负(所有像素打开) } /*------------------------------------------------------------------- 环形 Arduino架构主循环 -------------------------------------------------------------------*/ void loop( void ) { byte b; // 10 x 14 字体时钟,包括OR 和 NOR 模式演示,以便可以覆盖闪烁的冒号 dmd.clearScreen( true ); dmd.selectFont(Arial_Black_16); dmd.drawChar( 0, 3, '2' , GRAPHICS_NORMAL ); dmd.drawChar( 7, 3, '3' , GRAPHICS_NORMAL ); dmd.drawChar( 17, 3, '4' , GRAPHICS_NORMAL ); dmd.drawChar( 25, 3, '5' , GRAPHICS_NORMAL ); dmd.drawChar( 15, 3, ':' , GRAPHICS_OR ); //时钟冒号覆盖 delay( 1000 ); dmd.drawChar( 15, 3, ':' , GRAPHICS_NOR ); //时钟冒号覆盖关闭 delay( 1000 ); dmd.drawChar( 15, 3, ':' , GRAPHICS_OR ); //时钟冒号覆盖 delay( 1000 ); dmd.drawChar( 15, 3, ':' , GRAPHICS_NOR ); //时钟冒号覆盖关闭 delay( 1000 ); dmd.drawChar( 15, 3, ':' , GRAPHICS_OR ); //时钟冒号覆盖 delay( 1000 ); //滚动文本 dmd.drawMarquee( "Scrolling Text" , 14, (32 * DISPLAYS_ACROSS) - 1, 0); long start = millis(); long timer = start; boolean ret = false ; while (!ret) { if ((timer + 30) < millis()) { ret = dmd.stepMarquee(-1, 0); timer = millis(); } } // 一半像素 dmd.drawTestPattern( PATTERN_ALT_0 ); delay( 1000 ); // 另一半打开 dmd.drawTestPattern( PATTERN_ALT_1 ); delay( 1000 ); // 显示一些文本 dmd.clearScreen( true ); dmd.selectFont(System5x7); for ( byte x = 0; x < DISPLAYS_ACROSS; x++) { for ( byte y = 0; y < DISPLAYS_DOWN; y++) { dmd.drawString( 2 + (32 * x), 1 + (16 * y), "freet" , 5, GRAPHICS_NORMAL ); dmd.drawString( 2 + (32 * x), 9 + (16 * y), "ronic" , 5, GRAPHICS_NORMAL ); } } delay( 2000 ); // 在显示器外面画一个边框 dmd.clearScreen( true ); dmd.drawBox( 0, 0, (32 * DISPLAYS_ACROSS) - 1, (16 * DISPLAYS_DOWN) - 1, GRAPHICS_NORMAL ); delay( 1000 ); for ( byte y = 0; y < DISPLAYS_DOWN; y++) { for ( byte x = 0; x < DISPLAYS_ACROSS; x++) { // draw an X int ix = 32 * x; int iy = 16 * y; dmd.drawLine( 0 + ix, 0 + iy, 11 + ix, 15 + iy, GRAPHICS_NORMAL ); dmd.drawLine( 0 + ix, 15 + iy, 11 + ix, 0 + iy, GRAPHICS_NORMAL ); delay( 1000 ); //画一个圆 dmd.drawCircle( 16 + ix, 8 + iy, 5, GRAPHICS_NORMAL ); delay( 1000 ); // 绘制一个填充框 dmd.drawFilledBox( 24 + ix, 3 + iy, 29 + ix, 13 + iy, GRAPHICS_NORMAL ); delay( 1000 ); } } // 条纹追逐者 for ( b = 0 ; b < 20 ; b++ ) { dmd.drawTestPattern( (b & 1) + PATTERN_STRIPE_0 ); delay( 200 ); } delay( 200 ); } |
(2)实验场景图
(3)实验的视频记录
https://v.youku.com/v_show/id_XNTg3MTM3MTYxNg==.html?spm=a2hcb.playlsit.page.1
程序十一:使用DMD2库的最简显示Hello
(1)Arduino参考开源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序十一:使用DMD2库的最简显示Hello */ #include <SPI.h>//导入相关驱动库 #include <DMD2.h> #include <fonts/Arial14.h> const int WIDTH = 1; const uint8_t *FONT = Arial14; SoftDMD dmd(WIDTH, 1); //一块单元板 DMD_TextBox box(dmd); void setup() { dmd.setBrightness(150); //设置亮度 dmd.selectFont(FONT); //设置字体 dmd.begin(); //LED屏初始化 } void loop() { dmd.drawString(3, 2, String( "Hello" )); //定义显示位置与内容 } |
(2)实验场景图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!