analogRead (0) ou analogRead (A0)

14

A referência do arduino afirma que você usaria o seguinte código para ler o valor do pino analógico # 5:

int val1 = analogRead(5);

No entanto, para ler o pino digital nº 5, você passaria o mesmo número de pino para digitalRead:

int val2 = digitalRead(5);

Você não deveria usar em analogRead(A5)vez de analogRead(5)?

Caso contrário, o que o código a seguir faz:

int val3 = analogRead(A5);
Tyilo
fonte

Respostas:

28

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 5ou A5o segundo lerá o pino 5, que passa a ser um pino digital. Então, sim, se você quiser ler um pino analógico, digitalReaddeve estar usando A5.

Por quê?

analogReadrequer 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 analogReado primeiro pino analógico, A0pode 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, analogReadconverteria o número do pino A0em seu número de canal apropriado 0.

Se você quiser usar digitalWriteo primeiro pino analógico, A0poderá fazê- lo apenasdigitalWrite(A0, x) . digitalWritenã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 digitalReade 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.cVocê 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?

Kevin Mark
fonte
1
Embora fosse exatamente como você explicou, fiquei confuso com a referência do Arduino, que contém informações falsas.
Tyilo
1
Além disso, você pode fazer analogReadem pinos analógicos! Por outro lado, analogWritepode ser usado nos pinos analógico e PWM.
Tyilo
1
@Tyilo Atualizei minha resposta com algumas informações mais precisas extraídas do código-fonte.
Kevin Mark
3
analogWrite () pode ser chamado em qualquer um dos pinos, mas apenas faz algo nos pinos do PWM. Nos pinos ditiais não PWM e em todos os pinos analógicos, ele simplesmente chama digitalWrite ().
precisa saber é o seguinte
3
@powtac - Geralmente é aceito que a documentação do arduino é bastante abominável, pelo menos por aqui. Não sinta que está faltando alguma coisa, não é você, é o pessoal do arduino.
Connor Wolf
3

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 😣):

val = analogRead(0); //connect sensor to Analog 0

Corrigir:

val = analogRead(A0); //connect sensor to Analog 0

Atualização : analogRead()aceita números de pinos GPIO. A0etc. são #defines para números de pinos do Arduino, onde A0 == 36.

Cuidado: por exemplo, no FireBeetle ESP32, o pino identificado como "IO36 / A0" (GPIO36) é igual ao Arduino A0, mas "IO39 / A1" (GPIO39) é igual ao Arduino A3(não A1), "IO34 / A2" (GPIO34) é igual ao Arduino A6(não A2) etc.

jrc
fonte