Arduino DigitalRead阅读错误


10

我已经用4条输入线设置了Arduino UNO,它们连接到端口10、11、12、13,它们连接到我的面包板上,但只有电线。

我的代码就是:

Serial.println(digitalRead(13));
Serial.println(digitalRead(12));
Serial.println(digitalRead(11));
Serial.println(digitalRead(10));

问题是,在我将引脚短暂连接到5V或3V3之后,读数将开始变得像下面这样:1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 在没有任何导线直接连接到我的VCC(5V或3V3)的情况下,读数会不断变化,此时应为零!

我的Arduino死了吗?我怎样才能解决这个问题?


仅在未触发时将触发引脚接地!

Answers:


18

您拥有的被称为Floating图钉。数字输入引脚对变化非常敏感,除非将其积极地驱动到一种状态或另一种状态(高电平或低电平),否则它们会从附近的源(例如面包板,人的手指甚至是空气)吸收杂散电容。连接到它的任何电线都将像一个小天线,并导致输入状态发生变化。我的意思是任何电线,板上的走线,面包板的电线,面包板的引脚,甚至是IC本身的金属引脚。

在Arduino参考页面中进行了引用:

如果该引脚未连接任何东西,digitalRead()可以返回HIGH或LOW(并且可以随机更改)。

如果您查看Arduino Digital Pin Tutorial

但是,这也意味着,未连接任何输入引脚或未连接任何导线的未连接其他电路的输入引脚将报告看似随机的引脚状态变化,从环境中吸收电噪声或电容耦合状态附近的图钉。

如果不存在输入,通常将输入引脚转向已知状态很有用。这可以通过在输入上添加一个上拉电阻(至+ 5V)或一个下拉电阻(接地电阻)来实现,其中10K是一个公共值。Atmega芯片中还内置了方便的20K上拉电阻,可通过软件对其进行访问。这些内置上拉电阻的访问方法如下。

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

这些弱上拉电阻将输入引脚状态强制为已知状态,并且很容易被较强的输入电压覆盖,例如直接接地或+ 5v。


2
怎么样pinMode(pin, INPUT_PULLUP)?这很容易记住,而且很难搞砸。
piojo '18

6

这个是正常的。除非输入连接到某物,否则它将显示HIGH或LOW或不断变化。Arduino网站上的digitalRead参考页对此进行了描述。

输入引脚的电容很小,因此短暂连接到3V3或5V将为电容充电。用裸露的手指可能会发现类似的效果。

您可以通过在引脚和GND之间添加一个大阻值电阻来避免此问题。

问问自己为什么期望零?


1
pinMode(pin,INPUT_PULLUP);
jippie 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.