37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十一:8位LED数码管MAX7219模块(支持级联八位串行3个IO口控制)
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十一: 8位LED数码管MAX7219模块
项目之六:最简办法显示数字串
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十四: 8位LED数码管MAX7219模块
项目之六:最简办法显示数字串
*/
#include "LedControl.h"
LedControl lc = LedControl(2, 4, 3, 1);
void setup() {
lc.shutdown(0, false);
lc.setIntensity(0, 6);
lc.setDigit(0, 0, 9, false);
lc.setDigit(0, 1, 8, false);
lc.setDigit(0, 2, 7, false);
lc.setDigit(0, 3, 6, false);
lc.setDigit(0, 4, 5, true);
lc.setDigit(0, 5, 4, false);
lc.setDigit(0, 6, 3, false);
lc.setDigit(0, 7, 2, false);
}
void loop() {
}
Arduino实验场景图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十一: 8位LED数码管MAX7219模块
项目之七:递归 LEDControl 计数器(8位1亿之内)
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十四: 8位LED数码管MAX7219模块
项目之七:递归 LEDControl 计数器(8位1亿之内)
*/
#include
#include "LedControl.h"
LedControl lc = LedControl(2, 4, 3, 1);
long num = 0;
void showNumber(long number, byte pos = 0) {
byte digit = number % 10;
lc.setDigit(0, pos, digit, false);
long remainingDigits = number / 10;
if (remainingDigits > 0) {
showNumber(remainingDigits, pos + 1);
}
}
void setup() {
lc.shutdown(0, false);
lc.setIntensity(0, 6);
lc.clearDisplay(0);
}
void loop() {
showNumber(num);
num++;
}
实验场景图 动态图
首先,我们需要包含所有必要的库:
#include
接下来,我们需要创建一个 LedControl 实例,它控制我们的 MAX7219 显示:
LedControl lc = LedControl(3, 4, 5, 1); // dataPin、clockPin、cs Pin、num 设备
此外,让我们创建一个变量用作计数器。由于我们要使用所有 8 位数字,因此该变量应达到 99,999,999。由于 anint只会上升到 32,768(和unsigned int: 65,535),我们将使用long. 这将使我们能够数到 2,147,483,647。
long num = 0;
现在,开始真正的魔法:我们需要定义显示数字的函数。
void showNumber(long number, byte pos = 0) {
// 所有的魔法都在这里
}
这意味着我们可以使用所需的数字作为参数调用此函数。作为第二个参数,我们定义开始的位置。数字从右到左编号,从0到7。所以我们想从 开始0,增加每个下一个数字的位置。因为我们定义了一个默认值0,所以在调用这个函数时我们可以省略这个参数。
当然,这仍然没有任何真正的魔法,所以是时候给这个函数添加一些代码了:
byte digit = number % 10;
通过%使用 10 作为除数计算数字的模 ( ),我们得到我们想要打印的数字的最后一位。例如:如果数字是123,变量digit将包含3。
使用该setDigit方法,我们现在可以将这个数字显示在屏幕上:
lc.setDigit(0, pos, digit, false);
第一个参数 ( 0) 告诉我们要使用 device 的方法0。请注意,我们目前只配置了一台设备,因此您0现在可以忽略它。
第二个参数 ( pos) 定义显示器上的位置。如果在调用我们的函数时没有定义特定的位置,这pos将是0.
第三个参数 ( digit) 定义了我们想要显示的数字。这是我们刚刚使用模运算符在上一行计算的数字。
第四个参数 ( false) 告诉显示器是否需要打开小数点。为简单起见,我们将保持关闭状态。
好的,现在可以在我们的显示器上显示一位数字了,剩下的数字呢?好问题!让我们继续扩展我们的功能:
long remainingDigits = number / 10;
通过将数字除以10,我们得到需要显示的所有剩余数字。
<div>if (remainingDigits > 0) {</div><div> showNumber(remainingDigits, pos + 1);</div><div>}</div>
这就是……真正的魔法!我说的递归!以上几行将执行以下操作:
如果remainingDigits变量大于0,则仍有数字要显示,因此我们需要执行递归操作。
递归:让函数使用两个计算参数自行调用它:remainingDigits和pos + 1
这就是这种神奇的递归方法的全部内容!完整的功能如下:
void showNumber(long number, byte pos = 0) {
byte digit = number % 10;
lc.setDigit(0, pos, digit, false);
long remainingDigits = number / 10;
if (remainingDigits > 0) {
showNumber(remainingDigits, pos + 1);
}
}
为了使其效果更清晰,请考虑以下事项:如果我们将这个函数12345作为第一个参数调用,将执行以下函数调用:
showNumber(12345); // shows a 5 on position 0
showNumber(1234, 1); // shows a 4 on position 1
showNumber(123, 2); // shows a 3 on position 2
showNumber(12, 3); // shows a 2 on position 3
showNumber(1, 4); // shows a 1 on position 4
这就是它需要做的全部!
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十一: 8位LED数码管MAX7219模块
项目之八:循环显示数字与“HELLO”
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十四: 8位LED数码管MAX7219模块
项目之八:循环显示数字与“HELLO”
*/
#include "LedControl.h"
// Arduino 引脚 2 至DIN,4 至Clk,3 至ck,设备数量是1个
LedControl lc = LedControl(2, 4, 3, 1);
//*我们总是在显示更新之间等待一段时间
unsigned long delaytime = 250;
void setup() {
//MAX72XX 在启动时处于省电模式,我们必须叫醒
lc.shutdown(0, false);
lc.setIntensity(0, 6); // 设置亮度级别(0 为最小值,15 为最大值)
lc.clearDisplay(0); // 清除显示寄存器
}
void hello(){
lc.setChar(0,7,'H',false);
lc.setChar(0,6,'E',false);
lc.setChar(0,5,'L',false);
lc.setChar(0,4,'L',false);
lc.setChar(0,3,'0',false);
lc.setChar(0,2,'.',false);
lc.setChar(0,1,'.',false);
lc.setChar(0,0,'.',false);
delay(delaytime+1000);
lc.clearDisplay(0);
delay(delaytime);
lc.setDigit(0,7,1,false);
delay(delaytime);
lc.setDigit(0,6,2,false);
delay(delaytime);
lc.setDigit(0,5,3,false);
delay(delaytime);
lc.setDigit(0,4,4,false);
delay(delaytime);
lc.setDigit(0,3,5,false);
delay(delaytime);
lc.setDigit(0,2,6,false);
delay(delaytime);
lc.setDigit(0,1,7,false);
delay(delaytime);
lc.setDigit(0,0,8,false);
delay(1500);
lc.clearDisplay(0);
delay(delaytime);
}
void loop() {
hello();
}
Arduino实验场景图