Go Down

Topic: Buffer circular que almacena datos de un sensor de movimiento (Read 630 times) previous topic - next topic

aherrera10

Buenas noches, dias o tardes, dependiendo cuando lean esto.

Tengo problemas con el estudio de un sensor de movimiento (RCWL-0516), basicamente, solo prende el led cuando me muevo y se apaga cuando no realizo movimiento alguno. Junto a este tengo un Arduino UNO, con el cual deseo crear un buffer de manera que lea 27 muestras con un solapamiento de 1 muestra.
Ejm:
0 1 2 3 ... 25 26 (primera lectura)
1 2 3 4 ... 26 27 (segunda lectura)
2 3 4 5 ... 27 28 (tercera lectura)
y asi sucesivamente, hasta al menos unos 2 segundos.

Hasta el momento desarrolle un codigo código guiandome de posteos que encontre en red y este mismo foro, pero no se como integrarlo a un buffer.

El primero, en teoria, almacena muestras cada por 250 milisegundos, y las convierte a escala de 5V

Code: [Select]

// Variables de sensor
float analog_out = 0.0;
float coefc_conv = 0.0;

// Variables de tiempo
int tiempo = 250;
unsigned long previoTime = 0;

// SETUP
void setup() {
  pinMode(A1, INPUT);
  Serial.begin(9600);
  delay(500);

  coefc_conv = 5.0/1024.0;
}

// LOOP
void loop() {
    unsigned long actualTime = millis();
    if ((unsigned long)(actualTime - previoTime) <= tiempo) {
      analog_out = analogRead(A1)*coefc_conv;      
      Serial.println(analog_out);
      previoTime = actualTime;
    }
  }


Y este de un buffer que almacena las 27 muestras, pero no se como agregar el analogRead, en loop? o en el mismo setup? (es de una pagina, pero por tiempo aun no me aventure a experimentar con este demasiado)

Code: [Select]
const int circularBufferLength = 27;
float circularBuffer[circularBufferLength];
int circularBufferIndex = 0;

void appendToBuffer(float value)
{
   circularBuffer[circularBufferIndex] = value*(5.0/1024.0);
   circularBufferIndex++;
   if (circularBufferIndex >= circularBufferLength) circularBufferIndex = 0;
}
 
void printArray(float* x, int length)
{
   for (int iCount = 0; iCount < length; iCount++)
   {
      Serial.print(x[iCount]);
      Serial.print(' ');
   }
   Serial.println();
}
 
void setup()
{
   pinMode(A1, INPUT);
  
   Serial.begin(9600);
   for (int iCount = 0; iCount <= 54; iCount++)
   {
      appendToBuffer(iCount);
      printArray(circularBuffer, circularBufferLength);
   }
}
 
void loop()
{
  
}


Agradeceria cualquier ayuda y aporte.

Moderador: Titulo editado

surbyte

Bien, primero error conceptual que veo.

Un  PIR entrega valores digitales asi que no hay nada que tengas que hacer con una entrada analógica.
Usa un pin digital 2 a 13 para leerlo.

La conversión de valores AD a float no tiene sentido y el uso de floats menos
Tu buffer como minimo debería ser de bits y sus estados como un registro de desplazamiento.

Y otro error conceptual. Si usas el AD que ya dije que esta mal no necesitas esto

Code: [Select]
pinMode(A1, INPUT);

Pero si puedes usar eso y olvidarte del AD, se comprende porque ahi lo defines como entrada digital pero luego no usas la función digitalRead(A1) que te daría el estado digital.


Luego te daré una idea de como corregir tu código

surbyte

Me iba a poner ha programar el buffer y luego dije a ver que librería lo hace y mira esto

Adapté levemente un ejemplo para que lea bits

Code: [Select]
#include <CircularBuffer.h> // https://github.com/rlogiacco/CircularBuffer

CircularBuffer<bool, 100> queue;

unsigned long time = 0;
#define BUTTON_PIN 2
bool status;

void setup() {
   Serial.begin(9600);
   pinMode(BUTTON_PIN, INPUT);
   time = millis();
}

// enqueue button press dequeueing every 2 seconds
void loop() {
   
   if (millis() - time >= 250) {
      status = digitalRead(BUTTON_PIN);
      queue.push(status);  // guarda el estado
      time = millis();
      Serial.print(status? "Boton ON": "Boton OFF");
   }
}

Go Up