analogRead (0) o analogRead (A0)


14

Il riferimento arduino afferma che si utilizzerà il seguente codice per leggere il valore dal pin analogico n. 5:

int val1 = analogRead(5);

Tuttavia, per leggere dal pin digitale n. 5, passare lo stesso numero di pin a digitalRead:

int val2 = digitalRead(5);

Non dovresti usare al analogRead(A5)posto di analogRead(5)?

In caso contrario, cosa fa il seguente codice:

int val3 = analogRead(A5);

Risposte:


28

Per rispondere alle domande specifiche di Tyilo:

analogRead(5)e digitalRead(5)leggerà da due posti diversi. Il primo sarà letto dal canale analogico 5o A5e quest'ultimo leggere da perno 5 che succede ad essere un pin digitale. Quindi sì, se vuoi leggere un pin analogico con digitalReadte dovresti usare A5.

Perché?

analogReadrichiede un numero di canale internamente ma ti permetterà di assegnargli anche un numero di pin. Se gli dai un numero di pin, lo convertirà nel numero di canale corrispondente. Per quanto ne so analogReadè l'unica funzione che utilizza internamente un numero di canale, è l'unica a consentire un numero di canale ed è l'unica funzione con questa conversione da pin a canale non documentata. Per capirlo, iniziamo con alcuni esempi.

Se si desidera utilizzare analogReadil primo pin analogico, A0è possibile analogRead(0)utilizzare quale numero di canale o analogRead(A0)quale numero di pin. Se dovessi usare la variante del numero di pin, analogReadconvertiresti il ​​numero di pin A0nel suo numero di canale corretto 0.

Se vuoi usare digitalWriteil primo pin analogico A0puoi solo fare digitalWrite(A0, x). digitalWritenon utilizza i canali analogici internamente e non consente di passargli un numero di canale. Bene, ti permetterà ma selezionerai il pin sbagliato. Lo stesso vale per digitalReade persino analogWrite.

Che dire delle conversioni pin-to-channel fatte da analogRead? La fonte per quella funzione può essere trovata in hardware/arduino/avr/cores/arduino/wiring_analog.cVedrai che fa una semplice sottrazione in base al tipo di scheda. Il A0/ A1/ A2/ ecc. le costanti rappresentano il numero di pin dei canali analogici e possono essere utilizzate ovunque sia necessario fare riferimento agli ingressi analogici. Per questo motivo sono l'opzione migliore da usare nel tuo codice Arduino perché è ovvio che stai usando la stessa porta fisica anche quando stai usando funzioni diverse. Le definizioni di tali costanti dipendono dalla tua scheda.

Ad esempio, ecco il codice di definizione pin analogico per Arduino Uno in 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;

Per comparaison ecco il codice di definizione pin analogico per 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;

Ulteriore discussione EE sui pin analogici: posso usare i pin analogici su Arduino per il mio progetto come digitale?


1
Pensavo fosse esattamente come mi hai spiegato, mi sono appena confuso con il riferimento di Arduino, che contiene informazioni false.
Tyilo,

1
Inoltre è possibile solo fare analogReadsui pin analogici! D'altra parte, analogWritepuò essere utilizzato su entrambi i pin analogico e PWM.
Tyilo,

1
@Tyilo Ho aggiornato la mia risposta con alcune informazioni più accurate tratte dal codice sorgente.
Kevin Mark,

3
analogWrite () può essere chiamato su qualsiasi pin, ma fa solo qualcosa sui pin PWM. Sui pin digitali non PWM e tutti i pin analogici, chiama semplicemente digitalWrite ().
baldengineer,

3
@powtac - È generalmente accettato che la documentazione di Arduino sia abbastanza abominevole, almeno da queste parti. Non pensare che ti manchi qualcosa, non sei tu, sono le persone arduino.
Connor Wolf,

3

Ho trascorso ore su questo. Pensavo di avere un problema hardware. Si scopre che stavo chiamando in analogRead()modo errato.

Errato (codice di esempio errato da DFRobot 😣):

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

Corretta:

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

Aggiornamento : analogRead()accetta i numeri di pin GPIO. A0ecc. sono #define per i numeri di pin di Arduino, dove A0 == 36.

Attenzione: ad es. FireBeetle ESP32, il pin etichettato "IO36 / A0" (GPIO36) equivale ad Arduino A0, ma "IO39 / A1" (GPIO39) è uguale ad Arduino A3(non A1), "IO34 / A2" (GPIO34) è uguale ad Arduino A6(non A2) , eccetera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.