零基础学习Arduino Uno R3开发 (3)

来源于:https://www.jianshu.com/p/0f6983c4cb81

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[i][0]); //设置a 引脚的电平
    digitalWrite(pin_b, numTable[i][1]); //设置b 引脚的电平
    digitalWrite(pin_c, numTable[i][2]); //设置c 引脚的电平
    digitalWrite(pin_d, numTable[i][3]); //设置d 引脚的电平
    digitalWrite(pin_e, numTable[i][4]); //设置e 引脚的电平
    digitalWrite(pin_f, numTable[i][5]); //设置f 引脚的电平
    digitalWrite(pin_g, numTable[i][6]); //设置g 引脚的电平
    digitalWrite(pin_p, numTable[i][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()
刷新数码管
此函数需要不断重复执行,反复刷新才能使数码管显示。若程序中有其他延时则会对显示产生影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值