Arduino学习笔记4

简介: Arduino学习笔记4

一.声控灯实验

1.源代码

int led=2;//定义板子上数字2口控制小灯
int flag=0;//定义一个变量记录小灯是亮起还是熄灭
int shengyin=3;//定义声音传感器的控制口
void setup()
{
    pinMode(led,OUTPUT);//定义小灯为输出模式
    pinMode(shengyin,INPUT);//定义声音控制口为输入模式
}
void loop()
{
    if(digitalRead(shengyin)==HIGH)//判断是否检测到声音信号
    { 
         if(flag==0){//判断小灯是否亮起
            flag=1; //标志小灯亮起 
            digitalWrite(led,HIGH);//对应的LED小灯亮起
          }else{
            flag=0;  //标志小灯亮熄灭
            digitalWrite(led,LOW);//对应的LED小灯熄灭
          }
          delay(1000);//延时
    } 

2.电路图

f21404bf29df100532ba616c65bcfa0e.jpg

3.声音传感器

digitalRead(shengyin)==HIGH你可能对这个代码段比较好奇,为什么使用digitalRead函数,传感器不是应该接模拟引脚然后使用analogRead函数吗?其实传感器既可以接数字引脚也可以接模拟引脚,只有接数字引脚它只产生0和1两种输出,即数字引脚的高电平和低电平;而模拟引脚却会产生0到1024之间的数值,两种引脚都可以,只是我们平时一般对于这种传感器都采用接模拟引脚的方式。


delay(1000);//延时的作用是使效果延迟,易于我们肉眼观察。

二.红外解码实验

1.源代码

#include <IRremote.h>
int RECV_PIN = 3; // 红外一体化接收头连接到Arduino 3号引脚
IRrecv irrecv(RECV_PIN);
decode_results results; // 用于存储编码结果的对象
void setup()
{
  Serial.begin(9600); // 初始化串口通信
  irrecv.enableIRIn(); // 初始化红外解码
}
//遥控器的每个按键都对应了不同的编码,不同的遥控器使用的编码也不相同。
//出现“FFFFFFFF”编码或者“0”编码,是因为使用的是NEC协议的遥控器,当按住某按键不放时,其会发送一个重复编码“FFFFFFFF”或者“0”编码
void loop() {
    if (irrecv.decode(&results)) {
       Serial.println(results.value, HEX);//通过红外遥控输出,串口显示出来
       irrecv.resume(); // 接收下一个编码  
    }
}

2.电路图

ae08de856c0b5c926a5766d68fdcf37d.jpg

3.<IRremote.h>

<IRremote.h> 是一个用于控制红外线遥控器的 Arduino 库。它允许您使用 Arduino 控制接收和发送红外线信号,从而实现红外线遥控功能。使用该库可以方便地读取和解码来自红外线遥控器发送的信息,并将其转换为可供 Arduino 使用的格式。同时,您也可以使用该库向外部设备发送红外线信号,以实现控制外部设备的功能。<IRremote.h> 库在 Arduino IDE 的 Library Manager 中可以直接安装和使用。

4.IRrecv类

在Arduino中,IRrecv 是一个类,在使用红外线(IR)遥控器的 Arduino 项目中经常使用。它是 <IRremote .h>库的一部分,该库允许 Arduino 接收和解码来自 IR 遥控器的信号。


IRrecv irrecv(RECV_PIN)这段代码的意思是在 Arduino 中创建了一个名为 irrecv 的 IRrecv 类实例,它的构造函数参数是 RECV_PIN。这个irrecv 对象用来接收RECV_PIN指代的3号数字引脚的红外信号。

5.decode_results结构体

decode_results 是一个结构体,用于存储解码后的红外信号信息。


decode_results results表示建立一个名叫results的结构体实例对象,以便后面用来存储解码结果。


decode_results 结构体包含以下成员变量:


uint32_t value:表示解码后的红外数据;

uint16_t *rawbuf:指向原始数据缓冲区的指针;

uint16_t rawlen:原始数据缓冲区中的数据位数(即元素个数);

uint8_t decode_type:表示解码协议类型;

uint16_t panasonicAddress:仅适用于 Panasonic 协议,表示地址信息;

uint8_t numberOfBits:表示解码后的数据位数;

volatile uint16_t *rawbufPtr:指向原始数据缓冲区的当前位置的指针;

uint8_t overflow:表示是否发生了溢出。

6. .enableIRIn()函数

该函数无参数,直接在setup()调用,用于启用红外接收器模块。这个函数初始化接收器并准备好接收红外信号。一旦调用了这个函数,红外接收器就会开始监听传入的红外信号。

7..decode()函数

它是一个解码函数,用于解码红外线信号。


irrecv.decode(&results)这句代码的作用是从红外传感器接收到的数据流中解码出具体的红外编码信息,并将其存储在 results 变量中。


语法:bool decode(decode_results *results)


参数:它的参数是一个decode_results类型的结构体,意为解码存储的对象地址,注意他是一个地址。


返回值:它是一个bool声明类型,如果成功解码了信号,则返回值为 true,否则为 false。

8.HEX

在 Arduino 中,HEX 是一个常量,表示将数字以十六进制形式输出。在该行代码中,Serial.println() 是一个函数,用于将变量的值打印到串行监视器上。results.value 是要被打印的变量,它通常包含一个红外遥控器发送的编码值。通过使用 HEX 常量,将以十六进制的格式打印这个编码值。

Serial.println(results.value, HEX)表示十六进制输出results.value

Serial.println(results.value, DEC)表示十进制输出results.value

Serial.println(results.value, OCT)表示八进制输出results.value

Serial.println(results.value, BIN)表示二进制输出results.value

9..resume()函数

irrecv.resume()函数是用于接收下一个编码的。在Arduino中使用IR库时,当你想要读取下一个接收到的红外编码时,可以通过调用这个函数来启动红外接收器,从而等待接收下一个码值。


具体地说,irrecv.resume()函数会等待接收下一个红外信号,并将其解码为一个类型为decode_results的结构体。这个结构体包含了有关接收到的编码信息,例如协议、地址和命令等信息。之后,您就可以使用这些信息来执行相应的操作,如控制电子设备等。


需要注意的是,在使用irrecv.resume()函数之前,您需要先使用irrecv.enableIRIn()初始化红外接收器,以确保它能够正常工作。此外,为了避免出现干扰和错误,建议在每次读取完一个编码后,都调用irrecv.resume()函数清空缓存区并准备接收下一个编码。

三.红外控制实验

1.源代码

#include <IRremote.h>//引入的库文件
int RECV_PIN = 3; // 红外一体化接收头连接到Arduino 3号引脚
int led = 4;//数字口4控制led灯
IRrecv irrecv(RECV_PIN);
decode_results results; // 用于存储编码结果的对象
void setup()
{
  Serial.begin(9600); // 初始化串口通信
  pinMode(led,OUTPUT);  //定义数字接口为输出接口
  irrecv.enableIRIn(); // 初始化红外解码
}
//遥控器的每个按键都对应了不同的编码,不同的遥控器使用的编码也不相同。
//出现“FFFFFFFF”编码或者“0”编码,是因为使用的是NEC协议的遥控器,当按住某按键不放时,其会发送一个重复编码“FFFFFFFF”或者“0”编码
void loop() {
    if (irrecv.decode(&results)) {
       Serial.println(results.value, HEX);//通过红外遥控输出,串口显示出来,输出结果为16进制
       if(results.value == 0xFFA25D){//通过16进制判断是否是红外的CH-按键按下
          digitalWrite(led,HIGH);//打开LED灯
       }else if(results.value == 0xFF629D){//通过16进制判断是否是红外的CH按键按下
         digitalWrite(led,LOW);//关闭LED灯
       }
       irrecv.resume(); // 接收下一个编码  
    }
}

2.电路图

参考上一个实验的电路图

3.红外遥控键盘

本次实验实际上是上次实验的补充,红外遥控键盘就像一个遥控器,他有几种按键会产生不同的红外线信号,而Arduino开发板可以通过连接红外一体化接收头来接收其产生的红外线信号,通过引脚接收进行判断哪种信号。红外遥控键盘产生的各种信号,都可以以一种十六进制的二进制序列表达,但是红外遥控键盘各个按键的信号16进制表达式通常是由厂商确定的,并且不同品牌、型号的遥控器可能会采用不同的编码方式。因此,这些信号的具体编码方式需要查询相应的资料或手册。

d48d585e4c28ce365509c61596f03472.jpg


四.一位数码管显示

1.源代码

//共阴极数码管
int a=2;//定义数字接口2 连接a 段数码管
int b=3;// 定义数字接口3 连接b 段数码管
int c=4;// 定义数字接口4 连接c 段数码管
int d=5;// 定义数字接口5 连接d 段数码管
int e=6;// 定义数字接口6 连接e 段数码管
int f=7;// 定义数字接口7 连接f 段数码管
int g=8;// 定义数字接口8 连接g 段数码管
int dp=9;// 定义数字接口9 连接dp 段数码管
void digital_0(void) //显示数字0
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,LOW);
    digitalWrite(dp,HIGH);
}
void digital_1(void) //显示数字1
{
    digitalWrite(a,LOW);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,LOW);
    digitalWrite(e,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
    digitalWrite(dp,HIGH);
}
void digital_2(void) //显示数字2
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,LOW);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,LOW);
    digitalWrite(g,HIGH);
    digitalWrite(dp,HIGH);
}
void digital_3(void) //显示数字3
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,HIGH);
    digitalWrite(dp,HIGH);
}
void digital_4(void) //显示数字4
{
    digitalWrite(a,LOW);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,LOW);
    digitalWrite(e,LOW);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,HIGH);
}
void digital_5(void) //显示数字5
{
    digitalWrite(a,HIGH);
    digitalWrite(b,LOW);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,LOW);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,HIGH);
}
void digital_6(void) //显示数字6
{
    digitalWrite(a,HIGH);
    digitalWrite(b,LOW);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,HIGH);
}
void digital_7(void) //显示数字7
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,LOW);
    digitalWrite(e,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
    digitalWrite(dp,HIGH);
}
void digital_8(void) //显示数字8
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,HIGH);
}
void digital_9(void) //显示数字9
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,LOW);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,HIGH);
}
void setup()
{
    int i;//定义变量
    for(i=2;i<=9;i++)
    pinMode(i,OUTPUT);//设置2~9 引脚为输出模式
}
void loop()
{
    digital_0();//显示数字0
    delay(1000);//延时1s
    digital_1();//显示数字1
    delay(1000);//延时1s
    digital_2();//显示数字2
    delay(1000); //延时1s
    digital_3();//显示数字3
    delay(1000); //延时1s
    digital_4();//显示数字4
    delay(1000); //延时1s
    digital_5();//显示数字5
    delay(1000); //延时1s
    digital_6();//显示数字6
    delay(1000); //延时1s
    digital_7();//显示数字7
    delay(1000); //延时1s
    digital_8();//显示数字8
    delay(1000); //延时1s
    digital_9();//显示数字9
    delay(1000); //延时1s
}

2.电路图24ae555041204d4c77041bb666d92172.jpg

3.数码管八段表示

数码管八段表示法是指使用八个独立的LED(发光二极管)来显示数字、字母和符号等字符。这些LED被编号为a、b、c、d、e、f、g和dp,其中dp表示小数点。


每个数字或字符都可以通过在对应LED上提供电源信号来表示。下面是每个LED代表的数字及其对应的八段表示法:

0ecc8a0e48156fd38cb1fa583a90e417.jpg

我们知道通过数字8可以表示0到9的任意数字,因此把8分解成8个部分(包括小数点),这样我们可以通过控制每一个部分的亮度来显示任意数字。

4.数码管结构

数码管的GF公共端和ED公共端通常被用于七段数码管的显示。其中,GF代表着左侧的两个数字段(也称为"组F"),这些数字段包括了LED数码管中的a、b、c和d四个段;而ED则代表右侧的三个数字段(也称为"组E"和"组D"),这些数字段包括了LED数码管中的e、f、g三个段。


在使用数码管进行显示时,GF和ED都需要与对应数字段的阳极或阴极连接,以便通过控制它们的电压或电流来控制对应数字段是否亮起。同时,由于这些数字段都是共阳极或共阴极的,因此要控制哪一组数字段亮起,需要将对应组的公共端(GF或ED)连接到对应的电源上。


两端每端四个引脚,分别表示四部分,把这八个引脚接入Arduino开发板的数字引脚即可听过数字电路显示任意数字。

五.四位数码管显示

1.源代码

//共阴极数码管
int a=2;//定义数字接口2 连接a 段数码管
int b=3;// 定义数字接口3 连接b 段数码管
int c=4;// 定义数字接口4 连接c 段数码管
int d=5;// 定义数字接口5 连接d 段数码管
int e=6;// 定义数字接口6 连接e 段数码管
int f=7;// 定义数字接口7 连接f 段数码管
int g=8;// 定义数字接口8 连接g 段数码管
int dp=9;// 定义数字接口9 连接dp 段数码管
int num1=10;//定义数字接口10 选中第一个数码管
int num2=11;//定义数字接口11 选中第二个数码管
int num3=12;//定义数字接口12 选中第三个数码管
int num4=13;//定义数字接口13 选中第四个数码管
int num=0;//切换数码管的变量
void digital_0(void) //显示数字0
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,LOW);
    digitalWrite(dp,LOW);
}
void digital_1(void) //显示数字1
{
    digitalWrite(a,LOW);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,LOW);
    digitalWrite(e,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
    digitalWrite(dp,LOW);
}
void digital_2(void) //显示数字2
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,LOW);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,LOW);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
}
void digital_3(void) //显示数字3
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
}
void digital_4(void) //显示数字4
{
    digitalWrite(a,LOW);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,LOW);
    digitalWrite(e,LOW);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
}
void digital_5(void) //显示数字5
{
    digitalWrite(a,HIGH);
    digitalWrite(b,LOW);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,LOW);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
}
void digital_6(void) //显示数字6
{
    digitalWrite(a,HIGH);
    digitalWrite(b,LOW);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
}
void digital_7(void) //显示数字7
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,LOW);
    digitalWrite(e,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
    digitalWrite(dp,LOW);
}
void digital_8(void) //显示数字8
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,HIGH);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
}
void digital_9(void) //显示数字9
{
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(c,HIGH);
    digitalWrite(d,HIGH);
    digitalWrite(e,LOW);
    digitalWrite(f,HIGH);
    digitalWrite(g,HIGH);
    digitalWrite(dp,LOW);
}
void setup()
{
    int i;//定义变量
    for(i=2;i<=13;i++)
    pinMode(i,OUTPUT);//设置2~13 引脚为输出模式
}
void loop()
{
    num++;//切换数码管的变量,四个数码管循环显示
    if(num>4){
      num=1;  
    }
    if(num==1){//选中第一个数码管
      digitalWrite(num1,LOW);
      digitalWrite(num2,HIGH);
      digitalWrite(num3,HIGH);
      digitalWrite(num4,HIGH);
    }else if(num==2){//选中第二个数码管
      digitalWrite(num1,HIGH);
      digitalWrite(num2,LOW);
      digitalWrite(num3,HIGH);
      digitalWrite(num4,HIGH);
    }else if(num==3){//选中第三个数码管
      digitalWrite(num1,HIGH);
      digitalWrite(num2,HIGH);
      digitalWrite(num3,LOW);
      digitalWrite(num4,HIGH);
    }else if(num==4){//选中第四个数码管
      digitalWrite(num1,HIGH);
      digitalWrite(num2,HIGH);
      digitalWrite(num3,HIGH);
      digitalWrite(num4,LOW);
    }
    digital_0();//显示数字0
    delay(1000);//延时1s
    digital_1();//显示数字1
    delay(1000);//延时1s
    digital_2();//显示数字2
    delay(1000); //延时1s
    digital_3();//显示数字3
    delay(1000); //延时1s
    digital_4();//显示数字4
    delay(1000); //延时1s
    digital_5();//显示数字5
    delay(1000); //延时1s
    digital_6();//显示数字6
    delay(1000); //延时1s
    digital_7();//显示数字7
    delay(1000); //延时1s
    digital_8();//显示数字8
    delay(1000); //延时1s
    digital_9();//显示数字9
    delay(1000); //延时1s
}

2.电路图01b1befef3f4b80ffe7605c6b0da171a.jpg

这幅图详细给出了四段数码管引脚的意义和连接情况,大家参考。

3.代码理解

这段代码是用来控制共阴极数码管显示数字的程序。首先定义了每个数字接口连接到数码管的哪一段,以及选择数码管的变量和四个数码管的引脚设置为输出模式。然后在loop()函数中循环切换四个数码管,并调用digital_0()到digital_9()函数分别显示数字0到9,每次显示后延时1秒。其中,数字的显示通过控制不同段的电平状态实现,比如digital_0()函数中通过将a-g段设为HIGH或LOW来显示数字0。


运行这段代码后,会发现四个数码管会循环显示数字0到9。每次只有一个数码管被选中,并且会闪烁一下,表示它正在显示数字。在数码管上显示的数字是通过控制不同段的电平状态实现的,当一个段处于HIGH状态时,则此段不亮;当一个段处于LOW状态时,则此段亮起来。延时1秒是为了让每个数字能够停留一段时间后再切换到下一个数字。整个程序运行起来比较简单,也很容易理解。


六.说明

接上一篇博客,Arduino学习笔记3!


相关文章
|
传感器 IDE 物联网
arduino
Arduino是一款开源的硬件和软件平台,提供了简单易用的开发工具、开发板和标准接口等,可以用于构建各种互动式的物联网设备和项目。Arduino的主要特点是易用性、开放性、可扩展性和低成本,广泛应用于创客、教育、艺术和工程等领域。
678 5
|
传感器 存储 C语言
Arduino学习笔记1
Arduino学习笔记1
188 0
|
传感器 存储 运维
Arduino学习笔记2
Arduino学习笔记2
141 0
|
传感器 计算机视觉
Arduino学习笔记3
Arduino学习笔记3
147 0
|
传感器 安全 机器人
Arduino学习笔记5
Arduino学习笔记5
198 0
|
IDE 物联网 开发工具
1.2为什么选择Arduino
1.2为什么选择Arduino
106 0
|
存储 传感器 芯片
1.3 选择适合的Arduino
1.3 选择适合的Arduino
303 0