首页 > 编程语言 >【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组2

【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组2

时间:2023-07-12 13:01:02浏览次数:29  
标签:动手做 delay dmd Arduino void --- GRAPHICS include 1000

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参考开源代码

 

/*
  【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参考开源代码

/*
  【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参考开源代码

 

/*
  【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参考开源代码

/*
  【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参考开源代码

 

/*
  【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)实验场景图

 

标签:动手做,delay,dmd,Arduino,void,---,GRAPHICS,include,1000
From: https://www.cnblogs.com/eagler8/p/17547230.html

相关文章

  • 2023.7.2-假期周进度报告
    本周(7.2-7.8)主要是完成数据库综合训练小学期我的选题是学生管理系统7.2号之前,我进行了数据库的设计,完成连接数据库,注册,登录页面及其功能也实现了7.2我完成了功能函数的设计,完成了分为角色的主页面,具体是用id判断status,实现身份的判别,通过身份的判别来跳转到到不同的页面7.3我今天......
  • JAVA SE基础《六》---- 方法
    目录一、方法定义、调用1、方法完整的定义形式、调用 2、方法的其他定义形式、调用二、方法使用的常见问题三、方法案例1、定义方法的技巧、计算1-n的和返回2、判断整数是奇数还是偶数3、数组求最值案例改方法实现四、方法调用的内存图五、方法参......
  • Java--next()方法和nextLine()方法的区别
    Java--next()方法和nextLine()方法的区别首先我们来看一下代码:importjava.util.Scanner;publicclassDemo01{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);​System.out.println("请输入:");......
  • 使用you-get下载视频网站的各种视频
    第一步安装python,因为you-get是用python写的,需要python的环境支持。1.1到https://www.python.org/downloads/下载,直接点那个DownloadPythonx.x.x下载最新版即可,像这样:作者:达叔傻乐链接:https://www.jianshu.com/p/1ad94c347e92来源:简书著作权归作者所有。商业转载请联系作......
  • Redis 数据结构 - 链表
    链表-List的底层实现链表提供了高效的节点重排能力,可以通过顺序访问的方式访问节点,并且支持增加删除节点调整长度。由于C语言原生并不支持链表,redis的链表是自己实现的。List的底层实现就是一个双向链表,支持从链表的两端进行push和pop操作,时间复杂度是O(1)。同时支持在......
  • Linux -磁盘性能指标
    linux-磁盘IO性能监测手段Linux存储系统I/O栈由文件系统层(filesystemlayer)、通用块层(generalblocklayer)和设备层(devicelayer)构成。其中,通用块层是Linux磁盘I/O的核心。向上,它为访问文件系统和应用程序的块设备提供了标准接口;向下,它将各种异构磁盘设备抽象为一个......
  • Go--统计数组中重复的元素及重复次数
    代码:packagemainimport("fmt")funcmain(){//创建有重复数值的数组a1:=[]int{1,2,3,1,4,5,2}a2:=[]string{"t1","t2","t1","t3","t5","t3"}//创建maps1:=......
  • SSM - Mybatis - Example - SQL
     Teacher/Student表CREATETABLE`teacher`(`id`INTNOTNULL,`name`VARCHAR(30)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=INNODBDEFAULTCHARSET=UTF8MB4;INSERTINTOteacher(`id`,`name`)VALUES(1,'秦老师');CREATETABLE`student`(......
  • LeetCode -- 918. 环形子数组的最大和
     遇到环形问题一般有两种考虑方法:1.破环成链2.分为数组中间部分和数组两边部分分别考虑本题采用第二种考虑方法,将原数组分为中间部分和两边部分分别考虑。中间部分即为子数组最大和,两边部分计总和减去中间部分最小和。classSolution{public:intma......
  • sharding-jdbc分库连接数优化
    一.背景:配运平台组的快递订单履约中心(cp-eofc)及物流平台履约中心(jdl-uep-ofc)系统都使用了ShardingSphere生态的sharding-jdbc作为分库分表中间件,整个集群采用只分库不分表的设计,共16个MYSQL实例,每个实例有32个库,集群共512个库.当每增加一台客户端主机,一个MYSQl实例最......