Arduino
#include <Arduino.h>
#define SAMPLES 128
#define SAMPLING_RATE 1408 /* in Hz */
#define SAMPLING_TIME_US round(1000000.0/SAMPLING_RATE) /* in microseconds */
#define SENSIVITY 100
void sampleInQ(int16_t*, int16_t*);
int16_t getMeanValue(int16_t*, int16_t);
int detectDirection(int16_t* , int16_t*);
int direction = 0;
int16_t bufferI[SAMPLES] = {0};
int16_t bufferQ[SAMPLES] = {0};
void setup()
{
Serial.begin(38400);
Serial.println("Init done!");
pinMode(BGT_ON, OUTPUT);
digitalWrite(BGT_ON, LOW); // Turn on the board
}
void loop()
{
sampleInQ(bufferI, bufferQ);
direction = detectDirection(bufferI, bufferQ);
if(direction > 0)
{
Serial.println("DOOR: OPEN");
}else if(direction < 0){
Serial.println("DOOR: CLOSE");
}
}
void sampleInQ(int16_t* buffI, int16_t* buffQ)
{
for (int i = 0; i < SAMPLES; i++)
{
buffI[i] = analogRead(CH_I);
buffQ[i] = analogRead(CH_Q);
delayMicroseconds(SAMPLING_TIME_US);
}
}
int16_t getMeanValue(int16_t* buff, int16_t length)
{
int16_t meanRet = 0;
int sum = 0;
for (int i = 0; i < length; i++)
{
sum += buff[i];
}
meanRet = round((float)sum/(float)length);
return meanRet;
}
int detectDirection(int16_t* buffI, int16_t* buffQ)
{
int16_t directionRet = 0;
int indicator = 0;
bool edgechanged = true;
bool nextismax = true;
int16_t mean = 0;
mean = getMeanValue(buffI, SAMPLES);
for (int i = 0; i < (SAMPLES - 1); i++)
{
if ((buffI[i] < (mean - SENSIVITY)) || (buffI[i] > (mean + SENSIVITY)))
{
if(edgechanged) // Determine next turning point type
{
if(buffI[i] > buffI[i+1]) // I(t): New edge is falling
nextismax = false; // Look for minimum
else // I(t): New edge is rising
nextismax = true; // Look for maximum
edgechanged = false;
}
if (nextismax)
{
if (buffI[i] > buffI[i + 1]) // Waiting for maximum
{
if (buffQ[i] > buffQ[i + 1]) // ... meets falling edge Q(t)
indicator++;
else if (buffQ[i] < buffQ[i + 1]) // ... meets rising edge Q(t)
indicator--;
edgechanged = true; // Prepare for determine next edge I(t)
}
}
else
{
if (buffI[i] < buffI[i + 1]) // Waiting for minimum
{
if (buffQ[i] > buffQ[i + 1]) // ... meets falling edge Q(t)
indicator--;
else if (buffQ[i] < buffQ[i + 1]) // ... meets rising edge Q(t)
indicator++;
edgechanged = true; // Prepare for next edge I(t)
}
}
}
}
if (indicator > 0)
directionRet = 1;
else if (indicator < 0)
directionRet = -1;
return directionRet;
}