7.震动触发LED亮
震动开关(震动传感器)
工作原理
弹簧开关,其内部由一根中心金属导电脚和环绕在其外部的弹簧导电脚组成。弹簧震动时会接触到中心导电脚,形成短路闭合状态;
滚珠开关,其内部包含有一颗金属滚珠,当震动时滚珠滚动短路两个导电脚,形成短路闭合状态。
中断触发:
在程序的运行中,我们时常需要监控一些事件的发生,比如对某一传感器的返回数据进行解析。使用轮询的方式检测,效率比较低,而且随着程序功能增加,轮询到指定功能时需要等待的时间变长。而使用中断方式检测,可以到达实时检测的效果。
中断程序可以看作是一段独立于主程序之外的程序,当中断触发时,控制器会暂停当前正在运行的主程序,而跳转去运行中断程序,中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。如此便可做到实时响应处理事件的效果。
①如下进行连接
②代码如下
int SensorLED = 9; //定义LED为数字引脚9
int SensorINPUT = 2; //连接震动开关到中断0,也就是数字引脚2
char state = LOW;
void setup() {
pinMode(SensorLED, OUTPUT); //LED为输出模式
pinMode(SensorINPUT, INPUT_PULLUP); //震动开关为输入模式
//下降沿触发,触发中断0,调用blink函数
attachInterrupt(0, blink, FALLING);
}
void loop() {
if (state == HIGH) { // 如果state为HIGH
state = LOW;
digitalWrite(SensorLED, HIGH); // 亮灯
delay(500); //延时500ms
}
else {
digitalWrite(SensorLED, LOW); // 否则,关灯
}
}
void blink() { //中断函数blink()
state = !state; //一旦中断触发,state状态反转
}
③解释说明
触发震动LED变亮
当触发震动时,与LED并联的线路,也就是震动触发器那条路,发生短路,导致LED熄灭
一旦发生下降沿中断,那么不论在loop()函数中执行到哪里,都需要执行中断执行函数(这里是blink())
attachInterrupt()
attachInterrupt(interrupt, ISR, mode)
外部中断配置函数。
参数:
interrupt: 中断号。不同Arduino开发板中断号不同。Uno R3有两个外部中断,分别为数字管脚2(中断0)和数字管脚3(中断1)。
ISR: 中断处理函数。此函数不带参数,没有返回值。
mode: 中断触发方式。
LOW: 低电平触发。
CHANGE:管脚状态改变触发。
RISING:上升沿触发。
FALLING:下降沿触发。
8.将数码管点亮
数码管
①如下连接
②代码如下
//设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。
int pin_a = 7;
int pin_b = 6;
int pin_c = 5;
int pin_d = 10;
int pin_e = 11;
int pin_f = 8;
int pin_g = 9;
int pin_p = 4;
//根据共阴极数码管段码表定义0~9显示的各段开关状态
int numTable[10][8] = {
//1为点亮,0为关闭
//a b c d e f g dp
{1, 1, 1, 1, 1, 1, 0, 0}, //0
{0, 1, 1, 0, 0, 0, 0, 0}, //1
{1, 1, 0, 1, 1, 0, 1, 0}, //2
{1, 1, 1, 1, 0, 0, 1, 0}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{1, 0, 1, 1, 0, 1, 1, 0}, //5
{1, 0, 1, 1, 1, 1, 1, 0}, //6
{1, 1, 1, 0, 0, 0, 0, 0}, //7
{1, 1, 1, 1, 1, 1, 1, 0}, //8
{1, 1, 1, 1, 0, 1, 1, 0}, //9
};
void setup()
{
for (int i = 4; i <= 11; i++)
{
pinMode(i, OUTPUT); //设置4~11引脚为输出模式
}
}
void loop()
{
for (int i = 0; i < 10; i++)//以此显示数字0到9
{
digitalWrite(pin_a, numTable
[0]); //设置a 引脚的电平
digitalWrite(pin_b, numTable[1]); //设置b 引脚的电平
digitalWrite(pin_c, numTable[2]); //设置c 引脚的电平
digitalWrite(pin_d, numTable[3]); //设置d 引脚的电平
digitalWrite(pin_e, numTable[4]); //设置e 引脚的电平
digitalWrite(pin_f, numTable[5]); //设置f 引脚的电平
digitalWrite(pin_g, numTable[6]); //设置g 引脚的电平
digitalWrite(pin_p, numTable[7]); //设置dp引脚的电平
delay(1000);
}
}
③解释说明
循环输出0-9,i是几输出的就是几
9.随机数字
①如下图连接
②代码如下
/*
Random
通过Random随机显示0到9的数字
*/
//设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。
int pin_a = 7;
int pin_b = 6;
int pin_c = 5;
int pin_d = 10;
int pin_e = 11;
int pin_f = 8;
int pin_g = 9;
int pin_p = 4;
int num;
//根据共阴极数码管段码表定义0~9显示的各段开关状态
int numTable[10][8] = {
//1为点亮,0为关闭
//a b c d e f g dp
{1, 1, 1, 1, 1, 1, 0, 0}, //0
{0, 1, 1, 0, 0, 0, 0, 0}, //1
{1, 1, 0, 1, 1, 0, 1, 0}, //2
{1, 1, 1, 1, 0, 0, 1, 0}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{1, 0, 1, 1, 0, 1, 1, 0}, //5
{1, 0, 1, 1, 1, 1, 1, 0}, //6
{1, 1, 1, 0, 0, 0, 0, 0}, //7
{1, 1, 1, 1, 1, 1, 1, 0}, //8
{1, 1, 1, 1, 0, 1, 1, 0}, //9
};
void setup()
{
for (int i = 4; i <= 11; i++)
{
pinMode(i, OUTPUT); //设置4~11引脚为输出模式
}
randomSeed(analogRead(0));
}
//根据索引显示数字
void showNum(int index)
{
digitalWrite(pin_a, numTable[index][0]); //设置a 引脚的电平
digitalWrite(pin_b, numTable[index][1]); //设置b 引脚的电平
digitalWrite(pin_c, numTable[index][2]); //设置c 引脚的电平
digitalWrite(pin_d, numTable[index][3]); //设置d 引脚的电平
digitalWrite(pin_e, numTable[index][4]); //设置e 引脚的电平
digitalWrite(pin_f, numTable[index][5]); //设置f 引脚的电平
digitalWrite(pin_g, numTable[index][6]); //设置g 引脚的电平
digitalWrite(pin_p, numTable[index][7]); //设置dp引脚的电平
}
void loop()
{
num = random(10); //产生随机数
showNum(num); //显示随机数
delay(5000);
}
③解释说明
将数字显示作为一个函数,通过random获取函数参数,获取一个随机数,然后调用函数进行显示
10.数码管库的使用
首先进行库的导入,可以进入下面链接查看
https://www.jianshu.com/p/3dbb529bde27
①如下图连接
②代码如下
/*
* SevSeg
* 使用数码管库驱动数码管,根据A0模拟输入显示对应数字
*/
#include "SevSeg.h"
SevSeg sevseg;
byte numDigits = 1; //数码管位数
byte digitPins[] = {3, 2, 2, 2}; //数码管公共极连接Arduino的引脚
byte segmentPins[] = {7, 6, 5, 10, 11, 8, 9, 4}; //数码管a,b,c,d,e,f,g,dp对应引脚
byte hardwareConfig = COMMON_CATHODE ; // 共阴极数码管
int readValue = 0; //保存读到的模拟值
int showValue = 0; //需要显示的数据
void setup() {
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins); //初始化数码管
}
void loop() {
readValue = analogRead(A0); //读取A0模拟口的数值(0-5V 对应0-1023取值)
showValue = map(readValue, 0, 1023, 0, 9); //将0-1023之间的数据映射成0到9之间的数据
sevseg.setNumber(showValue, 1); //数码管显示
sevseg.refreshDisplay(); // 必须重复运行刷新数码管显示
}
③解释说明
sevsrg()
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins)
初始化数码管
参数:
hardwareConfig:使用的是共阳极数码管还是共阴极数码管。
COMMON_CATHODE:共阴极。
COMMON_ANODE:共阳极。
numDigits:数码管位数,我们这里使用的是一位数码管,故其值设置为1。
digitPins:数组形式,用来存储数码管公共极连接的引脚号。此库多用来驱动四位数码管,本实验中只用一位,故数组第一个成员为3(对应实际电路连接),其他成员填入未使用的引脚即可。
segmentPins:数组形式,用来存储数码管从a到g所对应连接的引脚号。
sevseg.setNumber(numToShow, decPlaces)
数码管显示
参数:
numToShow:要显示的数据,可以为整数、浮点数。
decPlaces:小数点显示的位置,从最低有效位开始计算,若省略或者设置为-1则表示不显示小数点。
sevseg.refreshDisplay()
刷新数码管
此函数需要不断重复执行,反复刷新才能使数码管显示。若程序中有其他延时则会对显示产生影响。
7.震动触发LED亮
震动开关(震动传感器)
工作原理
弹簧开关,其内部由一根中心金属导电脚和环绕在其外部的弹簧导电脚组成。弹簧震动时会接触到中心导电脚,形成短路闭合状态;
滚珠开关,其内部包含有一颗金属滚珠,当震动时滚珠滚动短路两个导电脚,形成短路闭合状态。
中断触发:
在程序的运行中,我们时常需要监控一些事件的发生,比如对某一传感器的返回数据进行解析。使用轮询的方式检测,效率比较低,而且随着程序功能增加,轮询到指定功能时需要等待的时间变长。而使用中断方式检测,可以到达实时检测的效果。
中断程序可以看作是一段独立于主程序之外的程序,当中断触发时,控制器会暂停当前正在运行的主程序,而跳转去运行中断程序,中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。如此便可做到实时响应处理事件的效果。
①如下进行连接
②代码如下
int SensorLED = 9; //定义LED为数字引脚9
int SensorINPUT = 2; //连接震动开关到中断0,也就是数字引脚2
char state = LOW;
void setup() {
pinMode(SensorLED, OUTPUT); //LED为输出模式
pinMode(SensorINPUT, INPUT_PULLUP); //震动开关为输入模式
//下降沿触发,触发中断0,调用blink函数
attachInterrupt(0, blink, FALLING);
}
void loop() {
if (state == HIGH) { // 如果state为HIGH
state = LOW;
digitalWrite(SensorLED, HIGH); // 亮灯
delay(500); //延时500ms
}
else {
digitalWrite(SensorLED, LOW); // 否则,关灯
}
}
void blink() { //中断函数blink()
state = !state; //一旦中断触发,state状态反转
}
③解释说明
触发震动LED变亮
当触发震动时,与LED并联的线路,也就是震动触发器那条路,发生短路,导致LED熄灭
一旦发生下降沿中断,那么不论在loop()函数中执行到哪里,都需要执行中断执行函数(这里是blink())
attachInterrupt()
attachInterrupt(interrupt, ISR, mode)
外部中断配置函数。
参数:
interrupt: 中断号。不同Arduino开发板中断号不同。Uno R3有两个外部中断,分别为数字管脚2(中断0)和数字管脚3(中断1)。
ISR: 中断处理函数。此函数不带参数,没有返回值。
mode: 中断触发方式。
LOW: 低电平触发。
CHANGE:管脚状态改变触发。
RISING:上升沿触发。
FALLING:下降沿触发。
8.将数码管点亮
数码管
①如下连接
②代码如下
//设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。
int pin_a = 7;
int pin_b = 6;
int pin_c = 5;
int pin_d = 10;
int pin_e = 11;
int pin_f = 8;
int pin_g = 9;
int pin_p = 4;
//根据共阴极数码管段码表定义0~9显示的各段开关状态
int numTable[10][8] = {
//1为点亮,0为关闭
//a b c d e f g dp
{1, 1, 1, 1, 1, 1, 0, 0}, //0
{0, 1, 1, 0, 0, 0, 0, 0}, //1
{1, 1, 0, 1, 1, 0, 1, 0}, //2
{1, 1, 1, 1, 0, 0, 1, 0}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{1, 0, 1, 1, 0, 1, 1, 0}, //5
{1, 0, 1, 1, 1, 1, 1, 0}, //6
{1, 1, 1, 0, 0, 0, 0, 0}, //7
{1, 1, 1, 1, 1, 1, 1, 0}, //8
{1, 1, 1, 1, 0, 1, 1, 0}, //9
};
void setup()
{
for (int i = 4; i <= 11; i++)
{
pinMode(i, OUTPUT); //设置4~11引脚为输出模式
}
}
void loop()
{
for (int i = 0; i < 10; i++)//以此显示数字0到9
{
digitalWrite(pin_a, numTable
[0]); //设置a 引脚的电平
digitalWrite(pin_b, numTable[1]); //设置b 引脚的电平
digitalWrite(pin_c, numTable[2]); //设置c 引脚的电平
digitalWrite(pin_d, numTable[3]); //设置d 引脚的电平
digitalWrite(pin_e, numTable[4]); //设置e 引脚的电平
digitalWrite(pin_f, numTable[5]); //设置f 引脚的电平
digitalWrite(pin_g, numTable[6]); //设置g 引脚的电平
digitalWrite(pin_p, numTable[7]); //设置dp引脚的电平
delay(1000);
}
}
③解释说明
循环输出0-9,i是几输出的就是几
9.随机数字
①如下图连接
②代码如下
/*
Random
通过Random随机显示0到9的数字
*/
//设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。
int pin_a = 7;
int pin_b = 6;
int pin_c = 5;
int pin_d = 10;
int pin_e = 11;
int pin_f = 8;
int pin_g = 9;
int pin_p = 4;
int num;
//根据共阴极数码管段码表定义0~9显示的各段开关状态
int numTable[10][8] = {
//1为点亮,0为关闭
//a b c d e f g dp
{1, 1, 1, 1, 1, 1, 0, 0}, //0
{0, 1, 1, 0, 0, 0, 0, 0}, //1
{1, 1, 0, 1, 1, 0, 1, 0}, //2
{1, 1, 1, 1, 0, 0, 1, 0}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{1, 0, 1, 1, 0, 1, 1, 0}, //5
{1, 0, 1, 1, 1, 1, 1, 0}, //6
{1, 1, 1, 0, 0, 0, 0, 0}, //7
{1, 1, 1, 1, 1, 1, 1, 0}, //8
{1, 1, 1, 1, 0, 1, 1, 0}, //9
};
void setup()
{
for (int i = 4; i <= 11; i++)
{
pinMode(i, OUTPUT); //设置4~11引脚为输出模式
}
randomSeed(analogRead(0));
}
//根据索引显示数字
void showNum(int index)
{
digitalWrite(pin_a, numTable[index][0]); //设置a 引脚的电平
digitalWrite(pin_b, numTable[index][1]); //设置b 引脚的电平
digitalWrite(pin_c, numTable[index][2]); //设置c 引脚的电平
digitalWrite(pin_d, numTable[index][3]); //设置d 引脚的电平
digitalWrite(pin_e, numTable[index][4]); //设置e 引脚的电平
digitalWrite(pin_f, numTable[index][5]); //设置f 引脚的电平
digitalWrite(pin_g, numTable[index][6]); //设置g 引脚的电平
digitalWrite(pin_p, numTable[index][7]); //设置dp引脚的电平
}
void loop()
{
num = random(10); //产生随机数
showNum(num); //显示随机数
delay(5000);
}
③解释说明
将数字显示作为一个函数,通过random获取函数参数,获取一个随机数,然后调用函数进行显示
10.数码管库的使用
首先进行库的导入,可以进入下面链接查看
https://www.jianshu.com/p/3dbb529bde27
①如下图连接
②代码如下
/*
* SevSeg
* 使用数码管库驱动数码管,根据A0模拟输入显示对应数字
*/
#include "SevSeg.h"
SevSeg sevseg;
byte numDigits = 1; //数码管位数
byte digitPins[] = {3, 2, 2, 2}; //数码管公共极连接Arduino的引脚
byte segmentPins[] = {7, 6, 5, 10, 11, 8, 9, 4}; //数码管a,b,c,d,e,f,g,dp对应引脚
byte hardwareConfig = COMMON_CATHODE ; // 共阴极数码管
int readValue = 0; //保存读到的模拟值
int showValue = 0; //需要显示的数据
void setup() {
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins); //初始化数码管
}
void loop() {
readValue = analogRead(A0); //读取A0模拟口的数值(0-5V 对应0-1023取值)
showValue = map(readValue, 0, 1023, 0, 9); //将0-1023之间的数据映射成0到9之间的数据
sevseg.setNumber(showValue, 1); //数码管显示
sevseg.refreshDisplay(); // 必须重复运行刷新数码管显示
}
③解释说明
sevsrg()
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins)
初始化数码管
参数:
hardwareConfig:使用的是共阳极数码管还是共阴极数码管。
COMMON_CATHODE:共阴极。
COMMON_ANODE:共阳极。
numDigits:数码管位数,我们这里使用的是一位数码管,故其值设置为1。
digitPins:数组形式,用来存储数码管公共极连接的引脚号。此库多用来驱动四位数码管,本实验中只用一位,故数组第一个成员为3(对应实际电路连接),其他成员填入未使用的引脚即可。
segmentPins:数组形式,用来存储数码管从a到g所对应连接的引脚号。
sevseg.setNumber(numToShow, decPlaces)
数码管显示
参数:
numToShow:要显示的数据,可以为整数、浮点数。
decPlaces:小数点显示的位置,从最低有效位开始计算,若省略或者设置为-1则表示不显示小数点。
sevseg.refreshDisplay()
刷新数码管
此函数需要不断重复执行,反复刷新才能使数码管显示。若程序中有其他延时则会对显示产生影响。
举报