codecamp

Arduino I/O函数

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

引脚配置为INPUT

Arduino引脚默认配置为输入,因此在使用它们作为输入时,不需要使用 pinMode()显式声明为输入。以这种方式配置的引脚被称为处于高阻抗状态。输入引脚对采样电路的要求非常小,相当于引脚前面的100兆欧的串联电阻。

这意味着将输入引脚从一个状态切换到另一个状态所需的电流非常小。这使得引脚可用于诸如实现电容式触摸传感器或读取LED作为光电二极管的任务。

被配置为pinMode(pin,INPUT)的引脚(没有任何东西连接到它们,或者有连接到它们而未连接到其他电路的导线),报告引脚状态看似随机的变化,从环境中拾取电子噪音或电容耦合附近引脚的状态。

上拉电阻

如果没有输入,上拉电阻通常用于将输入引脚引导到已知状态。这可以通过在输入端添加上拉电阻(到5V)或下拉电阻(接地电阻)来实现。10K电阻对于上拉或下拉电阻来说是一个很好的值。

使用内置上拉电阻,引脚配置为输入

Atmega芯片内置了2万个上拉电阻,可通过软件访问。通过将pinMode()设置为INPUT_PULLUP可访问这些内置上拉电阻。这有效地反转了INPUT模式的行为,其中HIGH表示传感器关闭,LOW表示传感器开启。此上拉的值取决于所使用的微控制器。在大多数基于AVR的板上,该值保证在20kΩ和50kΩ之间。在Arduino Due上,它介于50kΩ和150kΩ之间。有关确切的值,请参考板上微控制器的数据表。

当将传感器连接到配置为INPUT_PULLUP的引脚时,另一端应接地。在简单开关的情况下,这会导致当开关打开时引脚变为高电平,当按下开关时引脚为低电平。上拉电阻提供足够的电流来点亮连接到被配置为输入的引脚的LED。如果项目中的LED似乎在工作,但很昏暗,这可能是发生了什么。

控制引脚是高电平还是低电平的相同寄存器(内部芯片存储器单元)控制上拉电阻。因此,当引脚处于INPUT模式时,配置为有上拉电阻导通的引脚将被开启;如果引脚通过pinMode()切换到OUTPUT模式,引脚将配置为高电平。这也适用于另一个方向,如果通过pinMode()切换到输入,则处于高电平状态的输出引脚将设置上拉电阻。

示例

pinMode(3,INPUT) ; // set pin to input without using built in pull up resistor
pinMode(5,INPUT_PULLUP) ; // set pin to input using built in pull up resistor

引脚配置为OUTPUT

通过pinMode()配置为OUTPUT的引脚被认为处于低阻抗状态。这意味着它们可以向其他电路提供大量的电流。Atmega引脚可以向其他器件/电路提供(提供正电流)或吸收(提供负电流)高达40mA(毫安)的电流。这是足以点亮LED或者运行许多传感器的电流(不要忘记串联电阻),但不足以运行继电器,螺线管或电机。

试图从输出引脚运行高电流器件,可能损坏或破坏引脚中的输出晶体管,或损坏整个Atmega芯片。通常,这会导致微控制器中出现“死”引脚,但是剩余的芯片仍然可以正常工作。因此,最好通过470Ω或1k电阻将OUTPUT引脚连接到其他器件,除非特定应用需要从引脚吸取最大电流。

pinMode()函数

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

pinMode()函数语法

Void setup () {
   pinMode (pin , mode);
}
  • pin - 你希望设置模式的引脚的编号

  • mode - INPUT,OUTPUT或INPUT_PULLUP。

示例

int button = 5 ; // button connected to pin 5
int 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
}

analogRead()函数

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

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

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

analogRead()函数语法

analogRead(pin);
  • pin - 要读取的模拟输入引脚的编号(大多数电路板上为0至5,Mini和Nano上为0至7,Mega上为0至15)

示例

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
}


Arduino 数组
Arduino 高级I/O函数
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }