21354浏览
楼主: 驴友花雕

[项目] 【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 2022-6-6 09:34:28

程序十四:单个 DMD 上主要绘图操作的快速演示
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十四:单个 DMD 上主要绘图操作的快速演示
  4. */
  5. #include <SPI.h>//导入驱动库
  6. #include <DMD2.h>
  7. #include <fonts/SystemFont5x7.h>
  8. SoftDMD dmd(1, 1); // DMD 控制整个显示
  9. // 设置例程在您按下重置时运行一次:
  10. void setup() {
  11.   dmd.setBrightness(255);//设置亮度(0-255)
  12.   dmd.selectFont(SystemFont5x7);//设置字体
  13.   dmd.begin();//初始化
  14.   // 用一条与之相切的线画圆
  15.   dmd.drawCircle(24, 8, 5);
  16.   dmd.drawLine(14, 9, 28, 15);
  17.   // 包含填充框的轮廓框
  18.   dmd.drawBox(6, 10, 11, 15);
  19.   dmd.drawFilledBox(8, 12, 9, 13);
  20. }
  21. int n = 123;
  22. //循环例程永远一遍又一遍地运行:
  23. void loop() {
  24.   dmd.drawString(0, 0, String(n));
  25.   n = n + 1;
  26.   delay(1000);
  27.   if (n % 2 == 0) {
  28.     dmd.drawFilledBox(0, 11, 4, 15, GRAPHICS_OFF);
  29.     dmd.drawBox(0, 11, 4, 15);
  30.   } else {
  31.     dmd.drawFilledBox(0, 11, 4, 15);
  32.   }
  33. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-6 09:36:11

2)实验场景图

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-8 11:39:31

程序十五:各个方向滚动闪烁显示的“Hello World!”
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十五:各个方向滚动闪烁显示的“Hello World!”
  4. */
  5. #include <SPI.h>//导入驱动库
  6. #include <DMD2.h>
  7. #include <fonts/Arial14.h>
  8. //对于“Hello World”作为您的消息,
  9. //即使您只连接了一个显示器,也将宽度保留为 4
  10. #define DISPLAYS_WIDE 3
  11. #define DISPLAYS_HIGH 1
  12. SoftDMD dmd(DISPLAYS_WIDE, DISPLAYS_HIGH);
  13. DMD_TextBox box(dmd, 0, 0, 32, 16);
  14. // 设置例程在您按下重置时运行一次:
  15. void setup() {
  16.   dmd.setBrightness(255);
  17.   dmd.selectFont(Arial14);
  18.   dmd.begin();
  19.   /* 提示:如果你想要一个比你的显示器更长的字符串,只需将显示的 DISPLAYS_WIDE 值定义为比
  20.     您实际拥有的显示器数量。
  21.   */
  22.   dmd.drawString(0, 0, F("Hello World!"));
  23. }
  24. int phase = 0; // 0-3, 'phase' 值决定方向
  25. //循环例程永远一遍又一遍地运行:
  26. void loop() {
  27.   int steps = random(48); // 每次我们滚动一个随机距离
  28.   for (int i = 0; i < steps; i++) {
  29.     // 根据我们所处的阶段进行不同类型的滚动
  30.     switch (phase) {
  31.       case 0:
  32.         dmd.marqueeScrollX(1); break;
  33.       case 1:
  34.         dmd.marqueeScrollX(-1); break;
  35.       case 2:
  36.         dmd.marqueeScrollY(1); break;
  37.       case 3:
  38.         dmd.marqueeScrollY(-1); break;
  39.     }
  40.     delay(10);
  41.   }
  42.   //进入下一阶段
  43.   phase = (phase + 1) % 4;
  44. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-8 11:40:54

2)实验场景图

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-8 11:43:17

程序十六:模拟康威的人生游戏
(1)Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十六:模拟康威的人生游戏
  4.   (https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life)
  5. */
  6. #include <SPI.h>//导入驱动库
  7. #include <DMD2.h>
  8. // 你有多少个显示器?
  9. const int WIDTH = 2;
  10. const int HEIGHT = 1;
  11. SoftDMD dmd(WIDTH, HEIGHT);
  12. void populate_random_cells() {
  13.   // 随机填充初始显示
  14.   for (int x = 0; x < dmd.width; x++) {
  15.     for (int y = 0; y < dmd.height; y++) {
  16.       // 将 30 增加到更大的数字以设置更多的初始像素
  17.       if (random(100) < 30)
  18.         dmd.setPixel(x, y, GRAPHICS_ON);
  19.     }
  20.   }
  21. }
  22. // 设置例程在您按下重置时运行一次:
  23. void setup() {
  24.   Serial.begin(9600);
  25.   dmd.setBrightness(255);//设置显示亮度
  26.   dmd.begin();//初始化
  27.   randomSeed(analogRead(0));//随机种子(模拟读取0)
  28.   populate_random_cells();
  29. }
  30. //循环例程永远一遍又一遍地运行:
  31. void loop() {
  32.   // 通过复制当前 DMD 帧内容来存储当前代
  33.   DMDFrame current_generation(dmd);
  34.   long start = millis();
  35.   // 更新每个像素的下一代
  36.   bool change = false;
  37.   for (int x = 0; x < dmd.width; x++) {
  38.     for (int y = 0; y < dmd.height; y++) {
  39.       bool state = current_generation.getPixel(x, y);
  40.       int live_neighbours = 0;
  41.       // 计算当前一代有多少活着的邻居
  42.       for (int nx = x - 1; nx < x + 2; nx++) {
  43.         for (int ny = y - 1; ny < y + 2; ny++) {
  44.           if (nx == x && ny == y)
  45.             continue;
  46.           if (current_generation.getPixel(nx, ny))
  47.             live_neighbours++;
  48.         }
  49.       }
  50.       // 更新下一代的像素数
  51.       if (state && (live_neighbours < 2 || live_neighbours > 3)) {
  52.         state = false;
  53.         change = true;
  54.       }
  55.       else if (!state && (live_neighbours == 3)) {
  56.         state = true;
  57.         change = true;
  58.       }
  59.       dmd.setPixel(x, y, state ? GRAPHICS_ON : GRAPHICS_OFF);
  60.     }
  61.   }
  62.   Serial.println(String("Generation time: ") + (millis() - start) + " ms");
  63.   if (!change) {
  64.     // 我们已经使它进入了一个不变的状态
  65.     delay(500);
  66.     populate_random_cells();
  67.     //(我们无法检测到事物向前变化的稳定状态
  68.     // 然后返回,对于这些你需要按下重置!)
  69.   }
  70. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-8 11:44:50

2)实验场景图

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图2

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-9 06:41:46

程序十七:使用DS1307的大字时钟
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十七:使用DS1307的大字时钟
  4. */
  5. //串口和RTC库
  6. #include <Wire.h>
  7. #include "RTClib.h"
  8. //使用了 SPI、DMD、TimerOne 和 Font 库
  9. #include <SPI.h>
  10. #include <DMD.h>
  11. #include <TimerOne.h>
  12. #include "Arial_black_16.h"
  13. #include "Font_6x14.h" //这个字体只包含 0-9 的数字。仅用于显示时间。
  14. //配置P10
  15. #define DISPLAYS_ACROSS 1 //使用的 P10 面板数量,左右。
  16. #define DISPLAYS_DOWN 1
  17. DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
  18. RTC_DS1307 rtc; //RTC模块初始化
  19. //时间和日期的变量
  20. int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
  21. int hr24;
  22. String st;
  23. char nameoftheday[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};//星期
  24. char month_name[12][12] = {"January", "February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"}; //月份
  25. //Millis 的变量
  26. const long interval = 1000; //每 1 秒检索一次时间和日期数据
  27. unsigned long previousMillis = 0;
  28. //显示小时和分钟的变量
  29. char hr_24 [3];
  30. String str_hr_24;
  31. char mn [3];
  32. String str_mn;
  33. void ScanDMD() {
  34.   dmd.scanDisplayBySPI();
  35. }
  36. void setup() {
  37.   Serial.begin(115200);
  38.   Serial.println("Arduino RTC DS1307");
  39.   delay(1000);
  40.   if (! rtc.begin()) {
  41.     Serial.println("Couldn't find RTC");
  42.     while (1);
  43.   }
  44.   if (! rtc.isrunning()) {
  45.     Serial.println("RTC is NOT running!");
  46.     // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
  47.     // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  48.     //-> 根据您的计算机时间和日期设置时间和日期。如果这不起作用,请在“if (!rtc.isrunning())”之外使用这行代码
  49.     // 此行使用明确的日期和时间设置 RTC,例如设置
  50.     // 2022 年 5 月 21 日凌晨 6 点,您可以设置:
  51.     rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
  52.   }
  53.   // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
  54.   // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  55.   //-> 根据您的计算机时间和日期设置时间和日期。如果在“if (!rtc.isrunning())”中不起作用,请使用这行代码
  56.   // rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
  57.   // 如果时间和日期设置成功,则停用代码行(使代码成为注释),然后重新上传代码。
  58.   // 如果没有完成,那么时间和日期将返回到 arduino 重置或重新启动时设置的开头。
  59.   Timer1.initialize(1000);
  60.   Timer1.attachInterrupt(ScanDMD);
  61.   dmd.clearScreen(true);
  62. }
  63. void loop() {
  64.   //millis() 显示时间
  65.   unsigned long currentMillis = millis();
  66.   if (currentMillis - previousMillis >= interval) {
  67.     previousMillis = currentMillis; //保存最后一次
  68.     GetDateTime(); //从 DS1307 检索时间和日期数据
  69.     dmd.selectFont(Font_6x14);
  70.     //在 P10 中显示小时
  71.     str_hr_24 = String(_hour24);
  72.     str_hr_24.toCharArray(hr_24, 3);
  73.     if (_hour24 < 10) {
  74.       dmd.drawString(0, 0, "0", 1, GRAPHICS_NORMAL);
  75.       dmd.drawString(7, 0, hr_24, 1, GRAPHICS_NORMAL);
  76.     }
  77.     else {
  78.       dmd.drawString(0, 0, hr_24, 2, GRAPHICS_NORMAL);
  79.     }
  80.    
  81.     //在 P10 中显示“:”
  82.     if (_second % 2 == 0) {
  83.       dmd.drawFilledBox(15, 3, 16, 4, GRAPHICS_OR);
  84.       dmd.drawFilledBox(15, 11, 16, 12, GRAPHICS_OR);
  85.     }
  86.     else {
  87.       dmd.drawFilledBox(15, 3, 16, 4, GRAPHICS_NOR);
  88.       dmd.drawFilledBox(15, 11, 16, 12, GRAPHICS_NOR);
  89.     }
  90.    
  91.     //在 P10 中显示分钟
  92.     str_mn = String(_minute);
  93.     str_mn.toCharArray(mn, 3);
  94.     if (_minute < 10) {
  95.       dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
  96.       dmd.drawString(26, 0, mn, 1, GRAPHICS_NORMAL);
  97.     }
  98.     else {
  99.       dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
  100.     }
  101.    
  102.     //调用 scrolling_date() 子例程来显示日期。
  103.     if (_second == 11) { //当秒数等于 11 时显示日期
  104.       scrolling_date();
  105.     }
  106.   }
  107. }
  108. //从 DS1307 检索或更新时间和日期的子程序
  109. void GetDateTime() {
  110.   DateTime now = rtc.now();
  111.   _day = now.day();
  112.   _month = now.month();
  113.   _year = now.year();
  114.   _hour24 = now.hour();
  115.   _minute = now.minute();
  116.   _second = now.second();
  117.   _dtw = now.dayOfTheWeek();
  118.   hr24 = _hour24;
  119.   if (hr24 > 12) {
  120.     _hour12 = hr24 - 12;
  121.   }
  122.   else if (hr24 == 0) {
  123.     _hour12 = 12;
  124.   }
  125.   else {
  126.     _hour12 = hr24;
  127.   }
  128.   if (hr24 < 12) {
  129.     st = "AM";
  130.   }
  131.   else {
  132.     st = "PM";
  133.   }
  134. }
  135. //显示日、月、年的子程序
  136. void scrolling_date() {
  137.   String Date = String(nameoftheday[_dtw]) + ", " + String(_day) + "-" + String(month_name[_month - 1]) + "-" + String(_year);
  138.   char dt[50];
  139.   Date.toCharArray(dt, 50);
  140.   dmd.clearScreen(true);
  141.   dmd.selectFont(Arial_Black_16);
  142.   dmd.drawMarquee(dt, strlen(dt), (32 * DISPLAYS_ACROSS) - 1, 0);
  143.   boolean ret = false;
  144.   while (!ret) {
  145.     ret = dmd.stepMarquee(-1, 0);
  146.     delay(75); //延迟滚动速度
  147.   }
  148.   dmd.clearScreen(true);
  149.   return;
  150. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-9 06:43:26

2)实验接线示意图

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-9 06:45:23

3)实验场景图

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图2

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-9 06:46:33

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-11 10:28:43

程序十八:使用DS1307的双行字日期时钟
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十八:使用DS1307的双行字日期时钟
  4. */
  5. //RTC库
  6. #include "RTClib.h"
  7. //使用了 SPI、DMD、TimerOne 和 Font 库
  8. #include <SPI.h>
  9. #include <DMD.h>
  10. #include <TimerOne.h>
  11. #include "SystemFont5x7.h"
  12. #include "Font_6x14.h" //这个字体只包含 0-9 的数字。仅用于显示时间。
  13. //配置P10
  14. #define DISPLAYS_ACROSS 1 //使用的 P10 面板数量,左右。
  15. #define DISPLAYS_DOWN 1
  16. DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
  17. RTC_DS1307 rtc; //RTC模块初始化
  18. //时间和日期的变量
  19. int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
  20. int hr24;
  21. String st;
  22. char nameoftheday[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  23. char month_name[12][12] = {"January", "February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"};
  24. //Millis 的变量
  25. const long interval = 1000; //每 1 秒检索一次时间和日期数据
  26. unsigned long previousMillis = 0;
  27. const long interval_for_date = 75; //滚动速度
  28. unsigned long previousMillis_for_date = 0;
  29. //显示小时和分钟的变量
  30. char hr_24 [3];
  31. String str_hr_24;
  32. char mn [3];
  33. String str_mn;
  34. void ScanDMD() {
  35.   dmd.scanDisplayBySPI();
  36. }
  37. void setup() {
  38.   Serial.begin(115200);
  39.   Serial.println("Arduino RTC DS1307准备就绪");
  40.   delay(1000);
  41.   if (! rtc.begin()) {
  42.     Serial.println("找不到 RTC");
  43.     while (1);
  44.   }
  45.   if (! rtc.isrunning()) {
  46.     Serial.println("RTC 没有运行!");
  47.     // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
  48.     // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  49.     //-> 根据您的计算机时间和日期设置时间和日期。如果这不起作用,请在“if (!rtc.isrunning())”之外使用这行代码
  50.     // 此行使用明确的日期和时间设置 RTC,例如设置
  51.     // 2022 年 5 月 21 日凌晨 6 点,您可以设置:
  52.     rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
  53.   }
  54.   // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
  55.   // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  56.   //-> 根据您的计算机时间和日期设置时间和日期。如果在“if (!rtc.isrunning())”中不起作用,请使用这行代码
  57.   // rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
  58.   // 如果时间和日期设置成功,则停用代码行(使代码成为注释),然后重新上传代码。
  59.   // 如果没有完成,那么时间和日期将返回到 arduino 重置或重新启动时设置的开头。
  60.   Timer1.initialize(1000);
  61.   Timer1.attachInterrupt(ScanDMD);
  62.   dmd.clearScreen(true);
  63. }
  64. void loop() {
  65.   //millis() 显示时间
  66.   unsigned long currentMillis = millis();
  67.   if (currentMillis - previousMillis >= interval) {
  68.     previousMillis = currentMillis; //保存最后一次
  69.     GetDateTime(); //从 DS1307 检索时间和日期数据
  70.     dmd.selectFont(Font_6x14);
  71.     //在 P10 中显示小时
  72.     str_hr_24 = String(_hour24);
  73.     str_hr_24.toCharArray(hr_24, 3);
  74.     if (_hour24 < 10) {
  75.       dmd.drawString(0, 0, "0", 1, GRAPHICS_NORMAL);
  76.       dmd.drawString(7, 0, hr_24, 1, GRAPHICS_NORMAL);
  77.     }
  78.     else {
  79.       dmd.drawString(0, 0, hr_24, 2, GRAPHICS_NORMAL);
  80.     }
  81.     //在 P10 中显示“:”
  82.     if (_second % 2 == 0) {
  83.       dmd.drawFilledBox(15, 3, 16, 4, GRAPHICS_OR);
  84.       dmd.drawFilledBox(15, 11, 16, 12, GRAPHICS_OR);
  85.     }
  86.     else {
  87.       dmd.drawFilledBox(15, 3, 16, 4, GRAPHICS_NOR);
  88.       dmd.drawFilledBox(15, 11, 16, 12, GRAPHICS_NOR);
  89.     }
  90.     //在 P10 中显示分钟
  91.     str_mn = String(_minute);
  92.     str_mn.toCharArray(mn, 3);
  93.     if (_minute < 10) {
  94.       dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
  95.       dmd.drawString(26, 0, mn, 1, GRAPHICS_NORMAL);
  96.     }
  97.     else {
  98.       dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
  99.     }
  100.     //调用 scrolling_date() 子例程来显示日期。
  101.     if (_second == 11) { //当秒数等于 11 时显示日期
  102.       scrolling_date();
  103.     }
  104.   }
  105. }
  106. //从 DS1307 检索或更新时间和日期的子程序
  107. void GetDateTime() {
  108.   DateTime now = rtc.now();
  109.   _day = now.day();
  110.   _month = now.month();
  111.   _year = now.year();
  112.   _hour24 = now.hour();
  113.   _minute = now.minute();
  114.   _second = now.second();
  115.   _dtw = now.dayOfTheWeek();
  116.   hr24 = _hour24;
  117.   if (hr24 > 12) {
  118.     _hour12 = hr24 - 12;
  119.   }
  120.   else if (hr24 == 0) {
  121.     _hour12 = 12;
  122.   }
  123.   else {
  124.     _hour12 = hr24;
  125.   }
  126.   if (hr24 < 12) {
  127.     st = "AM";
  128.   }
  129.   else {
  130.     st = "PM";
  131.   }
  132. }
  133. //显示日、月、年的子程序
  134. void scrolling_date() {
  135.   dmd.clearScreen(true);
  136.   delay(100);
  137.   //保存要显示的日期数据
  138.   String Date = String(nameoftheday[_dtw]) + ", " + String(_day) + "-" + String(month_name[_month - 1]) + "-" + String(_year);
  139.   char dt[50];
  140.   Date.toCharArray(dt, 50);
  141.   int i = 32 + 10;
  142.   int j = strlen(dt) + (strlen(dt) * 5);
  143.   dmd.selectFont(SystemFont5x7);
  144.   while (1) {
  145.     //millis() 显示时间
  146.     unsigned long currentMillis = millis();
  147.     if (currentMillis - previousMillis >= interval) {
  148.       previousMillis = currentMillis; //保存最后一次
  149.       //在 P10 中显示时钟
  150.       str_hr_24 = String(_hour24);
  151.       str_hr_24.toCharArray(hr_24, 3);
  152.       if (_hour24 < 10) {
  153.         dmd.drawString(2, 0, "0", 1, GRAPHICS_NORMAL);
  154.         dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
  155.       }
  156.       else {
  157.         dmd.drawString(2, 0, hr_24, 2, GRAPHICS_NORMAL);
  158.       }
  159.       //在 P10 中显示“:”
  160.       GetDateTime(); // 从 DS1307 检索时间和日期数据
  161.       if (_second % 2 == 0) {
  162.         dmd.drawString(14, 0, ":", 2, GRAPHICS_OR);
  163.       }
  164.       else {
  165.         dmd.drawString(14, 0, ":", 2, GRAPHICS_NOR);
  166.       }
  167.       //在 P10 中显示分钟
  168.       str_mn = String(_minute);
  169.       str_mn.toCharArray(mn, 3);
  170.       if (_minute < 10) {
  171.         dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
  172.         dmd.drawString(25, 0, mn, 1, GRAPHICS_NORMAL);
  173.       }
  174.       else {
  175.         dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
  176.       }
  177.     }
  178.     //millis() 用于显示和滚动日期
  179.     unsigned long currentMillis_for_date = millis();
  180.     if (currentMillis_for_date - previousMillis_for_date >= interval_for_date) {
  181.       previousMillis_for_date = currentMillis_for_date; //保存最后一次时间
  182.       i--;
  183.       dmd.drawString(i, 9, dt, strlen(dt), GRAPHICS_NORMAL);
  184.       if (i <= ~j) {
  185.         dmd.clearScreen(true);
  186.         delay(100);
  187.         return;
  188.       }
  189.     }
  190.   }
  191. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-11 10:30:05

2)实验场景图

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-11 10:31:36

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-11 10:33:10

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:13:04

程序十九:显示时、分、秒和日期的时钟
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序十九:显示时、分、秒和日期的时钟
  4. */
  5. //RTC库
  6. #include <Wire.h>
  7. #include "RTClib.h"
  8. //使用了 SPI、DMD、TimerOne 和 Font 库
  9. #include <SPI.h>
  10. #include <DMD.h>
  11. #include <TimerOne.h>
  12. #include "SystemFont5x7.h"
  13. #include "Font_6x14.h" //这个字体只包含 0-9 的数字。仅用于显示时间。
  14. //配置P10
  15. #define DISPLAYS_ACROSS 1 //使用的 P10 面板数量,左右。
  16. #define DISPLAYS_DOWN 1
  17. DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
  18. RTC_DS1307 rtc; //RTC模块初始化
  19. //时间和日期的变量
  20. int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
  21. int hr24;
  22. String st;
  23. char nameoftheday[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  24. char month_name[12][12] = {"January", "February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"};
  25. //Millis 的变量
  26. const long interval = 1000; //每 1 秒检索一次时间和日期数据
  27. unsigned long previousMillis = 0;
  28. const long interval_for_date = 75; //滚动速度
  29. unsigned long previousMillis_for_date = 0;
  30. //显示小时\分钟\秒的变量
  31. char hr_24 [3];
  32. String str_hr_24;
  33. char mn [3];
  34. String str_mn;
  35. char sc [3];
  36. String str_sc;
  37. void ScanDMD() {
  38.   dmd.scanDisplayBySPI();
  39. }
  40. void setup() {
  41.   Serial.begin(115200);
  42.   Serial.println("Arduino RTC DS1307准备就绪");
  43.   delay(1000);
  44.   if (! rtc.begin()) {
  45.     Serial.println("找不到 RTC");
  46.     while (1);
  47.   }
  48.   if (! rtc.isrunning()) {
  49.     Serial.println("RTC 没有运行!");
  50.     // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
  51.     // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  52.     // 根据您的计算机时间和日期设置时间和日期。如果这不起作用,请在“if (!rtc.isrunning())”之外使用这行代码
  53.     // 此行使用明确的日期和时间设置 RTC,例如设置
  54.     // 2022 年 5 月 21 日凌晨 6 点,您可以设置:
  55.     rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
  56.   }
  57.   // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
  58.   // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  59.   // 根据您的计算机时间和日期设置时间和日期。如果在“if (!rtc.isrunning())”中不起作用,请使用这行代码
  60.   // rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
  61.   // 如果时间和日期设置成功,则停用代码行(使代码成为注释),然后重新上传代码。
  62.   // 如果没有完成,那么时间和日期将返回到 arduino 重置或重新启动时设置的开头。
  63.   Timer1.initialize(1000);
  64.   Timer1.attachInterrupt(ScanDMD);
  65.   dmd.clearScreen(true);
  66. }
  67. void loop() {
  68.   //millis() 显示时间
  69.   unsigned long currentMillis = millis();
  70.   if (currentMillis - previousMillis >= interval) {
  71.     previousMillis = currentMillis; //保存最后一次
  72.     GetDateTime(); //从 DS1307 检索时间和日期数据
  73.     dmd.selectFont(Font_6x14);
  74.     //在 P10 中显示小时
  75.     str_hr_24 = String(_hour24);
  76.     str_hr_24.toCharArray(hr_24, 3);
  77.     if (_hour24 < 10) {
  78.       dmd.drawString(1, 0, "0", 1, GRAPHICS_NORMAL);
  79.       dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
  80.     }
  81.     else {
  82.       dmd.drawString(1, 0, hr_24, 2, GRAPHICS_NORMAL);
  83.     }
  84.     //在 P10 中显示“:”
  85.     dmd.drawFilledBox(16, 3, 17, 4, GRAPHICS_NORMAL);
  86.     dmd.drawFilledBox(16, 11, 17, 12, GRAPHICS_NORMAL);
  87.     //在 P10 中显示分和秒
  88.     dmd.selectFont(SystemFont5x7);
  89.     str_mn = String(_minute);
  90.     str_mn.toCharArray(mn, 3);
  91.     if (_minute < 10) {
  92.       dmd.drawString(20, 0, "0", 1, GRAPHICS_NORMAL);
  93.       dmd.drawString(26, 0, mn, 1, GRAPHICS_NORMAL);
  94.     }
  95.     else {
  96.       dmd.drawString(20, 0, mn, 2, GRAPHICS_NORMAL);
  97.     }
  98.     str_sc = String(_second);
  99.     str_sc.toCharArray(sc, 3);
  100.     if (_second < 10) {
  101.       dmd.drawString(20, 9, "0", 1, GRAPHICS_NORMAL);
  102.       dmd.drawString(26, 9, sc, 1, GRAPHICS_NORMAL);
  103.     }
  104.     else {
  105.       dmd.drawString(20, 9, sc, 2, GRAPHICS_NORMAL);
  106.     }
  107.     //调用 scrolling_date() 子例程来显示日期。
  108.     if (_second == 11) { //秒等于 11 时显示日期
  109.       scrolling_date();
  110.     }
  111.   }
  112. }
  113. //从 DS1307 检索或更新时间和日期的子程序
  114. void GetDateTime() {
  115.   DateTime now = rtc.now();
  116.   _day = now.day();
  117.   _month = now.month();
  118.   _year = now.year();
  119.   _hour24 = now.hour();
  120.   _minute = now.minute();
  121.   _second = now.second();
  122.   _dtw = now.dayOfTheWeek();
  123.   hr24 = _hour24;
  124.   if (hr24 > 12) {
  125.     _hour12 = hr24 - 12;
  126.   }
  127.   else if (hr24 == 0) {
  128.     _hour12 = 12;
  129.   }
  130.   else {
  131.     _hour12 = hr24;
  132.   }
  133.   if (hr24 < 12) {
  134.     st = "AM";
  135.   }
  136.   else {
  137.     st = "PM";
  138.   }
  139. }
  140. //显示日、月、年的子程序
  141. void scrolling_date() {
  142.   dmd.clearScreen(true);
  143.   delay(100);
  144.   //保存要显示的日期数据
  145.   String Date = String(nameoftheday[_dtw]) + ", " + String(_day) + "-" + String(month_name[_month - 1]) + "-" + String(_year);
  146.   char dt[50];
  147.   Date.toCharArray(dt, 50);
  148.   int i = 32 + 10;
  149.   int j = strlen(dt) + (strlen(dt) * 5);
  150.   dmd.selectFont(SystemFont5x7);
  151.   while (1) {
  152.     //millis() 显示时间
  153.     unsigned long currentMillis = millis();
  154.     if (currentMillis - previousMillis >= interval) {
  155.       previousMillis = currentMillis; //保存最后一次时间
  156.       //在 P10 中显示时钟
  157.       str_hr_24 = String(_hour24);
  158.       str_hr_24.toCharArray(hr_24, 3);
  159.       if (_hour24 < 10) {
  160.         dmd.drawString(2, 0, "0", 1, GRAPHICS_NORMAL);
  161.         dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
  162.       }
  163.       else {
  164.         dmd.drawString(2, 0, hr_24, 2, GRAPHICS_NORMAL);
  165.       }
  166.       //在 P10 中显示“:”
  167.       GetDateTime(); //从 DS1307 检索时间和日期数据
  168.       if (_second % 2 == 0) {
  169.         dmd.drawString(14, 0, ":", 2, GRAPHICS_OR);
  170.       }
  171.       else {
  172.         dmd.drawString(14, 0, ":", 2, GRAPHICS_NOR);
  173.       }
  174.       //在 P10 中显示分钟
  175.       str_mn = String(_minute);
  176.       str_mn.toCharArray(mn, 3);
  177.       if (_minute < 10) {
  178.         dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
  179.         dmd.drawString(25, 0, mn, 1, GRAPHICS_NORMAL);
  180.       }
  181.       else {
  182.         dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
  183.       }
  184.     }
  185.     //millis() 用于显示和滚动日期
  186.     unsigned long currentMillis_for_date = millis();
  187.     if (currentMillis_for_date - previousMillis_for_date >= interval_for_date) {
  188.       previousMillis_for_date = currentMillis_for_date; //保存最后一次时间
  189.       i--;
  190.       dmd.drawString(i, 9, dt, strlen(dt), GRAPHICS_NORMAL);
  191.       if (i <= ~j) {
  192.         dmd.clearScreen(true);
  193.         delay(100);
  194.         return;
  195.       }
  196.     }
  197.   }
  198. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:14:39

(2)实验场景图

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:15:52

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:17:05

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:18:38

程序二十:P10显示屏数码时钟(风格之四)
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序二十:P10显示屏数码时钟(风格之四)
  4. */
  5. //RTC库
  6. #include <Wire.h>
  7. #include "RTClib.h"
  8. //使用了 SPI、DMD、TimerOne 和 Font 库
  9. #include <SPI.h>
  10. #include <DMD.h>
  11. #include <TimerOne.h>
  12. #include "SystemFont5x7.h"
  13. //配置P10
  14. #define DISPLAYS_ACROSS 1 //使用的 P10 面板数量,左右。
  15. #define DISPLAYS_DOWN 1
  16. DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
  17. RTC_DS1307 rtc; //RTC模块初始化
  18. //时间和日期的变量
  19. int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
  20. int hr24;
  21. String st;
  22. char nameoftheday[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  23. char month_name[12][12] = {"January", "February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"};
  24. //Millis 的变量
  25. const long interval = 1000; //每 1 秒检索一次时间和日期数据
  26. unsigned long previousMillis = 0;
  27. const long interval_for_date = 75; //滚动速度
  28. unsigned long previousMillis_for_date = 0;
  29. //显示小时\分钟\秒的变量
  30. char hr_24 [3];
  31. String str_hr_24;
  32. char mn [3];
  33. String str_mn;
  34. char sc [3];
  35. String str_sc;
  36. String strSecondRow;
  37. char chrSecondRow[60];
  38. int i = 32;
  39. int j;
  40. int sr = 1;
  41. void ScanDMD() {
  42.   dmd.scanDisplayBySPI();
  43. }
  44. void setup() {
  45.   Serial.begin(115200);
  46.   Serial.println("Arduino RTC DS1307准备就绪");
  47.   delay(1000);
  48.   if (! rtc.begin()) {
  49.     Serial.println("找不到 RTC");
  50.     while (1);
  51.   }
  52.   if (! rtc.isrunning()) {
  53.     Serial.println("RTC 没有运行!");
  54.     // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
  55.     // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  56.     // 根据您的计算机时间和日期设置时间和日期。如果这不起作用,请在“if (!rtc.isrunning())”之外使用这行代码
  57.     // 此行使用明确的日期和时间设置 RTC,例如设置
  58.     // 2022 年 5 月 21 日凌晨 6 点,您可以设置:
  59.     rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
  60.   }
  61.   // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
  62.   // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  63.   // 根据您的计算机时间和日期设置时间和日期。如果在“if (!rtc.isrunning())”中不起作用,请使用这行代码
  64.   // rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
  65.   // 如果时间和日期设置成功,则停用代码行(使代码成为注释),然后重新上传代码。
  66.   // 如果没有完成,那么时间和日期将返回到 arduino 重置或重新启动时设置的开头。
  67.   Timer1.initialize(1000);
  68.   Timer1.attachInterrupt(ScanDMD);
  69.   dmd.clearScreen(true);
  70.   dmd.selectFont(SystemFont5x7);
  71. }
  72. void loop() {
  73.   //millis() 显示时间
  74.   unsigned long currentMillis = millis();
  75.   if (currentMillis - previousMillis >= interval) {
  76.     previousMillis = currentMillis; //保存最后一次
  77.     GetDateTime(); //从 DS1307 检索时间和日期数据
  78.     //在 P10 中显示小时
  79.     str_hr_24 = String(_hour24);
  80.     str_hr_24.toCharArray(hr_24, 3);
  81.     if (_hour24 < 10) {
  82.       dmd.drawString(2, 0, "0", 1, GRAPHICS_NORMAL);
  83.       dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
  84.     }
  85.     else {
  86.       dmd.drawString(2, 0, hr_24, 2, GRAPHICS_NORMAL);
  87.     }
  88.     //在 P10 中显示“:”
  89.     GetDateTime(); //从 DS1307 检索时间和日期数据
  90.     if (_second % 2 == 0) {
  91.       dmd.drawString(14, 0, ":", 2, GRAPHICS_OR);
  92.     }
  93.     else {
  94.       dmd.drawString(14, 0, ":", 2, GRAPHICS_NOR);
  95.     }
  96.     //在 P10 中显示分和秒
  97.     str_mn = String(_minute);
  98.     str_mn.toCharArray(mn, 3);
  99.     if (_minute < 10) {
  100.       dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
  101.       dmd.drawString(25, 0, mn, 1, GRAPHICS_NORMAL);
  102.     }
  103.     else {
  104.       dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
  105.     }
  106.   }
  107.   //millis() 用于显示/滚动日期和其他文本
  108.   unsigned long currentMillis_for_date = millis();
  109.   if (currentMillis_for_date - previousMillis_for_date >= interval_for_date) {
  110.     previousMillis_for_date = currentMillis_for_date; //保存最后一次时间
  111.     //保存日期数据和其他要显示的文本
  112.     switch (sr) {
  113.       case 1:
  114.         strSecondRow = String(nameoftheday[_dtw]) + ", " + String(_day) + "-" + String(month_name[_month - 1]) + "-" + String(_year);
  115.         strSecondRow.toCharArray(chrSecondRow, 60);
  116.         j = strlen(chrSecondRow) + (strlen(chrSecondRow) * 5);
  117.         break;
  118.       case 2:
  119.         strSecondRow = "Don't Forget to Subscribe Uteh Str Channel on YouTube";
  120.         strSecondRow.toCharArray(chrSecondRow, 60);
  121.         j = strlen(chrSecondRow) + (strlen(chrSecondRow) * 5);
  122.         break;
  123.     }
  124.     i--;
  125.     dmd.drawString(i, 9, chrSecondRow, strlen(chrSecondRow), GRAPHICS_NORMAL);
  126.     if (i <= ~j) {
  127.       i = 32;
  128.       sr++;
  129.       if (sr > 2) sr = 1;
  130.     }
  131.   }
  132. }
  133. //从 DS1307 检索或更新时间和日期的子程序
  134. void GetDateTime() {
  135.   DateTime now = rtc.now();
  136.   _day = now.day();
  137.   _month = now.month();
  138.   _year = now.year();
  139.   _hour24 = now.hour();
  140.   _minute = now.minute();
  141.   _second = now.second();
  142.   _dtw = now.dayOfTheWeek();
  143.   hr24 = _hour24;
  144.   if (hr24 > 12) {
  145.     _hour12 = hr24 - 12;
  146.   }
  147.   else if (hr24 == 0) {
  148.     _hour12 = 12;
  149.   }
  150.   else {
  151.     _hour12 = hr24;
  152.   }
  153.   if (hr24 < 12) {
  154.     st = "AM";
  155.   }
  156.   else {
  157.     st = "PM";
  158.   }
  159. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:19:53

2)实验场景图

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-6-13 15:20:55

【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组图1
回复

使用道具 举报

1234
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail