Para responder às perguntas específicas de Tyilo:
analogRead(5)
e digitalRead(5)
vai ler de dois lugares diferentes. O primeiro lerá do canal analógico 5
ou A5
o segundo lerá o pino 5, que passa a ser um pino digital. Então, sim, se você quiser ler um pino analógico, digitalRead
deve estar usando A5
.
Por quê?
analogRead
requer um número de canal internamente, mas também lhe permitirá atribuir um número de PIN. Se você der um número PIN, ele será convertido no número do canal correspondente. Até onde eu sei, analogRead
é a única função que usa um número de canal internamente, é a única que permite um número de canal e é a única função com essa conversão pino a canal não documentada. Para entender isso, vamos começar com alguns exemplos.
Se você deseja usar analogRead
o primeiro pino analógico, A0
pode fazer o analogRead(0)
que usa o número do canal ou analogRead(A0)
o número do pino. Se você usasse a variante do número do pino, analogRead
converteria o número do pino A0
em seu número de canal apropriado 0
.
Se você quiser usar digitalWrite
o primeiro pino analógico, A0
poderá fazê- lo apenasdigitalWrite(A0, x)
. digitalWrite
não usa canais analógicos internamente e não permite que você transmita um número de canal. Bem, isso permitirá que você selecione o pino errado. O mesmo se aplica a digitalRead
e mesmo analogWrite
.
E as conversões de pinos para canais feitas por analogRead
? A fonte dessa função pode ser encontrada em hardware/arduino/avr/cores/arduino/wiring_analog.c
Você verá que ele faz uma subtração simples com base no tipo de quadro. O A0
/ A1
/ A2
/ etc. As constantes representam o número de pinos dos canais analógicos e podem ser usadas em todos os lugares em que você precisar consultar as entradas analógicas. Por esse motivo, eles são a melhor opção para usar no código do Arduino, porque é muito óbvio que você está usando a mesma porta física, mesmo quando usa funções diferentes. As definições dessas constantes dependem do seu quadro.
Por exemplo, aqui está o código de definição de pino analógico para o Arduino Uno em 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;
Para comparação, aqui está o código de definição de pino analógico para o 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;
Discussão adicional de EE sobre pinos analógicos: Posso usar os pinos analógicos no Arduino para o meu projeto como digital?
analogRead
em pinos analógicos! Por outro lado,analogWrite
pode ser usado nos pinos analógico e PWM.Passei horas nisso. Eu pensei que tinha um problema de hardware. Acontece que eu estava ligando
analogRead()
incorretamente.Incorreto (código de amostra incorreto do DFRobot 😣):
Corrigir:
Atualização :
analogRead()
aceita números de pinos GPIO.A0
etc. são #defines para números de pinos do Arduino, ondeA0 == 36
.Cuidado: por exemplo, no FireBeetle ESP32, o pino identificado como "IO36 / A0" (GPIO36) é igual ao Arduino
A0
, mas "IO39 / A1" (GPIO39) é igual ao ArduinoA3
(nãoA1
), "IO34 / A2" (GPIO34) é igual ao ArduinoA6
(nãoA2
) etc.fonte