Arduino 开发 — Arduino 函数库

Arduino 函数库

Arduino I/O函数

Arduino板上的引脚可以配置为输入或输出。我们将在这些模式下解释引脚的功能。重要的是要注意,大多数Arduino模拟引脚可以按照与数字引脚完全相同的方式进行配置和使用。

引脚配置为INPUT

引脚默认配置为输入,因此在使用它作为输入时,不用显式的pinMode() 输入引脚对电路要求小,可用于电容式触摸传感器或者LED作为光电二极管。

使用方法

pinMode(pin, INPUT)

pin - 设置模式的引脚编号

mode - INPUT、OUTPUT或者INPUT_PULLUP

引脚配置为OUTPUT

通过pinMode()配置引脚为底阻抗状态时,意味着他可以向其他电路提供大量电流。Atmega 引脚可以提供正向电流,高达40mA。这足以点亮LED或者运行许多传感器。但是不足以运行继电器 、电机。

pinMode()函数

pin - 设置模式的引脚编号

mode - INPUT、OUTPUT或者INPUT_PULLUP

digitalWrite() 函数

digitalWrite()函数向 数字引脚写入HIGH或者LOW值:

1、如果引脚通过pinMode()设置为OUTPUT,这电压被设置为响应的值:HIGH为5V(3.3V),LOW为0V(接地)。

2、如果引脚配置为INPUT。则digitalWrite()将启用HIGH或者禁用LOW输入引脚的内部上拉,建议设置为 INPUT_PULLUP 以启用内部上拉电阻。

3、如果不将pinMode()设置为OUTPUT,而将LED连接到引脚,则在调用digitalWrite(HIGH)时,LED可能会变暗。在没有明确设置pinMode()时,digitalWrite()将启用内部上拉电阻,这就像一个大的限流电阻。

Void loop() {
   digitalWrite (pin ,value);
}

pin - 你希望设置模式的引脚编号

value - HIGH 或者 LOW

int LED = 6; // LED connected to pin 6

void setup () {
   pinMode(LED, OUTPUT); // set the digital pin as output
}

void setup() { 
   digitalWrite(LED,HIGH); // turn on led
   delay(500); // delay for 500 ms
   digitalWrite(LED,LOW); // turn off led
   delay(500); // delay for 500 ms
}

analogRead() 函数

Arduino能够检测是否有一个电压施加到其引脚,并通过digitalRead()函数报告。开/关传感器(检测物体的存在)和模拟传感器之间存在一个差异,模拟传感器的值连续变化。为了读取这种类型的传感器,我们需要一个不同类型的引脚。

在Arduino板的右下角,你会看到6个标记为“Analog In”的引脚。这些特殊引脚不仅可以告知是否有电压施加给它们,还可以告知它们的值。通过使用**analogRead()**函数,我们可以读取施加到其中一个引脚的电压。

此函数返回0到1023之间的数字,表示0到5伏特之间的电压。例如,如果施加到编号0的引脚的电压为2.5V,则analogRead(0)返回512。

analogRead(pin);
  • pin - 要读取的模拟输入引脚的编号(大多数电路板上为0至5,Mini和Nano上为0至7,Mega上为0至15)
int analogPin = 3;//使用analog in 引脚3 作为电压标记
int val = 0; // 读取到的电压值

void setup() {
   Serial.begin(9600); //串口传输波特率 1s传输的字节
} 

void loop() {
   val = analogRead(analogPin); // 读取输入的电压值
   Serial.println(val); // 串口输出返回值
}

analogReference() 函数

配置用于模拟输入的参考电压(即用作输入范围顶部的值)。选项是:

  • DEFAULT - 5伏(5V Arduino板)或3.3伏(3.3V Arduino板)的默认模拟参考值
  • INTERNAL - 内置参考,在ATmega168或ATmega328上等于1.1伏特,在ATmega8上等于2.56伏特(不适用于Arduino Mega)
  • INTERNAL1V1 - 内置1.1V参考(仅限Arduino Mega)
  • INTERNAL2V56 - 内置2.56V参考(仅限Arduino Mega)
  • EXTERNAL - 施加到AREF引脚的电压(仅限0到5V)用作参考
analogReference (type);

type - 可以使用以下任何类型(DEFAULT,INTERNAL,INTERNAL1V1,INTERNAL2V56,EXTERNAL)

对AREF引脚的外部参考电压,请勿使用小于0V或大于5V的任何值。如果在AREF引脚上使用外部参考,则必须在调用 **analogRead()**函数之前将模拟参考设置为EXTERNAL。否则,将短路有效参考电压(内部产生的)和AREF引脚,可能会损坏Arduino板上的微控制器。

在这里插入图片描述

attachInterrupt() 中断函数

中断在 Arduino 程序中非常有用,因为它有助于解决时序问题。中断的良好应用是读取旋转编码器或观察用户输入。一般情况下,ISR 应尽可能短且快。如果你的草图使用多个 ISR,则一次只能运行一个。其他中断将在当前完成之后执行,其顺序取决于它们的优先级。

通常,全局变量用于在 ISR 和主程序之间传递数据。为了确保在 ISR 和主程序之间共享的变量正确更新,请将它们声明为 volatile。

Arduino 中主要有时钟中断和外部中断,本文所说的中断指的是外部中断。Arduino 中的外部中断通常是由Pin 口(数字 Pin 口,不是模拟口)电平改变触发的。每种型号的 Arduino 版都有数个 Pin 口可以用来注册中断,具体如下:

开发板 可以用来注册中断的Pin口
Uno, Nano, Mini, other 328-based 2, 3
Uno WiFi Rev.2 所有数字口
Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21
Micro, Leonardo, other 32u4-based 0, 1, 2, 3, 7
Zero 除了4号口外的所有数字口
MKR Family boards 0, 1, 4, 5, 6, 7, 8, 9, A1, A2
Due 所有数字口
101 所有数字口 (只有 2, 5, 7, 8, 10, 11, 12, 13数字口可以使用 CHANGE 类型中断,中断类型在下文有介绍)

注册中断主要是通过attachInterrupt()函数实现的,其原型为:

void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode);

第一个参数为中断号,Arduino上每个可以注册中断的Pin口都会被分配一个中断号,这里需要传入的是中断号而不是Pin口号。但是不同的Arduino开发板上面的中断号分配并不完全一样。各个开发板的Pin口号和中断号对应关系如下:

开发板 中断号0 中断号1 中断号2 中断号3 中断号4 中断号5
Uno, Ethernet PIN 2 PIN 3
Mega2560 PIN 2 PIN 3 PIN 21 PIN 20 PIN 19 PIN 18
基于32u4的开发板 如 Leonardo, Micro PIN 3 PIN 2 PIN 0 PIN 1 PIN 7

从上表中可以看出同一个 Pin 口在不同的开发板上可能会有不同的中断号,这势必会影响程序的可移植性。幸运的是,Arduino 还提供了另一个函数 digitalPinToInterrupt(int)。从名字就能看出,这个函数能输入 Pin 口号并输出对应的中断号。需要注意的是,输入的 Pin 口号需要在上述的支持列表当中。所以,Arduino 官方推荐我们使用

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

  1. 第二个参数是中断服务例程(ISR)的函数指针,在 C/C++ 中直接写该函数的函数名即可。在触发时,该函数将会被调用。该函数必须没有任何的参数也没有任何的返回值。
  2. 第三个参数是中断触发条件,由几个可选的值:
    LOW 当中断所在 Pin 口处于低电平时触发
    CHANGE 当中断所在 Pin口电平改变时触发
    RISING 当中断所在Pin口从低电平变为高电平(上升沿)时触发
    FALLING 当中断所在Pin口从高电平变为低电平(下降沿)时触发
    对于 Due,Zero 和 MKR1000开发板,还有一个 HIGH 表示当中断所在 Pin 口处于高电平时触发
int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
   pinMode(13, OUTPUT); //set pin 13 as output
   attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
   //interrupt at pin 2 blink ISR when pin to change the value
} 
void loop() { 
   digitalWrite(13, state); //pin 13 equal the state value
} 

void blink() { 
   //ISR function
   state = !state; //toggle the state when the interrupt occurs
}

注意:

  1. 由于中断会打断正常代码的运行,因此 ISR 的应该尽可能快地执行完毕。
  2. 在 ISR 中修改的全局变量要用 volatile 修饰符修饰以防止编译器优化
  3. 在 ISR 中不能使用其他用中断实现的函数,如 millis() delay() 等。延时可以使用 delayMicroseconds(),它不是用中断实现的。

版权声明:本文为CSDN博主「HiroGuo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HeroGuo_JP/article/details/121233723

生成海报
点赞 0

HiroGuo

我还没有学会写个人说明!

暂无评论

相关推荐

【Arduino实验15 红外遥控电风扇】

目录 一、设计目的 二、设计要求 三、设计原理 1.舵机 2.直流电机 3.ULN2003驱动 四、硬件设计 1.舵机 2.直流电机 3.ULN2003驱动 4.红外遥控电风扇 五、软件设计 1.舵机控制程序 2.电