单片机学习小组
直播中

番茄番茄

12年用户 637经验值
私信 关注

震动如何触发LED亮?

震动如何触发LED亮?

回帖(1)

何思婷

2022-1-21 13:53:19
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()
刷新数码管
此函数需要不断重复执行,反复刷新才能使数码管显示。若程序中有其他延时则会对显示产生影响。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分