Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed LSM9DS1 FastPWM
Revision 1:72bcbf11c621, committed 2019-04-02
- Comitter:
- NTesla
- Date:
- Tue Apr 02 13:22:17 2019 +0000
- Parent:
- 0:33061e64e773
- Commit message:
- Vasko ENSIL
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Mar 05 13:55:16 2019 +0000
+++ b/main.cpp Tue Apr 02 13:22:17 2019 +0000
@@ -2,49 +2,62 @@
#include "LSM9DS1.h"
#include "FastPWM.h"
#include <math.h>
+/*
+ HOW TO CHANGE SETTING:
+ 1. Put "true" only in one of the next lines (15-18)
+ 2. Put "true" or "false" on PS_MODE if it's necessary (line 20)
+ 3. If using analog accelerometr - change "calibreted counts" according to the table(lines 23-28)
+ 4. If using optical transmitting choose PWM_MODE - 455 or 38 for 455 kHz and 38 kHz pwm (line 41)
+ Also if using optical transmitting choose BAUD_RATE 4800 for 38 kHz
+ or 4800, 9600, 19200, 38400 for 455 kHz (line42)
+*/
// setting of MIX DEVICE
#define DA_PS_BT false //Digital Accelerometer + Pulse Sensor + Bluetooth
-#define AA_PS_BT false// Analog Accelerometer + Pulse Sensor + Bluetooth
-#define DA_PS_Op true//Digital Accelerometer + Pulse Sensor + Optical
-#define AA_PS_Op false// Analog Accelerometer + Pulse Sensor + Optical
+#define AA_PS_BT fasle// Analog Accelerometer + Pulse Sensor + Bluetooth
+#define DA_PS_Op false//Digital Accelerometer + Pulse Sensor + Optical
+#define AA_PS_Op true// Analog Accelerometer + Pulse Sensor + Optical
+
+#define PS_MODE false // On/Off Pulse Sensor (
+#define PS_PIN A3 //Pulse Sensor pin
-#define PS_MODE false // On/Off Pulse Sensor
-#define PS_PIN A3 //Pulse Sensor pin
+float X0 = 1.68; //calibrated counts of analog Accelerometer
+float Y0 = 1.69;
+float Z0 = 1.70;
+float Sx = 0.69;
+float Sy = 0.70;
+float Sz = 0.68;
#define ACC_X_PIN A6
#define ACC_Y_PIN A5 //Analog Accelerometer pins
#define ACC_Z_PIN A4
-#define X0 1.69 //calibrated counts of analog Accelerometer
-#define Y0 1.67
-#define Z0 1.68
-#define Sx 0.65
-#define Sy 0.65
-#define Sz 0.65
#define BT_TX_PIN PA_9 // Bluetooth pins
#define BT_RX_PIN PA_10
-#define OPT_TX_PIN A7 // optical pins, pwm, baudrate
-#define OPT_RX_PIN A2
-#define BAUD_RATE 19200
-#define PWM_PIN D10
+#define OPT_TX_PIN A7 //A7 optical pins, pwm, baudrate
+#define OPT_RX_PIN A2
+
#define PWM_MODE 455
+#define BAUD_RATE 4800
+#define PWM_PIN D10 //D10
+
#if (DA_PS_Op || DA_PS_BT)
LSM9DS1 acc(D4, D5);
- //acc.setAcceleroRange(LSM9DS1_ACCELERO_RANGE_2G);
#endif
#if (AA_PS_BT || DA_PS_BT) // uart's init
Serial pc(SERIAL_TX, SERIAL_RX); // tx, rx
Serial BT(BT_TX_PIN, BT_RX_PIN); // tx, rx
+ //RawSerial pc2(A7,NC,115200); // if necessary run second uart
float acc_x,acc_y,acc_z;
#endif
#if (AA_PS_Op || DA_PS_Op)
- Serial Serial2(OPT_TX_PIN,OPT_RX_PIN,BAUD_RATE);
- int16_t acc_x,acc_y,acc_z;
+ Serial Serial2(OPT_TX_PIN,NC,BAUD_RATE);
+ //RawSerial pc(D1,NC,BAUD_RATE); // if necessary run second uart
+ uint16_t acc_x,acc_y,acc_z;
#endif
#if (AA_PS_BT || AA_PS_Op)
@@ -54,7 +67,7 @@
#endif
#if (PS_MODE)
- AnalogIn P(ACC_X_PIN);
+ AnalogIn P(PS_PIN);
#endif
DigitalOut myled(LED1, 1);
@@ -62,36 +75,29 @@
PwmOut buzz(A1);
float ARes = 2.0 / 32768.0; // Digital ACC have datatype int16_t
-
int Signal = 0;
+int OldSignal = 0;
int total = 0;
-
+int Maxn = 0;
int average = 0;
int IsoLine = 0;
int Tpulse = 0;
+int Tpulse1 = 0;
int Tpulse2 = 0;
-uint16_t count2=0;
-uint16_t count3=0;
+int Tpulse22;
+int PulseOK = 0;
int AccData[3];
-unsigned int trame1,trame2,trame3,trame4,trame5,trame6,trame7,trame8, trame9,tramePULSE;
+unsigned int trame1,trame2,trame3,trame4,trame5,trame6,trame7,trame8,trame9,tramePULSE;
int cptmesure;
-Timer t;
Timer T1;
-Timer T2;
-
-//variables globals
-
float delta;
-
double Last, Now;
bool START = false;
int coun;
-
float tableau_x[10], tableau_y[10], tableau_z[10], t_delta[10];
-
-int numReadings = 70;
+int numReadings = 500;
int Index = 0;
-int readings[70];
+int readings[500];
int IndexBPM = 5;
int IndexB = 0;
int readingsBPM[5];
@@ -100,6 +106,7 @@
int averageBPM;
int verif;
int patient;
+bool a = true;
void setup()
{
@@ -131,63 +138,61 @@
buzz.write(0.0f);
}
#if (PS_MODE)
- int readMean(int samples)
- {
- int sum = 0;
- for (int i = 0; i < samples; i++)
- {
- sum = sum + (4096 * P);
- }
- return sum/samples;
- }
-
+int readMean(int samples)
+{
+ int sum = 0;
+ for (int i = 0; i < samples; i++)
+ sum = sum + (4096*P.read());
+ return sum/samples;
+}
void pulse()
{
- Signal = readMean(10);
+ Signal = readMean(30);
total = total - readings[Index];
- readings[Index] = Signal; // ...которое было считано от сенсора:
- total = total + readings[Index]; // добавляем его к общей сумме:
- Index = Index + 1; // продвигаемся к следующему значению в массиве:
- if (Index >= numReadings)
- Index = 0; // ...возвращаемся к началу:
- int Maxn = 0; //обнуляем максимальное значение предидущих выборок массив
- for (int i = 0; i < numReadings; i++) // поиск макимальеого значения в масиве из "numReadings" выборок
+ readings[Index] = Signal;
+ total = total + readings[Index];
+ Index = Index + 1;
+ if (Index >= numReadings) Index = 0;
+ Maxn = 0;
+ for (int i = 0; i < numReadings; i++)
{
if (readings[i]>Maxn)
- Maxn = readings[i];
+ Maxn = readings[i];
}
average = total/numReadings;
- IsoLine = average + ((Maxn - average)*0.7);
-
- //Serial2.printf("%u %u %u\n", Signal, IsoLine ,average);
- if ((Signal > IsoLine) && (k > 0))
+ IsoLine = average + ((Maxn - average)*0.5);
+
+ if ((Signal > IsoLine) && (OldSignal < IsoLine))
{
- T1.stop();
- Tpulse = Tpulse2 + T1.read_us();
- int Tpulse22 = (long)(60L*1000L*1000L)/Tpulse;
- totalBPM = totalBPM - readingsBPM[IndexB];
- readingsBPM[IndexB] = Tpulse; // ...которое было считано от сенсора:
- totalBPM = totalBPM + readingsBPM[IndexB]; // добавляем его к общей сумме:
- IndexB = IndexB + 1; // продвигаемся к следующему значению в массиве:
- averageBPM = 60000000L/((long)totalBPM/IndexBPM);
- if(IndexB >= 5)IndexB = 0; // если мы в конце массива возвращаемся к началу:
- //Serial2.printf("BPM: %d averageBPM: %d\n", Tpulse22, averageBPM);
- T1.reset();
- T1.start();
- k--;
+ if (k > 0)
+ {
+ T1.stop();
+ Tpulse1 = T1.read_ms();
+ Tpulse = Tpulse2 + Tpulse1;
+ Tpulse22 = 60*1000L/Tpulse;
+ if (Tpulse22 > 40 && Tpulse22 < 240)
+ PulseOK = Tpulse22;
+ T1.reset();
+ T1.start();
+ k--;
+ }
}
else
{
- if (k < 1)
+ if((Signal < IsoLine) && (OldSignal > IsoLine))
{
- T1.stop();
- Tpulse2 = T1.read_us();
- T1.reset();
- T1.start();
- k++;
+ if (k < 1)
+ {
+ T1.stop();
+ Tpulse2 = T1.read_ms();
+ T1.reset();
+ T1.start();
+ k++;
+ }
}
}
+ OldSignal = Signal;
}
#endif
void matrice_euler()
@@ -201,26 +206,21 @@
void read_capteur()
{
#if (DA_PS_BT) //Digital acc init
- acc_x = -acc.getAcceleroRawY()*ARes;
- acc_y = acc.getAcceleroRawX()*ARes;
- acc_z = acc.getAcceleroRawZ()*ARes;
+ acc_x = -acc.getAcceleroRawY()*ARes; // !!axis directions are correct!!
+ acc_y = acc.getAcceleroRawX()*ARes; // !!axis directions are correct!!
+ acc_z = acc.getAcceleroRawZ()*ARes; // !!axis directions are correct!!
#elif (AA_PS_BT) // !!axis directions are correct!!
- acc_x = (Y*3.3-Y0)/Sy;
- acc_y = -(X*3.3-X0)/Sx;
- acc_z = -(Z*3.3-Z0)/Sz;
- #elif (AA_PS_Op)
- acc_x = Y*4096;
- acc_y = -X*4096;
- acc_z = -Z*4096;
- #elif (DA_PS_Op)
- //acc.getAcceleroRaw(AccData);
- acc_x = -acc.getAcceleroRawY();
- acc_y = acc.getAcceleroRawX();
- acc_z = acc.getAcceleroRawZ();
- #endif
-
- #if (PS_MODE)
- pulse();
+ acc_x = ((double)Y.read()*3.3-Y0)/Sy; // !!axis directions are correct!!
+ acc_y = -((double)X.read()*3.3-X0)/Sx; // !!axis directions are correct!!
+ acc_z = -((double)Z.read()*3.3-Z0)/Sz; // !!axis directions are correct!!
+ #elif (AA_PS_Op) // !!axis directions are correct!!
+ acc_x = Y.read_u16(); // !!axis directions are correct!!
+ acc_y = -X.read_u16(); // !!axis directions are correct!!
+ acc_z = -Z.read_u16(); // !!axis directions are correct!!
+ #elif (DA_PS_Op) // !!axis directions are correct!!
+ acc_x = -acc.getAcceleroRawY(); // !!axis directions are correct!!
+ acc_y = acc.getAcceleroRawX(); // !!axis directions are correct!!
+ acc_z = acc.getAcceleroRawZ(); // !!axis directions are correct!!
#endif
}
@@ -230,7 +230,7 @@
matrice_euler();
#if (AA_PS_BT || DA_PS_BT)
- if (coun>=10 && count3>=20)
+ if (coun>=10)
{
char s1[50]; //size of the number
char s2[50];
@@ -247,51 +247,46 @@
sprintf(s4, "%g", tableau_z[i]);
sprintf(s3, "%g", t_delta[i]);
#if (PS_MODE)
- sprintf(s5, "%g", averageBPM);
+ sprintf(s5, "%d", PulseOK);
BT.printf("%s;%s;%s;%s;%s|", s1,s2,s4,s3,s5);
- #else
+ #endif
+ #if (!PS_MODE)
BT.printf("%s;%s;%s;%s|", s1,s2,s4,s3);
#endif
}
}
- #else //(DA_PS_Op || AA_PS_Op)
+ #endif
+ #if (DA_PS_Op || AA_PS_Op)
//increment of measurement: avoids the redundancy of the display on the server
cptmesure++;
- if(cptmesure == 8)
- cptmesure = 0;
+ if(cptmesure == 8) cptmesure = 0;
- trame2 = (acc_x & 0xFF00) >> 8; // mask 1111 1111 0000 0000 (ACC 16 bit) int16_t
- trame3 = (acc_x & 0xFF); // mask 0000 0000 1111 1111
- trame4 = (acc_y & 0xFF00) >> 8;
- trame5 = (acc_y & 0xFF);
- trame6 = (acc_z & 0xFF00) >> 8;
- trame7 = (acc_z & 0xFF);
+ trame2 = (acc_x & 0xFF00) >> 8; // xxxx xxxx xxxx xxxx -> xxxx xxxx 0000 0000 -> 0000 0000 xxxx xxxx
+ trame3 = (acc_x & 0xFF); // xxxx xxxx xxxx xxxx -> 0000 0000 xxxx xxxx
+ trame4 = (acc_y & 0xFF00) >> 8; // same trame2
+ trame5 = (acc_y & 0xFF); // same trame3
+ trame6 = (acc_z & 0xFF00) >> 8; // same trame2
+ trame7 = (acc_z & 0xFF); // same trame3
- verif = (trame2 << 3) + cptmesure ;
-
+ verif = (trame2 << 3) + cptmesure; // xxxx xxxx -> xxx xxxx x000 -> xxx xxxx xccc
+
//first frame: patient + verif (2 bits high)
- trame1 = (patient << 4) + ((verif & 0x700) >> 7);//mask 111 0000 0000
+ trame1 = (patient << 4) + ((verif & 0x700) >> 7);// 0000 pppp -> pppp 0000 -> vvv vvvv vvvv -> vvv 0000 0000 -> 0000 0vvv -> pppp vvv0
- trame8 = (verif & 0xFF);//mask 1111 1111
+ trame8 = (verif & 0xFF);// vvv vvvv vvvv -> vvvv vvvv mask 1111 1111
//fifth frame: patient + increment measurement
- trame9 = (patient << 4) + (cptmesure << 1);
+ trame9 = (patient << 4) + (cptmesure << 1); // 0000 pppp -> pppp 0000 -> 0000 0ccc -> 0000 ccc0 -> pppp ccc0
-/* IMPORTANT TO UNDERSTAND (ONLY FOR NUCLEO)
- We fill the table which gonna be sent
+/* IMPORTANT TO UNDERSTAND (ONLY FOR NUCLEO)
TrameTab[0] = 255;
TrameTab[1] = trame1;
-
TrameTab[2] = trame2;
TrameTab[3] = trame3;
-
TrameTab[4] = trame8;
TrameTab[5] = trame9;
-
- //We sent the table through the serial port
//Serial2.write(TrameTab,6,0,0);
- //Serial.write to send the information under 8 bits. Serial.print sends a number digit by digit to use to have a display on the monitor.
- //BUT if we will use write() then sketch will stuck after 166 seconds. putc() working same as write().
+ //IF we will use write() then sketch will stuck after 166 seconds. putc() working same as write().
*/
Serial2.putc(255);
Serial2.putc(trame1);
@@ -302,7 +297,7 @@
Serial2.putc(trame6);
Serial2.putc(trame7);
#if (PS_MODE)
- Serial2.putc((uint8_t)averageBPM);
+ Serial2.putc((uint8_t)PulseOK);
#endif
Serial2.putc(trame8);
Serial2.putc(trame9);
@@ -330,6 +325,7 @@
wait_ms(50);
}
#endif
+
#if (PS_MODE)
switch(BAUD_RATE)
{
@@ -359,15 +355,19 @@
int main()
{
-
setup();
- t.start();
- Last = t.read_us();
- coun=0;
- count3=0;
+ #if (AA_PS_BT || DA_PS_BT)
+ t.start();
+ Last = t.read_us();
+ coun=0;
+ //count3=0;
+ #endif
while (true)
{
+ #if (PS_MODE)
+ pulse();
+ #endif
#if (AA_PS_BT || DA_PS_BT) //bluetooth mode
Now = t.read_us();
delta = (float)(Now-Last)/1000000.0f;
@@ -375,24 +375,16 @@
{
Last=Now;
coun+=1;
- if (count3<=81)
- {
- count3+=1;
- }
-
loop(); //Get sensor values
}
if (BT.readable())
{
char c = BT.getc();
if(c == '1'){
- //BT.printf("\nOK\n");
START=true;
- count3=0;
}
if(c == '0')
{
- //BT.printf("\nOK\n");
START=false;
myled=1;
buzz.write(0.50f);
@@ -400,9 +392,9 @@
buzz.write(0.0f);
}
}
- #else
- //optical
- loop();
+ #endif
+ #if(DA_PS_Op || AA_PS_Op)
+ loop();//optical
#endif
}
}