37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百一十七:P10单红V706模组 32*16单元板LED显示屏
程序十二:滚动字母,在滚动框中一次显示一个字符
(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十二:滚动字母,在滚动框中一次显示一个字符
*/
#include <SPI.h>
#include <DMD2.h>
#include <fonts/SystemFont5x7.h>
#include <fonts/Arial14.h>
// 将宽度设置为您拥有的显示器宽度
const int WIDTH = 1;
// 您可以通过注释此行来更改为较小的字体(两行),
// 并取消注释它后面的行:
const uint8_t *FONT = Arial14;
//const uint8_t *FONT = SystemFont5x7;
const char *MESSAGE = "abcdefghijklmnopqrstuvwxyz";
SoftDMD dmd(WIDTH, 1); // DMD 控制整个显示
DMD_TextBox box(dmd); // "box" 提供一个文本框来自动写入/滚动显示
void setup() {
Serial.begin(9600);//初始化串口
dmd.setBrightness(150);//设置亮度(0-255)
dmd.selectFont(FONT);//设置字体
dmd.begin();//初始化
}
void loop() {
const char *next = MESSAGE;//循环显示
while (*next) {
Serial.print(*next);
box.print(*next);
delay(200);
next++;
}
}
(2)实验串口返回情况
(3)实验场景图
程序十三:写入滚动显示12秒倒计时
(1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十三:写入滚动显示12秒倒计时
*/
#include <SPI.h>//导入相关驱动库
#include <DMD2.h>
#include <fonts/Arial14.h>
const int COUNTDOWN_FROM = 12;
int counter = COUNTDOWN_FROM;//计数器
SoftDMD dmd(1,1); // DMD 控制整个显示
// "box" 提供一个文本框来自动写入/滚动显示
DMD_TextBox box(dmd, 0, 2);
// 设置例程在您按下重置时运行一次:
void setup() {
Serial.begin(9600);
dmd.setBrightness(255);
dmd.selectFont(Arial14);
dmd.begin();
}
//循环例程永远一遍又一遍地运行:
void loop() {
Serial.print(counter);
Serial.println(F("..."));
box.print(' ');
box.print(counter);
box.println(F("..."));
counter--;
delay(1000);//延时1000毫秒
if(counter == 0) {
for(int i = 0; i < 3; i++) {
dmd.fillScreen(true);
delay(500);
dmd.clearScreen();
delay(500);
}
box.clear();
counter = 12;
}
}
(2)实验串口返回情况
(3)实验场景图
程序十四:单个 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);
}
(2)实验场景图
程序十五:各个方向滚动闪烁显示的“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;
}
(2)实验场景图
程序十六:模拟康威的人生游戏
(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();
//(我们无法检测到事物向前变化的稳定状态
// 然后返回,对于这些你需要按下重置!)
}
}
(2)实验场景图