Pregunta:
¿Cómo hacer un bucle sobre pines analógicos?
hoosierEE
2014-05-21 20:51:17 UTC
view on stackexchange narkive permalink

Quiero hacer algo similar a

  for (int i = 0; i < 4; i ++) {analogRead (i);}  

Lo que parece funcionar, pero lo siguiente no:

  for (int i = 0; i < 4; i ++) {pinMode (i, INPUT); pinMode (i + 4, SALIDA); // debería convertir Analog Pin (i + 4) en una salida digitalWrite (i + 4, LOW); analogRead (i);}  

En cambio, parece tratar el pin direccionado por digitalWrite (i + 4, LOW); como uno de los pines digitales.

¿Realmente tengo que especificar explícitamente A0, A1, A2, ... cada vez que quiera hacer un bucle sobre los pines analógicos?

Lamento resucitar este hilo, pero quería señalar los pros y los contras de las respuestas proporcionadas anteriormente. El búnker nuclear de Craig es el más a prueba de balas; Funcionaría incluso si hubiera asignaciones no consecutivas. El avión de papel de Geometrikal es el menos a prueba de balas, ya que sus números mágicos fallarán tan pronto como se mueva a un tablero diferente (porque no hay nada hipotético acerca de que las asignaciones sean diferentes entre tableros). Ahora, para ser justos, dejan en claro que están ofreciendo "otra forma de escribir la respuesta de BrettAM" y, por lo tanto, tal vez no estén haciendo una recomendación seria en absoluto.
¡Me gustan sus descripciones poéticas de las diferentes respuestas! Las metáforas son adecuadas, pero es posible que desee ponerlas entre comillas para nuestros lectores no nativos de inglés, para resaltar que está siendo un poco hiperbólico: "búnker nuclear", "avión de papel", etc.
El reloj suizo de BrettAM me parece muy razonable porque solo falla en el caso de un mapeo no consecutivo que, hasta donde yo sé, sigue siendo una preocupación puramente hipotética. Lo que hace mejor la respuesta de BrettAM es aclarar el punto destacado de que A0 es solo una constante predefinida del mismo tipo (entero sin signo de 8 bits) que cualquier literal que pueda usar razonablemente en ese bucle for. A0 es solo un número. ¿Qué número es exactamente? Bueno, eso depende, y además, no importa mucho. Pero con lo que puede contar es que ** es ** un número y que es libre de usarlo como tal.
Cinco respuestas:
#1
+11
Craig
2014-05-21 23:07:37 UTC
view on stackexchange narkive permalink

Sí, los pines analógicos deben direccionarse usando A0, A1, ... cuando se usan para E / S digitales.

Dependiendo de la placa que esté usando A0, A1, etc. están asignados a diferentes valores (por ejemplo, parece que A0 es 18 en algunas placas pero 14 en otras.

Una solución para hacer un bucle sobre los pines analógicos sería esta:

  static const uint8_t analog_pins [] = {A0, A1, A2, A3, A4}; // Configuración de pines para inputfor (int i = 0; i < 5; i ++) {// o i < = 4 digitalRead (analog_pins [ i]);}  

Si está usando los pines analógicos solo con la llamada analogRead () , puede usar 0,1, ... en lugar de A0 , A1, ...

Según http://arduino.cc/en/Reference/analogRead, puede leer desde pines analógicos simplemente por número (por ejemplo, 0, 1, 2, 3, etc.); la "A" en "A0" es opcional. Por supuesto, puede ser más claro si los distingue con el prefijo "A", pero no es necesario para analogRead. Por otro lado, `digitalWrite (i)` asume que `i` se refiere a un pin digital; para utilizar digitalWrite con un pin analógico, es necesario incluir el prefijo "A".
Buena atrapada. Actualicé la respuesta.
Esta es la solución más portátil que he visto hasta ahora, y es la que estoy usando ahora, gracias.
#2
+4
BrettAM
2014-05-26 08:51:19 UTC
view on stackexchange narkive permalink

Al menos un Uno / Megas / leonardos, todos los valores asignados a números de pin analógicos son consecutivos, por lo que

  for (int i = A0; i < A4; i ++) {pinMode ( i, SALIDA); digitalWrite (i, LOW);}  

establecerá A0, A1, A2 y A3 en SALIDA, y luego en BAJO.

#3
+1
geometrikal
2014-05-26 18:41:44 UTC
view on stackexchange narkive permalink

Los pines 14 al 19 son los pines analógicos A0 a A5. A0 es solo un alias para 14 y así sucesivamente.

Entonces, otra forma de escribir la respuesta de BrettM:

  for (int i = 14; i < 18 i ++) {pinMode (i, OUTPUT); digitalWrite (i, LOW);}  
Esto no funciona en todas las placas Arduino. No todas las tablas usan 14-19.
#4
  0
Tom
2014-05-21 22:57:16 UTC
view on stackexchange narkive permalink

Su primer bucle funcionará bien, sin embargo, es posible que desee agregar delay (1); después de analogRead (i); , para dar el ADC algo de tiempo para asentarse.

¿Podría explicarnos lo que está tratando de hacer con su segunda pieza de código? Como se ve ahora, realmente no tiene sentido usar entradas analógicas como salidas digitales .

Además, estás tratando de leer la entrada de un pin solo un par de líneas después de que hayas especificado que el pin sea una salida.

Por favor, explica lo que estás tratando de lograr, para que la gente amable de aquí pueda ayudarte mejor.

#5
  0
LittleRain
2018-02-09 12:03:38 UTC
view on stackexchange narkive permalink

Sé que esto es antiguo, pero si pasa el mouse sobre A0 a A7 en visual micro, le mostrará el valor real, son solo una variable (en realidad se muestra como 14U, pero al abordar no es necesario incluir la U). Lo que Craig dijo está mal, NO tiene que ser abordado por A0, A1 ect ..

A0 = 14A1 = 15..A7 = 21

  // Will establecer todos los pines, digitales y analógicos en LOW (0) para (int i = 1; i < 22; i ++) {digitalWrite (i, LOW);} // Establecerá todos los pines analógicos en LOW (0) para (int i = 14; i < 22; i ++) {digitalWrite (i, LOW);} // Establecerá todos los pines analógicos en LOW (0) para (int i = A0; i < A7 + 1; i ++) {digitalWrite (i, LOW);}  

El último ciclo for básicamente dice i = 1 (A0) y se detiene en 21 (A7).



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...