Al muestrear desde A0 con una señal de 0-5V en un micro arduino con el código siguiente, obtengo algunos valores negativos.
int sensor = 0; sensor = abs(analogRead(A0) - 512);
Valores:
77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31
Cuando se ejecuta (aparentemente) matemáticamente código equivalente a continuación obtengo valores exclusivamente positivos.
int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor);
No creo que este sea un desbordamiento de enteros como en esta publicación porque cuando cambio a long sensor = 0
obtengo los mismos resultados negativos.
¿Qué está pasando aquí?
Respuesta
abs()
se define en Arduino.h como macro:
#define abs(x) ((x)>0?(x):-(x))
Una macro no se evalúa de la misma forma que una función.
sensor = abs(analogRead(A0) - 512);
Esta declaración se expandirá en tiempo de compilación a:
sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512));
Ahora el «error» es fácil de entender. El pin analógico se lee dos veces. El «error» se puede evitar agregando la siguiente línea primero en su boceto:
#undef abs
Esto eliminará la macro abs()
y la función de biblioteca estándar se utilizarán en su lugar.
¡Salud!
abs()
macro en Arduino.habs
ylabs
función. La macro arduinoabs
es un ridículo error de arduino. Aaron Ciuffo, haz clic en el enlace a Arduino.h en la respuesta de Mikael Patel, ahí ves las otras macros. Otra cosa es no usar una variable con el nombre " B1 ".