Answers:
要回答Tyilo的特定问题:
analogRead(5)
并将digitalRead(5)
从两个不同的地方读取。前者将从模拟信道读5
或A5
并后者将从销5,该读恰好是一个数字销。因此,是的,如果您想读取模拟引脚,digitalRead
则应使用A5
。
为什么?
analogRead
内部需要一个通道号,但也可以给它提供一个引脚号。如果确实给它提供了一个PIN号,它将把它转换成其相应的通道号。据我所知,这analogRead
是唯一在内部使用通道号的功能,是唯一允许使用通道号的功能,并且是此未记录的引脚到通道转换的唯一功能。为了理解这一点,让我们从一些示例开始。
如果要analogRead
在第一个模拟引脚上使用,A0
可以执行analogRead(0)
使用通道号或analogRead(A0)
使用引脚号的操作。如果要使用引脚号变体,analogRead
请将引脚号转换为A0
正确的通道号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
模拟引脚!另一方面,analogWrite
可以在模拟和PWM引脚上使用。
我花了几个小时。我以为我遇到了硬件问题。原来我打错了电话analogRead()
。
不正确的(错误的从样本代码DFRobot 😣):
val = analogRead(0); //connect sensor to Analog 0
正确:
val = analogRead(A0); //connect sensor to Analog 0
更新:analogRead()
获取GPIO引脚号。A0
等是#define用于Arduino引脚编号,其中A0 == 36
。
注意:在FireBeetle ESP32上,引脚标记为“ IO36 / A0”(GPIO36)等于Arduino A0
,但“ IO39 / A1”(GPIO39)等于Arduino A3
(not A1
),“ IO34 / A2”(GPIO34)等于Arduino A6
(notA2
)等