arduino 参考声明您将使用以下代码从模拟引脚 #5 读取值:
int val1 = analogRead(5);
但是,要从数字引脚 #5 读取,您可以将相同的引脚号传递给digitalRead
:
int val2 = digitalRead(5);
你不应该使用analogRead(A5)
而不是analogRead(5)
吗?
如果不是,下面的代码是做什么的:
int val3 = analogRead(A5);
arduino 参考声明您将使用以下代码从模拟引脚 #5 读取值:
int val1 = analogRead(5);
但是,要从数字引脚 #5 读取,您可以将相同的引脚号传递给digitalRead
:
int val2 = digitalRead(5);
你不应该使用analogRead(A5)
而不是analogRead(5)
吗?
如果不是,下面的代码是做什么的:
int val3 = analogRead(A5);
要回答 Tyilo 的具体问题:
analogRead(5)
并将digitalRead(5)
从两个不同的地方读取。前者将从模拟通道读取5
,A5
后者将从恰好是数字引脚的引脚 5 读取。所以是的,如果你想读取模拟引脚,digitalRead
你应该使用A5
.
为什么?
analogRead
内部需要一个通道号,但它也允许您给它一个引脚号。如果你给它一个引脚号,它会将其转换为相应的通道号。据我所知analogRead
,这是唯一在内部使用通道号的函数,是唯一允许通道号的函数,也是唯一具有这种未记录的引脚到通道转换的函数。为了理解这一点,让我们从一些例子开始。
如果您想analogRead
在第一个模拟引脚上使用,A0
您可以analogRead(0)
使用通道号或analogRead(A0)
使用引脚号。如果您要使用 pin number 变体,analogRead
会将 pin number 转换A0
为其正确的 channel number 0
。
如果您想digitalWrite
在第一个模拟引脚上使用,A0
您只能这样做digitalWrite(A0, x)
。digitalWrite
内部不使用模拟通道,也不允许您传递通道号。好吧,它会让你,但你会选择错误的引脚。这同样适用于digitalRead
甚至analogWrite
。
由 完成的引脚到通道转换analogRead
呢?该函数的源代码可以在hardware/arduino/avr/cores/arduino/wiring_analog.c
您将看到它根据棋盘类型做了一些简单的减法。A0
///等A1
。_ A2
常量代表模拟通道的引脚号,可以在需要参考模拟输入的任何地方使用。出于这个原因,它们是在您的 Arduino 代码中使用的最佳选择,因为很明显,即使您使用不同的功能,您也使用相同的物理端口。这些常量的定义取决于您的电路板。
例如,这里是 Arduino Uno 的模拟引脚定义代码hardware/arduino/avr/variants/standard/pins_arduino.h
static const uint8_t A0 = 14;
static const uint8_t A1 = 15;
static const uint8_t A2 = 16;
static const uint8_t A3 = 17;
static const uint8_t A4 = 18;
static const uint8_t A5 = 19;
static const uint8_t A6 = 20;
static const uint8_t A7 = 21;
为了比较,这里是 Arduino Mega 的模拟引脚定义代码:
static const uint8_t A0 = 54;
static const uint8_t A1 = 55;
static const uint8_t A2 = 56;
[...]
static const uint8_t A13 = 67;
static const uint8_t A14 = 68;
static const uint8_t A15 = 69;
关于模拟引脚的进一步 EE 讨论:我可以将 Arduino 上的模拟引脚用作数字项目吗?
我花了几个小时在这上面。我以为我有硬件问题。原来我打错电话了analogRead()
。
不正确(来自DFRobot的错误示例代码😣):
val = analogRead(0); //connect sensor to Analog 0
正确的:
val = analogRead(A0); //connect sensor to Analog 0
更新:analogRead()
采用 GPIO 引脚号。A0
等是 Arduino 引脚编号的#defines,其中A0 == 36
.
注意:在 FireBeetle ESP32 上,标有“IO36/A0”(GPIO36)的引脚等于 Arduino A0
,但“IO39/A1”(GPIO39)等于 Arduino A3
(不是A1
),“IO34/A2”(GPIO34)等于 Arduino A6
(不是A2
) , 等等。