驴友花雕 发表于 2022-6-6 09:34:28

程序十四:单个 DMD 上主要绘图操作的快速演示(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十四:单个 DMD 上主要绘图操作的快速演示
*/

#include <SPI.h>//导入驱动库
#include <DMD2.h>
#include <fonts/SystemFont5x7.h>
SoftDMD dmd(1, 1); // DMD 控制整个显示

// 设置例程在您按下重置时运行一次:
void setup() {
dmd.setBrightness(255);//设置亮度(0-255)
dmd.selectFont(SystemFont5x7);//设置字体
dmd.begin();//初始化

// 用一条与之相切的线画圆
dmd.drawCircle(24, 8, 5);
dmd.drawLine(14, 9, 28, 15);

// 包含填充框的轮廓框
dmd.drawBox(6, 10, 11, 15);
dmd.drawFilledBox(8, 12, 9, 13);
}

int n = 123;

//循环例程永远一遍又一遍地运行:
void loop() {
dmd.drawString(0, 0, String(n));
n = n + 1;
delay(1000);

if (n % 2 == 0) {
    dmd.drawFilledBox(0, 11, 4, 15, GRAPHICS_OFF);
    dmd.drawBox(0, 11, 4, 15);
} else {
    dmd.drawFilledBox(0, 11, 4, 15);
}
}

驴友花雕 发表于 2022-6-6 09:36:11

(2)实验场景图

驴友花雕 发表于 2022-6-8 11:39:31

程序十五:各个方向滚动闪烁显示的“Hello World!”(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十五:各个方向滚动闪烁显示的“Hello World!”
*/

#include <SPI.h>//导入驱动库
#include <DMD2.h>
#include <fonts/Arial14.h>

//对于“Hello World”作为您的消息,
//即使您只连接了一个显示器,也将宽度保留为 4
#define DISPLAYS_WIDE 3
#define DISPLAYS_HIGH 1

SoftDMD dmd(DISPLAYS_WIDE, DISPLAYS_HIGH);
DMD_TextBox box(dmd, 0, 0, 32, 16);

// 设置例程在您按下重置时运行一次:
void setup() {
dmd.setBrightness(255);
dmd.selectFont(Arial14);
dmd.begin();
/* 提示:如果你想要一个比你的显示器更长的字符串,只需将显示的 DISPLAYS_WIDE 值定义为比
    您实际拥有的显示器数量。
*/
dmd.drawString(0, 0, F("Hello World!"));
}

int phase = 0; // 0-3, 'phase' 值决定方向

//循环例程永远一遍又一遍地运行:
void loop() {
int steps = random(48); // 每次我们滚动一个随机距离
for (int i = 0; i < steps; i++) {
    // 根据我们所处的阶段进行不同类型的滚动
    switch (phase) {
      case 0:
      dmd.marqueeScrollX(1); break;
      case 1:
      dmd.marqueeScrollX(-1); break;
      case 2:
      dmd.marqueeScrollY(1); break;
      case 3:
      dmd.marqueeScrollY(-1); break;
    }
    delay(10);
}

//进入下一阶段
phase = (phase + 1) % 4;
}

驴友花雕 发表于 2022-6-8 11:40:54

(2)实验场景图

驴友花雕 发表于 2022-6-8 11:43:17

程序十六:模拟康威的人生游戏(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十六:模拟康威的人生游戏
(https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life)
*/

#include <SPI.h>//导入驱动库
#include <DMD2.h>

// 你有多少个显示器?
const int WIDTH = 2;
const int HEIGHT = 1;

SoftDMD dmd(WIDTH, HEIGHT);

void populate_random_cells() {
// 随机填充初始显示
for (int x = 0; x < dmd.width; x++) {
    for (int y = 0; y < dmd.height; y++) {
      // 将 30 增加到更大的数字以设置更多的初始像素
      if (random(100) < 30)
      dmd.setPixel(x, y, GRAPHICS_ON);
    }
}
}

// 设置例程在您按下重置时运行一次:
void setup() {
Serial.begin(9600);
dmd.setBrightness(255);//设置显示亮度
dmd.begin();//初始化

randomSeed(analogRead(0));//随机种子(模拟读取0)
populate_random_cells();
}

//循环例程永远一遍又一遍地运行:
void loop() {
// 通过复制当前 DMD 帧内容来存储当前代
DMDFrame current_generation(dmd);

long start = millis();

// 更新每个像素的下一代
bool change = false;
for (int x = 0; x < dmd.width; x++) {
    for (int y = 0; y < dmd.height; y++) {
      bool state = current_generation.getPixel(x, y);
      int live_neighbours = 0;

      // 计算当前一代有多少活着的邻居
      for (int nx = x - 1; nx < x + 2; nx++) {
      for (int ny = y - 1; ny < y + 2; ny++) {
          if (nx == x && ny == y)
            continue;
          if (current_generation.getPixel(nx, ny))
            live_neighbours++;
      }
      }

      // 更新下一代的像素数
      if (state && (live_neighbours < 2 || live_neighbours > 3)) {
      state = false;
      change = true;
      }
      else if (!state && (live_neighbours == 3)) {
      state = true;
      change = true;
      }
      dmd.setPixel(x, y, state ? GRAPHICS_ON : GRAPHICS_OFF);
    }
}

Serial.println(String("Generation time: ") + (millis() - start) + " ms");

if (!change) {
    // 我们已经使它进入了一个不变的状态
    delay(500);
    populate_random_cells();
    //(我们无法检测到事物向前变化的稳定状态
    // 然后返回,对于这些你需要按下重置!)
}
}

驴友花雕 发表于 2022-6-8 11:44:50

(2)实验场景图


驴友花雕 发表于 2022-6-9 06:41:46

程序十七:使用DS1307的大字时钟(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十七:使用DS1307的大字时钟
*/

//串口和RTC库
#include <Wire.h>
#include "RTClib.h"

//使用了 SPI、DMD、TimerOne 和 Font 库
#include <SPI.h>
#include <DMD.h>
#include <TimerOne.h>
#include "Arial_black_16.h"
#include "Font_6x14.h" //这个字体只包含 0-9 的数字。仅用于显示时间。

//配置P10
#define DISPLAYS_ACROSS 1 //使用的 P10 面板数量,左右。
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

RTC_DS1307 rtc; //RTC模块初始化

//时间和日期的变量
int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
int hr24;
String st;
char nameoftheday = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};//星期
char month_name = {"January", "February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"}; //月份

//Millis 的变量
const long interval = 1000; //每 1 秒检索一次时间和日期数据
unsigned long previousMillis = 0;

//显示小时和分钟的变量
char hr_24 ;
String str_hr_24;
char mn ;
String str_mn;

void ScanDMD() {
dmd.scanDisplayBySPI();
}

void setup() {
Serial.begin(115200);
Serial.println("Arduino RTC DS1307");
delay(1000);

if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
}

if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    //-> 根据您的计算机时间和日期设置时间和日期。如果这不起作用,请在“if (!rtc.isrunning())”之外使用这行代码
    // 此行使用明确的日期和时间设置 RTC,例如设置
    // 2022 年 5 月 21 日凌晨 6 点,您可以设置:
    rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
}
// 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
//-> 根据您的计算机时间和日期设置时间和日期。如果在“if (!rtc.isrunning())”中不起作用,请使用这行代码
// rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
// 如果时间和日期设置成功,则停用代码行(使代码成为注释),然后重新上传代码。
// 如果没有完成,那么时间和日期将返回到 arduino 重置或重新启动时设置的开头。

Timer1.initialize(1000);
Timer1.attachInterrupt(ScanDMD);
dmd.clearScreen(true);
}

void loop() {
//millis() 显示时间
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis; //保存最后一次

    GetDateTime(); //从 DS1307 检索时间和日期数据

    dmd.selectFont(Font_6x14);

    //在 P10 中显示小时
    str_hr_24 = String(_hour24);
    str_hr_24.toCharArray(hr_24, 3);

    if (_hour24 < 10) {
      dmd.drawString(0, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(7, 0, hr_24, 1, GRAPHICS_NORMAL);
    }
    else {
      dmd.drawString(0, 0, hr_24, 2, GRAPHICS_NORMAL);
    }
   
    //在 P10 中显示“:”
    if (_second % 2 == 0) {
      dmd.drawFilledBox(15, 3, 16, 4, GRAPHICS_OR);
      dmd.drawFilledBox(15, 11, 16, 12, GRAPHICS_OR);
    }
    else {
      dmd.drawFilledBox(15, 3, 16, 4, GRAPHICS_NOR);
      dmd.drawFilledBox(15, 11, 16, 12, GRAPHICS_NOR);
    }
   
    //在 P10 中显示分钟
    str_mn = String(_minute);
    str_mn.toCharArray(mn, 3);

    if (_minute < 10) {
      dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(26, 0, mn, 1, GRAPHICS_NORMAL);
    }
    else {
      dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
    }
   
    //调用 scrolling_date() 子例程来显示日期。
    if (_second == 11) { //当秒数等于 11 时显示日期
      scrolling_date();
    }
}
}

//从 DS1307 检索或更新时间和日期的子程序
void GetDateTime() {
DateTime now = rtc.now();
_day = now.day();
_month = now.month();
_year = now.year();
_hour24 = now.hour();
_minute = now.minute();
_second = now.second();
_dtw = now.dayOfTheWeek();

hr24 = _hour24;
if (hr24 > 12) {
    _hour12 = hr24 - 12;
}
else if (hr24 == 0) {
    _hour12 = 12;
}
else {
    _hour12 = hr24;
}

if (hr24 < 12) {
    st = "AM";
}
else {
    st = "PM";
}
}

//显示日、月、年的子程序
void scrolling_date() {
String Date = String(nameoftheday) + ", " + String(_day) + "-" + String(month_name) + "-" + String(_year);
char dt;
Date.toCharArray(dt, 50);

dmd.clearScreen(true);
dmd.selectFont(Arial_Black_16);
dmd.drawMarquee(dt, strlen(dt), (32 * DISPLAYS_ACROSS) - 1, 0);
boolean ret = false;
while (!ret) {
    ret = dmd.stepMarquee(-1, 0);
    delay(75); //延迟滚动速度
}
dmd.clearScreen(true);
return;
}

驴友花雕 发表于 2022-6-9 06:43:26

(2)实验接线示意图

驴友花雕 发表于 2022-6-9 06:45:23

(3)实验场景图


驴友花雕 发表于 2022-6-9 06:46:33


驴友花雕 发表于 2022-6-11 10:28:43

程序十八:使用DS1307的双行字日期时钟(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十八:使用DS1307的双行字日期时钟
*/

//RTC库
#include "RTClib.h"

//使用了 SPI、DMD、TimerOne 和 Font 库
#include <SPI.h>
#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"
#include "Font_6x14.h" //这个字体只包含 0-9 的数字。仅用于显示时间。

//配置P10
#define DISPLAYS_ACROSS 1 //使用的 P10 面板数量,左右。
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);


RTC_DS1307 rtc; //RTC模块初始化

//时间和日期的变量
int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
int hr24;
String st;
char nameoftheday = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char month_name = {"January", "February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"};

//Millis 的变量
const long interval = 1000; //每 1 秒检索一次时间和日期数据
unsigned long previousMillis = 0;

const long interval_for_date = 75; //滚动速度
unsigned long previousMillis_for_date = 0;

//显示小时和分钟的变量
char hr_24 ;
String str_hr_24;
char mn ;
String str_mn;

void ScanDMD() {
dmd.scanDisplayBySPI();
}

void setup() {
Serial.begin(115200);
Serial.println("Arduino RTC DS1307准备就绪");
delay(1000);

if (! rtc.begin()) {
    Serial.println("找不到 RTC");
    while (1);
}

if (! rtc.isrunning()) {
    Serial.println("RTC 没有运行!");
    // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    //-> 根据您的计算机时间和日期设置时间和日期。如果这不起作用,请在“if (!rtc.isrunning())”之外使用这行代码
    // 此行使用明确的日期和时间设置 RTC,例如设置
    // 2022 年 5 月 21 日凌晨 6 点,您可以设置:
    rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
}
// 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
//-> 根据您的计算机时间和日期设置时间和日期。如果在“if (!rtc.isrunning())”中不起作用,请使用这行代码
// rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
// 如果时间和日期设置成功,则停用代码行(使代码成为注释),然后重新上传代码。
// 如果没有完成,那么时间和日期将返回到 arduino 重置或重新启动时设置的开头。

Timer1.initialize(1000);
Timer1.attachInterrupt(ScanDMD);
dmd.clearScreen(true);
}

void loop() {
//millis() 显示时间
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis; //保存最后一次

    GetDateTime(); //从 DS1307 检索时间和日期数据

    dmd.selectFont(Font_6x14);

    //在 P10 中显示小时
    str_hr_24 = String(_hour24);
    str_hr_24.toCharArray(hr_24, 3);

    if (_hour24 < 10) {
      dmd.drawString(0, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(7, 0, hr_24, 1, GRAPHICS_NORMAL);
    }
    else {
      dmd.drawString(0, 0, hr_24, 2, GRAPHICS_NORMAL);
    }

    //在 P10 中显示“:”
    if (_second % 2 == 0) {
      dmd.drawFilledBox(15, 3, 16, 4, GRAPHICS_OR);
      dmd.drawFilledBox(15, 11, 16, 12, GRAPHICS_OR);
    }
    else {
      dmd.drawFilledBox(15, 3, 16, 4, GRAPHICS_NOR);
      dmd.drawFilledBox(15, 11, 16, 12, GRAPHICS_NOR);
    }

    //在 P10 中显示分钟
    str_mn = String(_minute);
    str_mn.toCharArray(mn, 3);

    if (_minute < 10) {
      dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(26, 0, mn, 1, GRAPHICS_NORMAL);
    }
    else {
      dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
    }

    //调用 scrolling_date() 子例程来显示日期。
    if (_second == 11) { //当秒数等于 11 时显示日期
      scrolling_date();
    }
}
}

//从 DS1307 检索或更新时间和日期的子程序
void GetDateTime() {
DateTime now = rtc.now();
_day = now.day();
_month = now.month();
_year = now.year();
_hour24 = now.hour();
_minute = now.minute();
_second = now.second();
_dtw = now.dayOfTheWeek();

hr24 = _hour24;
if (hr24 > 12) {
    _hour12 = hr24 - 12;
}
else if (hr24 == 0) {
    _hour12 = 12;
}
else {
    _hour12 = hr24;
}

if (hr24 < 12) {
    st = "AM";
}
else {
    st = "PM";
}
}

//显示日、月、年的子程序
void scrolling_date() {
dmd.clearScreen(true);
delay(100);

//保存要显示的日期数据
String Date = String(nameoftheday) + ", " + String(_day) + "-" + String(month_name) + "-" + String(_year);
char dt;
Date.toCharArray(dt, 50);
int i = 32 + 10;
int j = strlen(dt) + (strlen(dt) * 5);

dmd.selectFont(SystemFont5x7);

while (1) {
    //millis() 显示时间
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis; //保存最后一次

      //在 P10 中显示时钟
      str_hr_24 = String(_hour24);
      str_hr_24.toCharArray(hr_24, 3);

      if (_hour24 < 10) {
      dmd.drawString(2, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
      }
      else {
      dmd.drawString(2, 0, hr_24, 2, GRAPHICS_NORMAL);
      }

      //在 P10 中显示“:”
      GetDateTime(); // 从 DS1307 检索时间和日期数据
      if (_second % 2 == 0) {
      dmd.drawString(14, 0, ":", 2, GRAPHICS_OR);
      }
      else {
      dmd.drawString(14, 0, ":", 2, GRAPHICS_NOR);
      }

      //在 P10 中显示分钟
      str_mn = String(_minute);
      str_mn.toCharArray(mn, 3);

      if (_minute < 10) {
      dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(25, 0, mn, 1, GRAPHICS_NORMAL);
      }
      else {
      dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
      }
    }

    //millis() 用于显示和滚动日期
    unsigned long currentMillis_for_date = millis();
    if (currentMillis_for_date - previousMillis_for_date >= interval_for_date) {
      previousMillis_for_date = currentMillis_for_date; //保存最后一次时间

      i--;
      dmd.drawString(i, 9, dt, strlen(dt), GRAPHICS_NORMAL);
      if (i <= ~j) {
      dmd.clearScreen(true);
      delay(100);
      return;
      }
    }
}
}

驴友花雕 发表于 2022-6-11 10:30:05

(2)实验场景图

驴友花雕 发表于 2022-6-11 10:31:36


驴友花雕 发表于 2022-6-11 10:33:10


驴友花雕 发表于 2022-6-13 15:13:04

程序十九:显示时、分、秒和日期的时钟(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十九:显示时、分、秒和日期的时钟
*/

//RTC库
#include <Wire.h>
#include "RTClib.h"

//使用了 SPI、DMD、TimerOne 和 Font 库
#include <SPI.h>
#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"
#include "Font_6x14.h" //这个字体只包含 0-9 的数字。仅用于显示时间。

//配置P10
#define DISPLAYS_ACROSS 1 //使用的 P10 面板数量,左右。
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);


RTC_DS1307 rtc; //RTC模块初始化

//时间和日期的变量
int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
int hr24;
String st;
char nameoftheday = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char month_name = {"January", "February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"};

//Millis 的变量
const long interval = 1000; //每 1 秒检索一次时间和日期数据
unsigned long previousMillis = 0;

const long interval_for_date = 75; //滚动速度
unsigned long previousMillis_for_date = 0;

//显示小时\分钟\秒的变量
char hr_24 ;
String str_hr_24;
char mn ;
String str_mn;
char sc ;
String str_sc;

void ScanDMD() {
dmd.scanDisplayBySPI();
}

void setup() {
Serial.begin(115200);
Serial.println("Arduino RTC DS1307准备就绪");
delay(1000);

if (! rtc.begin()) {
    Serial.println("找不到 RTC");
    while (1);
}

if (! rtc.isrunning()) {
    Serial.println("RTC 没有运行!");
    // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // 根据您的计算机时间和日期设置时间和日期。如果这不起作用,请在“if (!rtc.isrunning())”之外使用这行代码
    // 此行使用明确的日期和时间设置 RTC,例如设置
    // 2022 年 5 月 21 日凌晨 6 点,您可以设置:
    rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
}
// 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// 根据您的计算机时间和日期设置时间和日期。如果在“if (!rtc.isrunning())”中不起作用,请使用这行代码
// rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
// 如果时间和日期设置成功,则停用代码行(使代码成为注释),然后重新上传代码。
// 如果没有完成,那么时间和日期将返回到 arduino 重置或重新启动时设置的开头。

Timer1.initialize(1000);
Timer1.attachInterrupt(ScanDMD);
dmd.clearScreen(true);
}

void loop() {
//millis() 显示时间
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis; //保存最后一次

    GetDateTime(); //从 DS1307 检索时间和日期数据

    dmd.selectFont(Font_6x14);

    //在 P10 中显示小时
    str_hr_24 = String(_hour24);
    str_hr_24.toCharArray(hr_24, 3);

    if (_hour24 < 10) {
      dmd.drawString(1, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
    }
    else {
      dmd.drawString(1, 0, hr_24, 2, GRAPHICS_NORMAL);
    }

    //在 P10 中显示“:”
    dmd.drawFilledBox(16, 3, 17, 4, GRAPHICS_NORMAL);
    dmd.drawFilledBox(16, 11, 17, 12, GRAPHICS_NORMAL);

    //在 P10 中显示分和秒
    dmd.selectFont(SystemFont5x7);
    str_mn = String(_minute);
    str_mn.toCharArray(mn, 3);

    if (_minute < 10) {
      dmd.drawString(20, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(26, 0, mn, 1, GRAPHICS_NORMAL);
    }
    else {
      dmd.drawString(20, 0, mn, 2, GRAPHICS_NORMAL);
    }

    str_sc = String(_second);
    str_sc.toCharArray(sc, 3);

    if (_second < 10) {
      dmd.drawString(20, 9, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(26, 9, sc, 1, GRAPHICS_NORMAL);
    }
    else {
      dmd.drawString(20, 9, sc, 2, GRAPHICS_NORMAL);
    }

    //调用 scrolling_date() 子例程来显示日期。
    if (_second == 11) { //秒等于 11 时显示日期
      scrolling_date();
    }
}
}

//从 DS1307 检索或更新时间和日期的子程序
void GetDateTime() {
DateTime now = rtc.now();
_day = now.day();
_month = now.month();
_year = now.year();
_hour24 = now.hour();
_minute = now.minute();
_second = now.second();
_dtw = now.dayOfTheWeek();

hr24 = _hour24;
if (hr24 > 12) {
    _hour12 = hr24 - 12;
}
else if (hr24 == 0) {
    _hour12 = 12;
}
else {
    _hour12 = hr24;
}

if (hr24 < 12) {
    st = "AM";
}
else {
    st = "PM";
}
}

//显示日、月、年的子程序
void scrolling_date() {
dmd.clearScreen(true);
delay(100);

//保存要显示的日期数据
String Date = String(nameoftheday) + ", " + String(_day) + "-" + String(month_name) + "-" + String(_year);
char dt;
Date.toCharArray(dt, 50);
int i = 32 + 10;
int j = strlen(dt) + (strlen(dt) * 5);

dmd.selectFont(SystemFont5x7);

while (1) {
    //millis() 显示时间
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis; //保存最后一次时间

      //在 P10 中显示时钟
      str_hr_24 = String(_hour24);
      str_hr_24.toCharArray(hr_24, 3);

      if (_hour24 < 10) {
      dmd.drawString(2, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
      }
      else {
      dmd.drawString(2, 0, hr_24, 2, GRAPHICS_NORMAL);
      }

      //在 P10 中显示“:”
      GetDateTime(); //从 DS1307 检索时间和日期数据
      if (_second % 2 == 0) {
      dmd.drawString(14, 0, ":", 2, GRAPHICS_OR);
      }
      else {
      dmd.drawString(14, 0, ":", 2, GRAPHICS_NOR);
      }

      //在 P10 中显示分钟
      str_mn = String(_minute);
      str_mn.toCharArray(mn, 3);

      if (_minute < 10) {
      dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(25, 0, mn, 1, GRAPHICS_NORMAL);
      }
      else {
      dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
      }
    }

    //millis() 用于显示和滚动日期
    unsigned long currentMillis_for_date = millis();
    if (currentMillis_for_date - previousMillis_for_date >= interval_for_date) {
      previousMillis_for_date = currentMillis_for_date; //保存最后一次时间

      i--;
      dmd.drawString(i, 9, dt, strlen(dt), GRAPHICS_NORMAL);
      if (i <= ~j) {
      dmd.clearScreen(true);
      delay(100);
      return;
      }
    }
}
}

驴友花雕 发表于 2022-6-13 15:14:39

(2)实验场景图

驴友花雕 发表于 2022-6-13 15:15:52


驴友花雕 发表于 2022-6-13 15:17:05


驴友花雕 发表于 2022-6-13 15:18:38

程序二十:P10显示屏数码时钟(风格之四)(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序二十:P10显示屏数码时钟(风格之四)
*/

//RTC库
#include <Wire.h>
#include "RTClib.h"

//使用了 SPI、DMD、TimerOne 和 Font 库
#include <SPI.h>
#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"

//配置P10
#define DISPLAYS_ACROSS 1 //使用的 P10 面板数量,左右。
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);


RTC_DS1307 rtc; //RTC模块初始化

//时间和日期的变量
int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
int hr24;
String st;
char nameoftheday = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char month_name = {"January", "February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"};

//Millis 的变量
const long interval = 1000; //每 1 秒检索一次时间和日期数据
unsigned long previousMillis = 0;

const long interval_for_date = 75; //滚动速度
unsigned long previousMillis_for_date = 0;

//显示小时\分钟\秒的变量
char hr_24 ;
String str_hr_24;
char mn ;
String str_mn;
char sc ;
String str_sc;

String strSecondRow;
char chrSecondRow;
int i = 32;
int j;
int sr = 1;

void ScanDMD() {
dmd.scanDisplayBySPI();
}

void setup() {
Serial.begin(115200);
Serial.println("Arduino RTC DS1307准备就绪");
delay(1000);

if (! rtc.begin()) {
    Serial.println("找不到 RTC");
    while (1);
}

if (! rtc.isrunning()) {
    Serial.println("RTC 没有运行!");
    // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // 根据您的计算机时间和日期设置时间和日期。如果这不起作用,请在“if (!rtc.isrunning())”之外使用这行代码
    // 此行使用明确的日期和时间设置 RTC,例如设置
    // 2022 年 5 月 21 日凌晨 6 点,您可以设置:
    rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
}
// 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// 根据您的计算机时间和日期设置时间和日期。如果在“if (!rtc.isrunning())”中不起作用,请使用这行代码
// rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
// 如果时间和日期设置成功,则停用代码行(使代码成为注释),然后重新上传代码。
// 如果没有完成,那么时间和日期将返回到 arduino 重置或重新启动时设置的开头。

Timer1.initialize(1000);
Timer1.attachInterrupt(ScanDMD);
dmd.clearScreen(true);
dmd.selectFont(SystemFont5x7);
}

void loop() {
//millis() 显示时间
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis; //保存最后一次

    GetDateTime(); //从 DS1307 检索时间和日期数据

    //在 P10 中显示小时
    str_hr_24 = String(_hour24);
    str_hr_24.toCharArray(hr_24, 3);

    if (_hour24 < 10) {
      dmd.drawString(2, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
    }
    else {
      dmd.drawString(2, 0, hr_24, 2, GRAPHICS_NORMAL);
    }

    //在 P10 中显示“:”
    GetDateTime(); //从 DS1307 检索时间和日期数据
    if (_second % 2 == 0) {
      dmd.drawString(14, 0, ":", 2, GRAPHICS_OR);
    }
    else {
      dmd.drawString(14, 0, ":", 2, GRAPHICS_NOR);
    }

    //在 P10 中显示分和秒
    str_mn = String(_minute);
    str_mn.toCharArray(mn, 3);

    if (_minute < 10) {
      dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
      dmd.drawString(25, 0, mn, 1, GRAPHICS_NORMAL);
    }
    else {
      dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
    }
}

//millis() 用于显示/滚动日期和其他文本
unsigned long currentMillis_for_date = millis();
if (currentMillis_for_date - previousMillis_for_date >= interval_for_date) {
    previousMillis_for_date = currentMillis_for_date; //保存最后一次时间

    //保存日期数据和其他要显示的文本
    switch (sr) {
      case 1:
      strSecondRow = String(nameoftheday) + ", " + String(_day) + "-" + String(month_name) + "-" + String(_year);
      strSecondRow.toCharArray(chrSecondRow, 60);
      j = strlen(chrSecondRow) + (strlen(chrSecondRow) * 5);
      break;
      case 2:
      strSecondRow = "Don't Forget to Subscribe Uteh Str Channel on YouTube";
      strSecondRow.toCharArray(chrSecondRow, 60);
      j = strlen(chrSecondRow) + (strlen(chrSecondRow) * 5);
      break;
    }

    i--;
    dmd.drawString(i, 9, chrSecondRow, strlen(chrSecondRow), GRAPHICS_NORMAL);
    if (i <= ~j) {
      i = 32;
      sr++;
      if (sr > 2) sr = 1;
    }
}
}

//从 DS1307 检索或更新时间和日期的子程序
void GetDateTime() {
DateTime now = rtc.now();
_day = now.day();
_month = now.month();
_year = now.year();
_hour24 = now.hour();
_minute = now.minute();
_second = now.second();
_dtw = now.dayOfTheWeek();

hr24 = _hour24;
if (hr24 > 12) {
    _hour12 = hr24 - 12;
}
else if (hr24 == 0) {
    _hour12 = 12;
}
else {
    _hour12 = hr24;
}

if (hr24 < 12) {
    st = "AM";
}
else {
    st = "PM";
}
}

驴友花雕 发表于 2022-6-13 15:19:53

(2)实验场景图

驴友花雕 发表于 2022-6-13 15:20:55


页: 1 2 3 [4]
查看完整版本: 【Arduino】168种传感器模块系列实验(123)---P10V706LED屏模组