Referirse a un incremento/decremento de analogread()

Buenas noches.

Tengo una variable 'x' que lee constantemente en loop, el valor de AnalogRead y la muestra en el monitor serial. El conjunto de valores que me aporta es una curva cóncava gracias a un elemento externo conectado al Arduino (genera valores aleatorios constantemente, y a veces curvas cóncavas -forma de montaña-). De este modo, los valores no siempre son los mismos. Lo que busco es que se ejecute serial.print de estos valores desde que se comience a formar la curva hasta 2 segundos más tarde; sabiendo que el comienzo de la curva viene dado cuando existe un incremento de la variable 'x' del orden de 1.

Agradecería mucho vuestra ayuda

Muéstranos un ejemplo
(Una variación de 1 en analogRead() puede ocurrir fácilmente debido a la poca precisión del ADC y al voltaje de referencia variable)

Básicamente lo que tengo es un elemento generador de corriente que genera curvas cóncavas (de modo que son aleatorias, no se producen cada cierto tiempo). Como se puede ver en la imagen, la generación de estas curvas es aleatoria, y el valor máximo que toman también.

De este modo pretendo:
-Que los valores que se impriman sean desde que comienza la curva (x) hasta una posición x+n'.

FACTORES A TENER EN CUENTA:
No siempre comienza en el mismo valor, como se puede ver en la imagen.

De una posición x a una posición x+n hay una variación grande de valores, de modo que se podría detectar el comienzo de la curva por ese incremento de los valores más grande de lo normal. (si de x a x+n aumenta tanto, se cumple el fenómeno)

El fin de la impresión, que sería en una posición x+n', en función de donde comience la x (que para cada curva es diferente), se da o bien tras un tiempo después de que imprima el valor x o cuando se llegue a la posición x+n'.

El código que he hecho imprime los valores solamente cuando son mayores que 1v y cada 10ms, pero no es lo que busco.. Dejo a continuación el código:

  Serial.begin(115200);
}

void loop() {
  int sensor_value = analogRead(A1);
  float voltage = sensor_value * 5.0 / 1024;
  if ((voltage) > 1) {
 
    Serial.println(voltage);
  }

}

Es simple, imprimes cuando una lectura es mayor a la anterior (te aconsejo que la diferencia sea mayor a 1 porque 1 está dentro del error del ADC) y si es igual o menor no la imprimes.

Saludos

Sí, pero no sé como distinguir la posición de los lecturas diferentes, ese es mi problema. Todas se llaman voltage.

Básicamente no se como expresar esa diferencia entre ese valor y el anterior, principalmente porque no ocupan posiciones fijas.

puede ser algo asi?

const float delta = 0.01;
float previousVoltage;

float readVolatge() {
  return analogRead(A1) * 5.0 / 1024;
}

void setup() {
  Serial.begin(115200); Serial.println();
  previousVoltage = readVolatge();
}

void loop() {
  static unsigned long chrono;
  if (millis() - chrono >= 10) { // every 10ms
    float currentVoltage = readVolatge();
    if (currentVoltage > (previousVoltage + delta)) {
      Serial.println(currentVoltage);
    }
    chrono = millis();
    previousVoltage = currentVoltage;
  }
}

Ahí tienes un ejemplo

Muchas gracias, lo único es que no imprimiría valores que van desde x+n a x+n' no? Esos valores son decrecientes. Sería imprimir:
O bien los valores durante los 2 próximos segundos a que se imprimiera x+n
O un número de valores n' desde que se imprime x+n (6 por ejemplo)

puedes jugar con millis() también para forzar la impresión durante dos segundos (por ejemplo) cuando detectes un aumento

const float delta = 0.01;
float previousVoltage;

float readVolatge() {
  return analogRead(A1) * 5.0 / 1024;
}

void setup() {
  Serial.begin(115200); Serial.println();
  previousVoltage = readVolatge();
}

void loop() {
  static unsigned long readChrono;
  static unsigned long printChrono;
  static bool forcePrint = false;

  if (millis() - readChrono >= 10) { // every 10ms
    float currentVoltage = readVolatge();
    if (forcePrint) {
      Serial.println(currentVoltage);
      if (millis() - printChrono >= 2000) forcePrint = false;  // forzar la impresión durante dos segundos
    } else {
      if (currentVoltage > (previousVoltage + delta)) {
        Serial.println(currentVoltage);
        forcePrint = true;
        printChrono = millis();
      }
    }
    readChrono = millis();
    previousVoltage = currentVoltage;
  }
}

Era justo lo que buscaba. Muchas gracias!

estupendo. ¡Disfruta de tu Arduino!

1 Like