Diferencia entre revisiones de «analogRead()»

De ArduWiki
Saltar a: navegación, buscar
m (Comentarios)
(Advertencias)
 
(No se muestran 16 ediciones intermedias del mismo usuario)
Línea 2: Línea 2:
 
Lee el valor de pines analógicos marcados en Arduino como A0~A5, con una resolución de 10 bits. Esta instrucción sólo funciona en los pines (A0~A5).  
 
Lee el valor de pines analógicos marcados en Arduino como A0~A5, con una resolución de 10 bits. Esta instrucción sólo funciona en los pines (A0~A5).  
  
{{Nota|Los pines analógicos de entrada, al igual de que digitales de entrada no necesitan ser definidos con [[pinMode()]].}}
+
{{Tip|Los pines tanto analógicos como digitales de '''entrada''' no necesitan ser definidos con [[pinMode()]].}}
  
 
== Sintaxis ==
 
== Sintaxis ==
Línea 10: Línea 10:
  
 
== Parámetros ==
 
== Parámetros ==
;pin: un pin analogico. A0~A5 en Arduino [[UNO]], A0~A7 en Arduino [[MINI]] y [[NANO]], A0~A15 en Arduino [[MEGA]].
+
;pin: un pin analogico. A0~A5 en Arduino [[UNO]] y [[NANO]], A0~A15 en Arduino [[MEGA]].
  
 
== Retorno ==
 
== Retorno ==
 
El rango de valores devuelto puede estar entre 0~1023. Numero tipo [[int]].
 
El rango de valores devuelto puede estar entre 0~1023. Numero tipo [[int]].
 +
 +
== Comentarios ==
 +
* Si el pin de entrada analógica no está conectado (al aire o flotante), el valor devuelto por '''analogRead()''' fluctuará en base a una serie de factores (por ejemplo, los valores de las otras entradas analógicas, lo cerca que tu mano este a la placa, poner un multimetro en paralelo, etc.). Este fenómeno suele ser aprovechado para el valor de inicialización del generador pseudo-aleatorio de números [[randomSeed()]].
 +
* El rango de entrada y la resolución se pueden cambiar con [[analogReference()]].
 +
* Se tarda unos 100 microsegundos para leer y codificar una entrada analógica, por lo que la velocidad de lectura máxima es de alrededor de 10,000 veces por segundo.
 +
* La frecuencia máxima de lectura de un puerto análogo es de 1,5 Mhz (una cada 660 nano segundos). En comparación las entradas digitales pueden llegar a  15 Mhz (una cada 66 nano segundos), leyendo todas las entradas de forma simultánea.
 +
 +
{{Tip|Este comando tarda 1775 ciclos de CPU.}}
  
 
== Advertencias ==
 
== Advertencias ==
* No debes dejar al aire estos pines porque generan ruido electrico.
+
* No debes dejar al aire estos pines porque generan ruido eléctrico.
 
* La hoja de datos de ATmega también advierte contra el cambio de pines analógicos en proximidad a la realización de lecturas en otros pines analógicos ya que esto puede causar ruido eléctrico e introducir inestabilidad en el sistema analógico.
 
* La hoja de datos de ATmega también advierte contra el cambio de pines analógicos en proximidad a la realización de lecturas en otros pines analógicos ya que esto puede causar ruido eléctrico e introducir inestabilidad en el sistema analógico.
 
* Puede ser deseable, después de manipular los pines analógicos (en modo digital), agregar un breve retraso antes de usar '''analogRead()''' para leer otros pines analógicos.
 
* Puede ser deseable, después de manipular los pines analógicos (en modo digital), agregar un breve retraso antes de usar '''analogRead()''' para leer otros pines analógicos.
Línea 23: Línea 31:
 
* Tenga en cuanta que activar la resistencia pull-up afecta las lecturas de '''analogRead()'''.
 
* Tenga en cuanta que activar la resistencia pull-up afecta las lecturas de '''analogRead()'''.
 
<pre>
 
<pre>
pinMode(A0 INPUT_PULLUP);
+
pinMode(A0, INPUT_PULLUP);
 
</pre>
 
</pre>
 
== Comentarios ==
 
* Si el pin de entrada analógica no está conectado (al aire o flotante), el valor devuelto por '''analogRead()''' fluctuará en base a una serie de factores (por ejemplo, los valores de las otras entradas analógicas, lo cerca que tu mano este a la placa, poner un multimetro en paralelo, etc.). Este fenómeno suele ser aprovechado para el valor de inicialización del generador pseudo-aleatorio de números ([[randomSeed()]]).
 
* El rango de entrada y la resolución se pueden cambiar con [[analogReference()]].
 
* Se tarda unos 100 microsegundos para leer y codificar una entrada analógica, por lo que la velocidad de lectura máxima es de alrededor de 10,000 veces por segundo.
 
  
 
== Ejemplo 1 ==
 
== Ejemplo 1 ==
Línea 49: Línea 52:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
== Ejemplo 3 ==
 +
En este ejemplo medimos el valor de un sensor cada 15 segundos y promediamos las ultimas 5 lecturas.
 +
 +
<syntaxhighlight lang="c++">
 +
const byte ventana = 5;
 +
int circularBuffer[ventana];
 +
int* indice = circularBuffer;
 +
 +
long suma;
 +
byte elementos;
 +
 +
float meter(int dato){
 +
  suma -= *indice;
 +
  suma += dato;
 +
  *indice = dato;
 +
  indice++;
 +
  if (indice >= circularBuffer + ventana){
 +
      indice = circularBuffer;
 +
  }
 +
  if (elementos < ventana){
 +
      elementos++;
 +
  }
 +
  return (float) suma / elementos;
 +
}
 +
 +
void setup(){
 +
  Serial.begin(115200);
 +
}
 +
 +
void loop(){
 +
  int x = analogRead(A0);
 +
  Serial.print(x);
 +
  float media = meter(x);
 +
  Serial.print(" promedio\t");
 +
  Serial.println(media);
 +
  delay(15000);
 +
}
 +
</syntaxhighlight>
 +
 +
{{Tip|Si prefieres hay una librería llamada [https://github.com/luisllamasbinaburo/Arduino-Meanfilter Arduino Meanfilter] de Luis Llamas que puedes usar.}}
  
 
== Vea también ==
 
== Vea también ==
* [[analogReference()]]
+
<categorytree mode=all>Funciones pines</categorytree>
* [[analogReadResolution()]] - solo [[DUE]] y [[ZERO]]
 
* [[analogWriteResolution()]] - solo [[DUE]] y [[ZERO]]
 
* [[analogWrite()]]
 
* [[digitalRead()]]
 
* [[digitalWrite()]]
 
* [[pinMode()]]
 
  
== Referencias ==
+
== Referencias externas ==
 
* [https://www.arduino.cc/en/Tutorial/AnalogInputPins Guia de referencia Arduino]
 
* [https://www.arduino.cc/en/Tutorial/AnalogInputPins Guia de referencia Arduino]
* [http://manueldelgadocrespo.blogspot.com/p/description-reads-value-from-specified.html Manuel Delgado Crespo]
+
* [http://manueldelgadocrespo.blogspot.com/p/description-reads-value-from-specified.html Reads value from specified] - Manuel Delgado Crespo
* [https://aprendiendoarduino.wordpress.com/tag/analogread/ Aprendiendo Arduino]
+
* [https://aprendiendoarduino.wordpress.com/tag/analogread/ analogRead()] - Aprendiendo Arduino
 +
* [https://www.luisllamas.es/entradas-analogicas-en-arduino/ Entradas analogicas en Arduino] - Luis Llamas
 +
* [https://www.luisllamas.es/arduino-filtro-media-movil/ Arduino media movil] - Luis Llamas
 +
* [https://www.luisllamas.es/libreria-arduino-mean-filter/ Libreria mean filter] - Luis Llamas
 +
* [http://diymakers.es/sensores-en-entradas-analogicas-de-arduino/ Sensores en entradas analogicas de Arduino] - Diy Makers
  
[[Category:Funciones]]
+
[[Category:Funciones pines]]

Revisión actual del 22:40 11 sep 2019

Descripción

Lee el valor de pines analógicos marcados en Arduino como A0~A5, con una resolución de 10 bits. Esta instrucción sólo funciona en los pines (A0~A5).

Tip: Los pines tanto analógicos como digitales de entrada no necesitan ser definidos con pinMode().


Sintaxis

analogRead(pin);

Parámetros

pin
un pin analogico. A0~A5 en Arduino UNO y NANO, A0~A15 en Arduino MEGA.

Retorno

El rango de valores devuelto puede estar entre 0~1023. Numero tipo int.

Comentarios

  • Si el pin de entrada analógica no está conectado (al aire o flotante), el valor devuelto por analogRead() fluctuará en base a una serie de factores (por ejemplo, los valores de las otras entradas analógicas, lo cerca que tu mano este a la placa, poner un multimetro en paralelo, etc.). Este fenómeno suele ser aprovechado para el valor de inicialización del generador pseudo-aleatorio de números randomSeed().
  • El rango de entrada y la resolución se pueden cambiar con analogReference().
  • Se tarda unos 100 microsegundos para leer y codificar una entrada analógica, por lo que la velocidad de lectura máxima es de alrededor de 10,000 veces por segundo.
  • La frecuencia máxima de lectura de un puerto análogo es de 1,5 Mhz (una cada 660 nano segundos). En comparación las entradas digitales pueden llegar a 15 Mhz (una cada 66 nano segundos), leyendo todas las entradas de forma simultánea.

Tip: Este comando tarda 1775 ciclos de CPU.


Advertencias

  • No debes dejar al aire estos pines porque generan ruido eléctrico.
  • La hoja de datos de ATmega también advierte contra el cambio de pines analógicos en proximidad a la realización de lecturas en otros pines analógicos ya que esto puede causar ruido eléctrico e introducir inestabilidad en el sistema analógico.
  • Puede ser deseable, después de manipular los pines analógicos (en modo digital), agregar un breve retraso antes de usar analogRead() para leer otros pines analógicos.
  • La placa Arduino UNO contiene 6 canales (8 canales para MINI y NANO, 16 para MEGA), analógicos con convertidor analógico a digital (ADC) de 10 bit. Esto significa que mapeará tensiones de entrada entre 0~5V en valores enteros entre 0~1023. Esto produce una resolución entre las lecturas de 4.9 mV por unidad.
  • El comando analogRead() no funcionará correctamente si un pin analogico se ha configurado previamente como salida con pinMode(14, OUTPUT), por lo que si este es el caso, configúrelo nuevamente como pinMode(14, INPUT) antes de usar analogRead(). De forma similar, si estando como salida se puso digitalWrite(14, HIGH), la resistencia pull-up se establecerá, cuando se vuelva a configurar como entrada con pinMode(14, INPUT).
  • Tenga en cuanta que activar la resistencia pull-up afecta las lecturas de analogRead().
pinMode(A0, INPUT_PULLUP);

Ejemplo 1

analogRead(A0);
analogRead(5);

const byte pin = 3;
int valor = analogRead(pin);

Ejemplo 2

void setup(){
   Serial.begin(9600);
}
void loop(){
   Serial.println(analogRead(A2));
}

Ejemplo 3

En este ejemplo medimos el valor de un sensor cada 15 segundos y promediamos las ultimas 5 lecturas.

const byte ventana = 5;
int circularBuffer[ventana];
int* indice = circularBuffer;

long suma;
byte elementos;

float meter(int dato){
   suma -= *indice;
   suma += dato;
   *indice = dato;
   indice++;
   if (indice >= circularBuffer + ventana){
      indice = circularBuffer;
   }
   if (elementos < ventana){
      elementos++;
   }
   return (float) suma / elementos;
}

void setup(){
   Serial.begin(115200);
}

void loop(){
   int x = analogRead(A0);
   Serial.print(x);
   float media = meter(x);
   Serial.print(" promedio\t");
   Serial.println(media);
   delay(15000);
}

Tip: Si prefieres hay una librería llamada Arduino Meanfilter de Luis Llamas que puedes usar.


Vea también


Referencias externas