Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

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

[复制链接]
 楼主| 发表于 2022-6-13 15:33 | 显示全部楼层
11.5-70.jpg
 楼主| 发表于 2022-6-13 15:34 | 显示全部楼层
程序十九:显示时、分、秒和日期的时钟
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:35 | 显示全部楼层
(2)实验场景图

11.5-72.jpg

 楼主| 发表于 2022-6-13 15:35 | 显示全部楼层
11.5-71.jpg
 楼主| 发表于 2022-6-13 15:36 | 显示全部楼层
11.5-73.jpg
 楼主| 发表于 2022-6-13 15:37 | 显示全部楼层
程序二十: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:37 | 显示全部楼层
2)实验场景图

11.5-74.jpg

 楼主| 发表于 2022-6-13 15:38 | 显示全部楼层
11.5-75.jpg
 楼主| 发表于 2022-11-23 11:17 | 显示全部楼层
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验一百二十三: P10单红V706模组  32*16单元板LED显示屏
  项目程序二十一:显示字符显示无误且长度合适

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百二十三: P10单红V706模组  32*16单元板LED显示屏
  4.   项目程序二十一:显示字符显示无误且长度合适
  5. */

  6. #include <SPI.h>
  7. #include <DMD.h>
  8. #include <TimerOne.h>
  9. #include "SystemFont5x7.h"
  10. #include "Arial_black_16.h"
  11. #include "Arial14.h"
  12. #define DISPLAYS_ACROSS 1
  13. #define DISPLAYS_DOWN 1
  14. String str;
  15. char b[8];
  16. DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

  17. void ScanDMD(){
  18. dmd.scanDisplayBySPI();
  19. }

  20. void setup() {
  21. Serial.begin(9600);
  22. Timer1.initialize(5000);
  23. Timer1.attachInterrupt(ScanDMD);
  24. dmd.clearScreen(true);
  25. }

  26. void loop()
  27. {
  28. int slen = 0;
  29. dmd.clearScreen( true );                             
  30. /*---------------------------------------  Display using SystemFont  -------------------------------------*/
  31. dmd.selectFont(SystemFont5x7);                                 
  32. str="HELLO";
  33. slen = str.length()+1;   
  34. str.toCharArray(b,slen);   
  35. dmd.drawString(1,0,b,slen,GRAPHICS_NORMAL);                                       
  36. str="WORLD";   
  37. slen= str.length()+1;                                          
  38. str.toCharArray(b,slen);         
  39. dmd.drawString(1,8,b,slen,GRAPHICS_NORMAL);      
  40. delay(4000);                  
  41. dmd.clearScreen( true );
  42. delay(2000);  

  43. /*---------------------------------  Display using Arial_black_16  -------------------------------------*/
  44. dmd.selectFont(Arial_Black_16);               
  45. str="BEP";                                          
  46. slen = str.length()+1;                                       
  47. str.toCharArray(b,slen);      
  48. dmd.drawString(2,1,b,slen,GRAPHICS_NORMAL);      
  49. delay(4000);   
  50. dmd.clearScreen( true );
  51. delay(2000);                     

  52. /*----------------------------------  Display using  Arial14  -------------------------------------------- */   
  53. dmd.selectFont(Arial_14);                                      
  54. str="BEP!";                                          
  55. slen = str.length()+1;                                       
  56. str.toCharArray(b,slen);      
  57. dmd.drawString(4,1,b,slen,GRAPHICS_NORMAL);        
  58. delay(4000);
  59. dmd.clearScreen( true );
  60. delay(2000);                           
  61. }
复制代码


 楼主| 发表于 2022-11-23 11:18 | 显示全部楼层
实验场景图


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

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-6 19:57 , Processed in 0.076167 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表