3686浏览
查看: 3686|回复: 83

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

[复制链接]
P101R)单红V706模组32X16 LED显示屏的实物照片

11.5-01.jpg

11.5-02.jpg

驴友花雕  初级技神
 楼主|

发表于 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-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-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-5-21 18:04:20

科普知识点:LED与LED显示屏
一、LED(Light Emitting Diode)
1、LED是发光二极管的简称。它是一种半导体光源,当电流通过它时会发光;即一种电致发光的半导体电子元件,其内电子与电子空穴复合,以光子的形式释放能量。发光二极管结构的核心部分是p-n结,周边部分有环氧树脂密封其引线与框架以保护内部芯线。当p-n结通以正向电流时,能发射可见或非可见辐射,此辐射为透过三价与五价元素所组成复合光源。发光二极管只能够往一个方向导通(通电),叫作正向偏置;当电流流过时,电子与电洞(电子空穴)在其内复合而发出单色光,这叫“电致发光效应”;而光线的波长、颜色跟其所采用的半导体物料种类与故意掺入的元素杂质有关。发光二极管具有效率高、寿命长、不易破损、反应速度快、可靠性高等传统光源不及的优点。
发光二极管于1962年出现时,只能发出低光度的红光,被惠普买下专利后当作指示灯利用。其后发展出其他单色光的版本,时至今日,能够发出的光已经遍及可见光、红外线及紫外线,光度亦提高到相当高的程度。随着白光发光二极管的出现,用途已由初期的指示灯及显示板等指示用途,逐渐发展至近年的照明用途。白光LED的发光效率近期亦有所进步,其每千流明成本,因大量资金投入已使价格下降,近年在照明用途上愈趋普及。

2、LED的结构
LED是特殊的二极管,和普通二极管一样由半导体芯片组成。半导体芯片是LED的核心,它附着在基底上,直接连接负极,正极则由导线连接阳极接柱,由反射碗增强芯片的照明效果,整个芯片被环氧树脂封装起来。直插式LED主要由以下几个部分构成:
芯片:(作用-光源发光)
支架:包括衬底及散热基座、引脚等(作用-散热、导电)
金线:(作用-导电)
透明树脂:(作用-保护晶粒、透光)

11.5-03.jpg

11.5-04.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:06:06

3、LED的主要特性
LED作为第四代新光源拥有很多前三代光源所没有的特点:效率高、寿命长、安全可靠性强、无热辐射性、属于冷光源,能准确控制光型及发光角度、利于环保、光源体积小,可随意组合等是显著特点,逐渐成为这个时代的主流光源。
1)节能是LED灯最突出的特点——在能耗方面,LED灯的能耗是白炽灯的十分之一,是节能灯的四分之一。这是LED灯的一个最大的特点。现在的人们都崇尚节能环保,也正是因为节能的这个特点,使得LED灯的应用范围十分广泛,使得LED灯十分的受欢迎。
2)可以在高速开关状态工作——我们平时走在马路上,会发现每一个LED组成的屏幕或者画面都是变化莫测的。这说明LED灯是可以进行高速开关工作的。但是,对于我们平时使用的白炽灯,则达不到这样的工作状态。在平时生活的时候,如果开关的次数过多,将直接导 致白炽灯灯丝断裂。这个也是LED灯受欢迎的重要原因。
3)环保——LED灯内部不含有任何的等重金属材料,但是白炽灯中含有,这就体现了LED灯环保的特点。现在的人都十分重视环保,所以,会有更多的人愿意选择环保的LED灯。
4)响应速度快——LED灯还有一个突出的特点,就是反应的速度比较快。只要一接通电源,LED灯马上就会亮起来。对比我们平时使用的节能灯,其反应速度更快,在打开传统灯泡时,往往需要很长的时间才能照亮房间,在灯泡彻底的发热之后,才能亮起来。
5)有利于环保——LED为全固体发光体、耐冲击不易破碎、废弃物可回收、没有污染减少大量二氧化硫及氮化物等有害气体以及二氧化碳等温室气体的产生改善人们生活居住环境,可称“绿色照明光源。”

11.5-05.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:07:13

4、LED的相关参数
1)正向电压VF
指有正向电流流过时,阳极A与阴极K之间产生的电压。单位为V(伏特)。在正向电压正小于某一值(叫阈值)时,电流极小,不发光。当电压超过某一值后,正向电流随电压迅速增加、发光。而超过了正常工作电压,LED可能被击穿。通常,不同发光颜色的LED,其正常的正向电压也不同,如红灯通常是1.8~2.0V 之间,而蓝灯和白灯在2.8~3.3V之间。
2)正向电流 IF
指有正向电流流过时,阳极A与阴极K之间产生的电流。单位为A(安培)。通常,LED的正向电流应控制在20mA以内,过大的电流容易导致LED的P、N之间的结点温度Tj过高而导致LED损坏或减少使用寿命。另外,LED 如同普通二极管一样,在电压增加时,电流会有很大程度的上升,所以一般LED发光二极管都串接有保护电阻。
3)发光强度 IV
表示从特定方向观测到的亮度。单位cd(坎德拉,对应的更小单位是毫坎德拉, 即mcd),一单位立体角内发出一流明的光称为一坎德拉。比较光强时需要特别注意指向角。光强是指单位立体角内发出的光通量。透镜作为LED封装的组成部分可以向特定方向集中光输出(用透镜集光),即使光输出小也能集光,因此光强变大。需要特别指出的是,IV值通常需要指定该LED是在多大的正向电流IF下测量到的。
4)光通量 Φv [lm]
是指从光源发射出来的全部光量。单位为lm(流明)。光通量(luminous flux)指人眼所能感觉到的辐射功率,它等于单位时间内某一波段的辐射能量和该波段的相对视见率的乘积。由于人眼对不同波长光的相对视见率不同,所以不同波长光的辐射功率相等时,其光通量并不相等。
5)主波长 λD[nm]
LED一般用波长表示颜色。主波长相当于眼睛看到的颜色所对应的波长,与发光波长的峰值波长有差异,单位为nm(纳米)。
以下是各种发光颜色LED的波长参数:
■紫:400~435nm
■蓝:435~480nm
■蓝绿:480~500nm
■绿:500~560nm
■黄绿:560~580nm
■黄:580~595nm
■橙:595~610nm
■红:610~760nm
■白,通常用下面的色坐标来表示。或者简单用暖白、正白、冷白表示。
※备注:
以上波长范围、颜色标记根据文献不同略有差异,仅供参考。

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:08:33

二、LED显示屏(LED panel)
1、LED显示屏是一种平板显示器,由一个个小的LED模块面板组成,用来显示文字、图像、视频等各种信息的设备。LED电子显示屏集微电子技术、计算机技术、信息处理于一体,具有色彩鲜艳、动态范围广、亮度高、寿命长、工作稳定可靠等优点。LED显示屏广泛应用于商业传媒、文化演出市场、体育场馆、信息传播、新闻发布、证券交易等,可以满足不同环境的需要。

11.5-06.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:10:01

2、LED显示屏是经LED点阵组成的电子显示屏,通过亮灭红绿灯珠更换屏幕显示内容形式如文字、动画、图片、视频的及时转化,通过模块化结构进行组件显示控制。主要分为显示模块、控制系统及电源系统。显示模块是LED灯点阵构成屏幕发光;控制系统则是调控区域内的亮灭情况实现对屏幕显示的内容进行转换;电源系统则是对输入电压电流进行转化使其满足显示屏幕的需要。
LED屏幕可实现对多种信息呈现模式的不同形式间的转化,并在室内、室外均可使用,有其他显示屏不可比拟的优势。其凭借光亮强度高、工作耗功较小、电压需求低、设备小巧便捷、使用年限长、耐冲击稳定、抗外界干扰强的特点,快速发展并广泛应用于各个领域。

11.5-07.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:11:35

3、LED的发光颜色和发光效率与制作LED的材料和工艺有关 ,灯球刚开始全是蓝光的,后面再加上荧光粉,根据用户的不同需要,调节出不同的光色,广泛使用的有红、绿、蓝、黄四种。由于LED工作电压低(仅 1.2~4.0V),能主动发光且有一定亮度 ,亮度又能用电压(或电流)调节,本身又耐冲击、抗振动、寿命长(10 万小时),所以在大型的显示设备中,尚无其他的显示方式与LED显示方式匹敌。
把红色和绿色的LED晶片或灯管放在一起作为一个像素制作的显示屏称为三色或双基色屏,把红、绿、蓝三种LED晶片或灯管放在一起作为一个像素的显示屏叫三基色屏或全彩屏。如果只有一种色就叫做单色或单基色屏,制作室内 LED 屏的像素尺寸一般是1.5-12 毫米,常常采用把几种能产生不同基色的LED管芯封装成一体,室外LED 屏的像素尺寸多为6-41.5毫米,每个像素由若干个各种单色LED组成,常见的成品称象素筒,双色象素筒一般由2红1绿组成,三色象素筒用1红1绿1蓝组成。
无论用LED制作单色、双色或三色屏,欲显示图象需要构成像素的每个LED的发光亮度都必须能调节,其调节的精细程度就是显示屏的灰度等级。灰度等级越高,显示的图像就越细腻,色彩也越丰富,相应的显示控制系统也越复杂。一般 256 级灰度的图像,颜色过渡已十分柔和,而16级灰度的彩色图像,颜色过渡界线十分明显。所以,彩色LED屏当前都要求做成256级到4096级灰度的。

11.5-08.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:13:11

4、LED显示屏基本原理
LED显示屏是一种新型的信息显示媒体,它是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。图示为8×8点阵LED显示屏的结构图,从图上看,8×8点阵共需要64个发光二极管,且每个发光二极管放置在行线和列线的交叉点上,当对应的某一行置高电平,某一列置低电平时,则相应的二极管点亮。例如要显示文字时,就可以按照组成文字的笔画将相应的二极管点亮,从而达到显示文字的目的,如图所示。而完整的点阵可由16×16、32×32等组成显示模块。单基色LED显示屏的每个像素由1个单色LED发光二极管组成,即每个像素包含1个LED发光二极管;双基色LED显示屏的每个像素由2个2种单色的LED发光二极管组成,即每个双基色像素包含2个LED发光二极管;而对于三基色全彩LED显示屏来说,组成像素点的二极管包括了3个或3个以上,如由分别发红光、绿光和蓝光的3个二极管组成,这样就可以根据三基色的配色原理,达到彩色显示的目的;而有些显示屏为了改善显示效果,可能由4个二极管组成:2个红光LED、1个绿光LED和1个蓝光LED。


11.5-09.jpg

11.5-10.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:15:05

5、LED显示屏的分类
1)按显示颜色基色分:
a、 单色LED电子显示屏:单一颜色:有红色LED电子显示屏、白色LED电子显示屏、绿色LED电子显示屏、黄色LED电子显示屏、蓝色LED电子显示屏、紫色LED电子显示屏(玫瑰色LED电子显示屏)。
b、 双(基)色LED电子显示屏:红和绿两种基色,可显示红色、绿色和混合色黄色。
c、全彩色LED电子显示屏:红、绿、蓝三基色,256级灰度的全彩色显示屏可以显 示一千六百多万种色。
2)按安装室内外环境或防水可以分为:
a、室内LED电子显示屏(不防水);
b、半户外(亚户外)LED电子显示屏 (不防水、一种只在门头或屋檐下才使用的单色LED电子显示屏,仅限文字走字信息条屏,通常一般不提这类分类);
c、户外LED电子显示屏(防水)。
3)按发光像素点间距(P或PH)或直径(Φ)可分为 :
a、单双色:P10、P8、P7.62(老款是按直径叫Φ5)、P4.75(老款是按 直径叫 Φ3.75)、老款是按直径叫Φ3(无新款)
b、常规室内全彩 :P7.62、P6、P5、P4、P3、P2.5
c、小间距室内全彩;P2、P1.923、P1.875、P1.667、P1.523、P1.4、P1.25、 P1.0、 P0.87……
d、户外全彩:P20、P16、P12、P13.3、P10、P8、P6、P5、P4、P3
e、常用在租赁屏上的:P5.68、P4.81、P3.91、P2.97、P2.60……。
4)按灯珠分类为:
插灯式(老款);裱贴式(新款)。

11.5-11.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:17:08

6、led显示屏发展史
LED显示屏是上世纪八十年代后期在全球迅速发展起来的新型信息显示媒体。它利用发光二极管(LED)构成的点阵模块或像素单元组成显示大屏幕,以可靠性、使用寿命长、环境适应能力强、价格性能比高、使用成本低等特点,在短短的一二十年中,迅速成长为平板显示的主流产品,在信息显示领域得到了广泛的应用。我国的LED显示屏产业经过几年的发展,基本形成了一批具有一定规模的骨干企业。LED显示屏的有许多社会经济的领域,它的发展大概经历了以下三个阶段:
1)1990年以前LED显示屏的成长形成时期。一方面,受LED材料器件的限制,LED显示屏的应用领域没有广泛展开,另一方面,LED显示屏技术基本上是通讯控制方式,客观上影响了显示效果。这一时期的LED显示屏在国外应用较广,国内很少,产品以红、绿双基色为主,以LED显示屏控制卡的方式为通讯控制,灰度等级为单点4级调灰,产品的成本比较高。
2)九十年代,这一阶段是LED显示屏迅速发展的时期。进入九十年代,全球信息产业高速增长,信息技术各个领域不断突破,LED显示屏在LED材料和LED显示屏技术方面也不断出现新的成果。蓝色LED晶片研制成功,全彩色LED显示屏进入市场;电子计算机及微电子领域的技术发展,在显示屏控制技术领域出现了视频控制技术,显示屏灰度等级实现16级灰度和64级灰度调灰,显示屏的动态显示效果大大提高。这一阶段,LED显示屏在我国发展速度非常迅速,从初期的几家企业、年产值几千万元发展到几十家企业、年产值几亿元,产品应用领域涉及金融证券、体育、机场、铁路、车站、公路交通、商业广告、邮电电信等诸多领域,特别是1993年证券股票业的发展更引发了LED显示屏市场的大幅增长。LED显示屏在平板显示领域的主流产品局面基本形成,LED显示屏产业成为新兴的高科技产业。
3)二十一世纪以来,LED显示屏的发展进入一个总体稳步提高产业格局调整完善的时期。2000年以来,LED大屏幕产业内部竞争加剧,形成了许多中小企业,LED显示屏价格大幅回落,应用领域更为广阔,产品在质量、标准化等方面出现了一系列新的问题,有关部门对LED显示屏的发展予以重视并进行了适当的规范和引导,目前这方面的工作正在逐步深化。



7、LED显示屏的扫描方式
LED显示屏一定的显示区域内,同时点亮的行数与整个区域行数的比例,称扫描方式;室内单双色led显示屏一般为1/16扫描,室内全彩led显示屏一般是1/8 扫描,室外单双色led显示屏一般是1/4扫描,室外全彩led显示屏一般是静态扫描。目前市场上LED显示屏的驱动方式有静态扫描和动态扫描两种,静态扫描又分为静态实像素和静态虚拟,动态扫描也分为动态实像和动态虚拟;驱动器件一般用国产HC595,台湾MBI5026,日本东芝TB62726,一般有1/2 扫,1/4扫,1/8扫,1/16扫。

举列说明:一个常用的全彩模组像素为 16*8 (2R1G1B),如果用MBI5026 驱动,模组总共使用的是:16*8*(2+1+1)=512 ,MBI5026 为 16位芯片,512/16=32
1)如果用32 个MBI5026芯片,是静态虚拟
2)如果用16个MBI5026芯片,是动态1/2扫虚拟
3)如果用8个MBI5026芯片,是动态 1/4扫虚拟
如果板子上两个红灯串连
4)用24个MBI5026芯片,是静态实像素
5)用12个MBI5026芯片,是动态1/2扫实像素
6)用6个MBI5026芯片,是动态1/4扫实像素
LED显示屏,扫描方式有1/16,1/8,1/4,1/2,静态。如果区分呢?一个最简单的办法就是数一下LED显示屏单元板的LED的数目和74HC595的数量。

计算方法:LED的数目除以74HC595的数目再除以8 =几分之一扫描

实像素与虚拟是相对应的:简单来说,实像素屏就是指构成显示屏的红绿蓝三种发光管中的每一种发光管最终只参与一个像素的成像使用,以获得足够的亮度。
虚拟像素是利用软件算法控制每种颜色的发光管最终参与到多个相邻像素的成像当中,从而使得用较少的灯管实现较大的分辨率,能够使显示分辨率提高。



8、LED显示屏使用注意事项
1)开关顺序:开屏时——先开机,后开屏。 关屏时——先关屏,后关机。
(先关计算机不关显示屏,会造成屏体出现高亮点,led烧毁灯管,后果严重。)
2)开关屏时间隔时间要大于5分钟。
3)计算机进入工程控制软件后,方可开屏通电。
4)避免在全白屏幕状态下开屏,因为此时系统的冲击电流最大。
5)避免在失控状态下开屏,因为此时系统的冲击电流最大。
6)电子显示屏体一部分出现一行非常亮时,应注意及时关屏,在此状态下不宜长时间开屏。
7)经常出现显示屏的电源开关跳闸,应及时检查屏体或更换电源开关。
8)定期检查挂接处的牢固情况。如有松动现象,注意及时调整,重新加固或更新吊件。
9)环境温度过高或散热条件不好时,LED照明应注意不要长时间开屏。


11.5-12.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:19:22

科普知识点:P101R)V706模组32X16 LED显示屏
1、查看P10(1R)V706模组的芯片(手头上是厦门强力巨彩的产品)
1)大致看了,板上主要是SM74HC595D,其他还有SD74HC245D等

11.5-13.jpg

11.5-15.jpg

11.5-14.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:21:36

2)74HC595
是一个8位串行输入、平行输出的位移缓存器:平行输出为三态输出。在SCK的上升沿,单行数据由SDL输入到内部的8位位移缓存器,并由Q7‘输出,而平行输出则是在LCK的上升沿将在8位位移缓存器的数据存人到8位平行输出缓存器。当串行数据输人端OE的控制信号为低使能时,平行输出端的输出值等于平行输出缓存器所存储的值。而当OE为高电位,也就是输出关闭时,平行输出端会维持在高阻抗状态。

11.5-16.jpg

11.5-17.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:25:57

3)74HC245D
74hc245是一种在单片机系统中常用的驱动器,三态输出八路收发器,她在电路中的作用是:增加io口的驱动能力,比如说51单片机的io口本身的驱动电流较小但所带的负载很大,这种时候就可以使用74hc245来增强io口的驱动能力。

11.5-18.jpg

11.5-19.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:27:29

2、P10(1R)V706模组技术参数

11.5-20.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:53:30

3、P10(1R)V706模组信号引脚定义

11.5-21.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:54:32

4、P10(1R)V706模组电原理图

11.5-22.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:55:49

11.5-23.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:57:19

5、P10(1R)V706模组驱动走线说明图

11.5-24.jpg



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 18:58:31

6、P10(1R)V706模组主要芯片

11.5-25.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 19:00:01

7、P10(1R)V706模组结构组成

11.5-26.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2022-5-21 19:01:08

回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail