La referencia de arduino indica que usaría el siguiente código para leer el valor del pin analógico n.º 5:
int val1 = analogRead(5);
Sin embargo, para leer desde el pin digital n. ° 5, pasaría el mismo número de pin a digitalRead
:
int val2 = digitalRead(5);
¿No deberías usar analogRead(A5)
en lugar de analogRead(5)
?
Si no, ¿qué hace el siguiente código?
int val3 = analogRead(A5);
Para responder a las preguntas específicas de Tyilo:
analogRead(5)
y digitalRead(5)
leerá desde dos lugares diferentes. El primero leerá desde el canal analógico 5
y A5
el último leerá desde el pin 5, que resulta ser un pin digital. Entonces, sí, si desea leer un pin analógico digitalRead
, debe usar A5
.
¿Por qué?
analogRead
requiere un número de canal internamente, pero también le permitirá darle un número pin. Si le da un número pin, lo convertirá a su número de canal correspondiente. Por lo que puedo decir, analogRead
es la única función que usa un número de canal internamente, es la única que permite un número de canal y es la única función con esta conversión de pin a canal no documentada. Para entender esto, comencemos con algunos ejemplos.
Si desea usar analogRead
en el primer pin analógico A0
, puede hacer analogRead(0)
cuál usa el número de canal o analogRead(A0)
cuál usa el número de pin. Si tuviera que utilizar la variante del número de pin, analogRead
convertiría el número de pin A0
en su número de canal adecuado 0
.
Si desea usar digitalWrite
en el primer pin analógico , soloA0
puede hacerlo . no usa canales analógicos internamente y no le permite pasarle un número de canal. Bueno, te lo permitirá , pero seleccionarás el pin equivocado. Lo mismo se aplica a e incluso .digitalWrite(A0, x)
digitalWrite
digitalRead
analogWrite
¿Qué sucede con las conversiones de pin a canal realizadas por analogRead
? La fuente de esa función se puede encontrar en hardware/arduino/avr/cores/arduino/wiring_analog.c
Verás que hace algunas restas simples basadas en el tipo de tablero. El A0
/ A1
/ A2
/etc. Las constantes representan el número de pin de los canales analógicos y se pueden usar en cualquier lugar donde necesite consultar las entradas analógicas. Por esa razón, son la mejor opción para usar en tu código Arduino porque es muy obvio que estás usando el mismo puerto físico incluso cuando estás usando diferentes funciones. Las definiciones de esas constantes dependen de su tablero.
Por ejemplo, aquí está el código de definición de pin analógico para Arduino Uno enhardware/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 comparar, aquí está el código de definición de pin analógico para 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;
Más discusión de EE sobre pines analógicos: ¿Puedo usar los pines analógicos en el Arduino para mi proyecto como digital?
Pasé horas en esto. Pensé que tenía un problema de hardware. Resulta que estaba llamando analogRead()
incorrectamente.
Incorrecto (código de ejemplo erróneo de DFRobot 😣):
val = analogRead(0); //connect sensor to Analog 0
Correcto:
val = analogRead(A0); //connect sensor to Analog 0
Actualización : analogRead()
toma números pin GPIO. A0
etc. son #defines para los números de pin de Arduino, donde A0 == 36
.
Tenga cuidado: por ejemplo, en el FireBeetle ESP32, el pin etiquetado como "IO36/A0" (GPIO36) es igual a Arduino A0
, pero "IO39/A1" (GPIO39) es igual a Arduino A3
(no A1
), "IO34/A2" (GPIO34) es igual a Arduino A6
(no A2
) , etc.
Tiilo
Tiilo
analogRead
en pines analógicos! Por otro lado,analogWrite
se puede usar tanto en el pin analógico como en el PWM.kevin marca
ingeniero balden
kevin marca
powtac
connor lobo