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)等