新闻  |   论坛  |   博客  |   在线研讨会
Arduino程序结构及IO操作函数
Linux嵌入式 | 2023-01-03 13:18:49    阅读:2656   发布文章

结构

Arduino程序可以分为三个主要部分:结构,值(变量和常量)和函数。在本教程中,我们将逐步了解Arduino软件程序,以及如何编写程序而不会出现任何语法或编译错误。

软件结构包括两个主要函数:

· Setup()函数

· Loop()函数


Void setup ( ) {

}
程序启动时会调用 setup()函数。使用它来初始化变量,引脚模式,启用库等。setup函数只能在Arduino板的每次上电或复位后运行一次。Void Loop ( ) {

}
在创建了用于初始化并设置初始值的setup()函数后,loop() 函数,正如它的名称所指,允许你的程序连续循环的更改和响应。可以使用它来主动控制Arduino板。
延时函数
Delay(ms)void delay (unsigned long ms)  
延时(毫秒)
延时, 单位毫秒(1秒有1000毫秒).
注意:
参数为unsigned long, 因此在延时参数超过32767(int型最大值)时, 需要用"UL"后缀表示为无符号 长整型, 例如: delay(60000UL);. 同样在参数表达式, 切表达式中有int类型时, 需要强制转换为 unsigned long类型, 例如: delay((unsigned long)tdelay * 100UL);.
一下例子设置13引脚对应的LED等以1秒频率闪烁:int ledPin = 13;                 // LED connected to digital pin 13void setup(){
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output}void loop(){
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second}

DelayMicroseconds(us)void delayMicroseconds (unsigned int us)
延时(微秒)
延时, 单位为微妙(1毫秒有1000微妙). 如果延时的时间有几千微妙, 那么建议使用 delay 函数. 目前参数最大支持16383微妙(不过以后的版本中可能会变化).
以下代码向第8号引脚发送脉冲, 每次脉冲持续50微妙的时间.int outPin = 8;                 // digital pin 8void setup(){
  pinMode(outPin, OUTPUT);      // sets the digital pin as output}void loop(){
  digitalWrite(outPin, HIGH);   // sets the pin on
  delayMicroseconds(50);        // pauses for 50 microseconds      
  digitalWrite(outPin, LOW);    // sets the pin offIO操作函数
pinMode()函数
pinMode()函数用于将特定引脚配置为输入或输出。可以使用INPUT_PULLUP模式启用内部上拉电阻。
pinMode()函数语法Void setup () {
   pinMode (pin , mode);
}
•	pin - 你希望设置模式的引脚的编号
•	mode - INPUT,OUTPUT或INPUT_PULLUP。
•	示例int button = 5 ; // button connected to pin 5int LED = 6; // LED connected to pin 6void setup () {
   pinMode(button , INPUT_PULLUP); 
   // set the digital pin as input with pull-up resistor
   pinMode(button , OUTPUT); // set the digital pin as output}void setup () {
   If (digitalRead(button ) == LOW) // if button pressed {
      digitalWrite(LED,HIGH); // turn on led
      delay(500); // delay for 500 ms
      digitalWrite(LED,LOW); // turn off led
      delay(500); // delay for 500 ms
   }
}
•	
digitalWrite()函数
digitalWrite()函数用于向数字引脚写入HIGH或LOW值。如果该引脚已通过pinMode()配置为OUTPUT,则其电压将被设置为相应的值:HIGH为5V(或3.3V在3.3V板上),LOW为0V(接地)。如果引脚配置为INPUT,则digitalWrite()将启用(HIGH)或禁止(LOW)输入引脚的内部上拉。建议将pinMode()设置为INPUT_PULLUP,以启用 内部上拉电阻。
如果不将pinMode()设置为OUTPUT,而将LED连接到引脚,则在调用digitalWrite(HIGH)时,LED可能会变暗。在没有明确设置pinMode()时,digitalWrite()将启用内部上拉电阻,这就像一个大的限流电阻。
digitalWrite()函数语法Void loop() {
   digitalWrite (pin ,value);
}
•	pin - 你希望设置模式的引脚的编号
•	value - HIGH或LOW。
•	示例int LED = 6; // LED connected to pin 6void 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}

digitalRead()
说明
读取数字引脚的 HIGH(高电平)或 LOW(低电平)。
语法
digitalRead(pin)
参数
pin:被读取的引脚号码
返回值
HIGH 或 LOWconst int ledPin = 13; 
const int inputPin = 2; 
// 当Arduino控制器通电或复位后,setup函数会运行一次void setup() 
  { 
    //将引脚13设置为输出模式
    pinMode(ledPin, OUTPUT); 
    
    //将引脚2设置为输入上拉模式
    //引脚2与外部按钮连接
    pinMode(inputPin, INPUT_PULLUP);
  } 
// 当Arduino控制器通电或复位后,loop函数会反复运行void loop(){  // 读取引脚2的输入情况
  // 开关闭合后,引脚2将获得低电平信号
  int val = digitalRead(inputPin); 
  
  // 检查引脚2是否为低电平
  // 当按钮按下时,引脚2为低电平,点亮引脚13 LED
  // 当按钮未按下,引脚2为高电平,熄灭引脚13 LED
  if (val == LOW)
  {
    digitalWrite(ledPin, HIGH);  
  } else 
  {
    digitalWrite(ledPin, LOW);
  }
}

analogRead()函数
Arduino能够检测是否有一个电压施加到其引脚,并通过digitalRead()函数报告。开/关传感器(检测物体的存在)和模拟传感器之间存在一个差异,模拟传感器的值连续变化。为了读取这种类型的传感器,我们需要一个不同类型的引脚。
在Arduino板的右下角,你会看到6个标记为“Analog In”的引脚。这些特殊引脚不仅可以告知是否有电压施加给它们,还可以告知它们的值。通过使用analogRead()函数,我们可以读取施加到其中一个引脚的电压。
此函数返回0到1023之间的数字,表示0到5伏特之间的电压。例如,如果施加到编号0的引脚的电压为2.5V,则analogRead(0)返回512。
analogRead()函数语法
analogRead(pin);
•	pin - 要读取的模拟输入引脚的编号
•	示例int analogPin = 3;//potentiometer wiper (middle terminal) 
   // connected to analog pin 3 int val = 0; // variable to store the value readvoid setup() {
   Serial.begin(9600); // setup serial} 

void loop() {
   val = analogRead(analogPin); // read the input pin
   Serial.println(val); // debug value}

IO引脚说明
数字I/O口 Digital IO
Arduino 引脚号直接对应ESP8266 GPIO 引脚。pinMode,digitalRead,和 digitalWrite 函数照常使用,所以读取GPIO2引脚,这样写:digitalRead(2) 。
数字引脚 0~15可以设置为 INPUT,OUTPUT 或者 INPUT_PULLUP 模式。引脚 16可以设置为INPUT,OUTPUT 或者 INPUT_PULLDOWN_16 模式。在启动时,引脚被配置为INPUT。引脚同样可以提供其他功能,像串行,I2C,SPI。这些函数通常需要使用相应的库。下图为ESP-12模块的引脚图:

Void setup ( ) {


}

程序启动时会调用 setup()函数。使用它来初始化变量,引脚模式,启用库等。setup函数只能在Arduino板的每次上电或复位后运行一次。

Void Loop ( ) {


}

在创建了用于初始化并设置初始值的setup()函数后,loop() 函数,正如它的名称所指,允许你的程序连续循环的更改和响应。可以使用它来主动控制Arduino板。

延时函数Delay(ms)void delay (unsigned long ms)

延时(毫秒)

延时, 单位毫秒(1秒有1000毫秒).

注意:

参数为unsigned long, 因此在延时参数超过32767(int型最大值)时, 需要用"UL"后缀表示为无符号 长整型, 例如: delay(60000UL);. 同样在参数表达式, 切表达式中有int类型时, 需要强制转换为 unsigned long类型, 例如: delay((unsigned long)tdelay * 100UL);.
一下例子设置13引脚对应的LED等以1秒频率闪烁:

int ledPin = 13;                 // LED connected to digital pin 13 void setup(){
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output}
 void loop(){
  digitalWrite(ledPin, HIGH);   // sets the LED on  delay(1000);                  // waits for a second  digitalWrite(ledPin, LOW);    // sets the LED off  delay(1000);                  // waits for a second}


DelayMicroseconds(us)void delayMicroseconds (unsigned int us)

延时(微秒)

延时, 单位为微妙(1毫秒有1000微妙). 如果延时的时间有几千微妙, 那么建议使用 delay 函数. 目前参数最大支持16383微妙(不过以后的版本中可能会变化).

以下代码向第8号引脚发送脉冲, 每次脉冲持续50微妙的时间.

 int outPin = 8;                 // digital pin 8 void setup(){
  pinMode(outPin, OUTPUT);      // sets the digital pin as output}
 void loop(){
  digitalWrite(outPin, HIGH);   // sets the pin on  delayMicroseconds(50);        // pauses for 50 microseconds        digitalWrite(outPin, LOW);    // sets the pin off
IO操作函数pinMode()函数

pinMode()函数用于将特定引脚配置为输入或输出。可以使用INPUT_PULLUP模式启用内部上拉电阻。

pinMode()函数语法
Void setup () {
   pinMode (pin , mode);
}

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

· mode - INPUT,OUTPUT或INPUT_PULLUP。

· 示例

int button = 5 ; // button connected to pin 5int LED = 6; // LED connected to pin 6 void setup () {
   pinMode(button , INPUT_PULLUP); 
   // set the digital pin as input with pull-up resistor   pinMode(button , OUTPUT); // set the digital pin as output}
 void setup () {
   If (digitalRead(button ) == LOW) // if button pressed {      digitalWrite(LED,HIGH); // turn on led      delay(500); // delay for 500 ms      digitalWrite(LED,LOW); // turn off led      delay(500); // delay for 500 ms   }
}

·

digitalWrite()函数

digitalWrite()函数用于向数字引脚写入HIGH或LOW值。如果该引脚已通过pinMode()配置为OUTPUT,则其电压将被设置为相应的值:HIGH为5V(或3.3V在3.3V板上),LOW为0V(接地)。如果引脚配置为INPUT,则digitalWrite()将启用(HIGH)或禁止(LOW)输入引脚的内部上拉。建议将pinMode()设置为INPUT_PULLUP,以启用 内部上拉电阻。

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

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}


digitalRead()说明

读取数字引脚的 HIGH(高电平)或 LOW(低电平)。

语法

digitalRead(pin)

参数

pin:被读取的引脚号码

返回值

HIGH 或 LOW

const int ledPin = 13; 
const int inputPin = 2; 
// 当Arduino控制器通电或复位后,setup函数会运行一次void setup()   { 
    //将引脚13设置为输出模式    pinMode(ledPin, OUTPUT); 
    
    //将引脚2设置为输入上拉模式    //引脚2与外部按钮连接    pinMode(inputPin, INPUT_PULLUP);
  } 
// 当Arduino控制器通电或复位后,loop函数会反复运行void loop(){
  // 读取引脚2的输入情况  // 开关闭合后,引脚2将获得低电平信号  int val = digitalRead(inputPin); 
  
  // 检查引脚2是否为低电平  // 当按钮按下时,引脚2为低电平,点亮引脚13 LED  // 当按钮未按下,引脚2为高电平,熄灭引脚13 LED  if (val == LOW)
  {
    digitalWrite(ledPin, HIGH);  
  } else   {
    digitalWrite(ledPin, LOW);
  }
}


analogRead()函数

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

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

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

analogRead()函数语法
analogRead(pin);

· pin - 要读取的模拟输入引脚的编号

· 示例

int analogPin = 3;//potentiometer wiper (middle terminal)

// connected to analog pin 3

int val = 0; // variable to store the value read


void setup() {

Serial.begin(9600); // setup serial

}


void loop() {

val = analogRead(analogPin); // read the input pin

Serial.println(val); // debug value

}


IO引脚说明

数字I/O口 Digital IO


Arduino 引脚号直接对应ESP8266 GPIO 引脚。pinMode,digitalRead,和 digitalWrite 函数照常使用,所以读取GPIO2引脚,这样写:digitalRead(2) 。

数字引脚 0~15可以设置为 INPUT,OUTPUT 或者 INPUT_PULLUP 模式。引脚 16可以设置为INPUT,OUTPUT 或者 INPUT_PULLDOWN_16 模式。在启动时,引脚被配置为INPUT。引脚同样可以提供其他功能,像串行,I2C,SPI。这些函数通常需要使用相应的库。下图为ESP-12模块的引脚图:


可见图中没有数字引脚6~11,因为大部分模块使用这几个引脚连接了flash存储芯片了。这些引脚不可使用,否则可能导致程序崩溃。

注意:ADC输入电压范围 0~1V,取值范围:0~1024,有些电路板和模块(ESP-12ED NodeMCU 1.0)也释放了引脚9和11,如果Flash芯片工作在DIO模式下(默认QIO模式),它们可以被当做IO口使用。引脚中断可以使用attachInterrupt,detachInterrupt函数。除了GPIO16引脚,其他引脚都可以使用中断功能。



*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
工科男,多年嵌入式工作者,每日分享工作中常遇到的一些“坑”
推荐文章
最近访客