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
Revision 5:651843de21ce, committed 2018-02-14
- Comitter:
- 2247469r
- Date:
- Wed Feb 14 15:26:02 2018 +0000
- Parent:
- 4:878821708feb
- Commit message:
- Added flashing LED function (potential bugs).
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Wed Feb 14 11:56:50 2018 +0000
+++ b/main.cpp Wed Feb 14 15:26:02 2018 +0000
@@ -1,13 +1,16 @@
-//Rango says, hey there Conor!
+//Rango says, hey there Connnor!
#include "mbed.h"
-DigitalOut myled(LED1);
+DigitalOut led(LED1);
AnalogIn Ain(PTB1);
int const MAX_B = 10;
int const alpha = 0.5;
int const AVG_LEN = 160;
+float const DISP_MAX = 7; //size of display indexed from 0
+float const trigger_high = DISP_MAX/2 + 1;
+float const trigger_low = DISP_MAX/2 - 1;
int sample_buffer[2*MAX_B] = {};
int local_buffer[2*MAX_B] = {};
@@ -20,7 +23,9 @@
int avg_sum;
bool first;
float avg;
-float pre_avg;
+float pre_point;
+
+bool rising = false;
Ticker sampler;
@@ -31,19 +36,39 @@
}
-float scale (float point) { //Multiply by scale factor
- return point*7 ;
+float min_of_avg(){
+ int min = avg_buffer[0];
+ for (int i = 0; i < AVG_LEN; i++){
+ if (avg_buffer[i] < min){
+ min = avg_buffer[i];
+ }
+ }
+ return min;
+}
+
+float max_of_avg(){
+ int max = avg_buffer[0];
+ for (int i = 0; i < AVG_LEN; i++){
+ if (avg_buffer[i] > max){
+ max = avg_buffer[i];
+ }
+ }
+ return max;
+}
+
+float normalise(float point) { //Normalise the value
+ float avg_min = min_of_avg();
+ return (DISP_MAX * (point / (max_of_avg() - avg_min)) + avg_min);
}
float filter (float output) { //Filter signal digtally to make more precise
- float point = alpha*output + (1- alpha)*pre_avg;
- point = scale(point);
+ float point = alpha*output + (1- alpha)*pre_point;
+ point = normalise(point);
return point;
}
-float get_trend(){ //Normalise signal by removing trend
+float average(){
float point;
- pre_avg = avg;
avg = avg_sum/AVG_LEN;
int normalised = avg_buffer[avg_write-1] - avg;
point = filter(normalised);
@@ -53,15 +78,51 @@
}
-float normalise() { //Normalise values
+bool above_trig_low(float point){
+ if(point <= trigger_low){
+ rising = false;
+ return true;
+ }
+ return false;
+}
+
+bool above_trig_high(float point){
+ if(point >= trigger_high){
+ rising = true;
+ return true;
+ }
+ return false;
+}
+
+void identify_pulse(float point) {
+ // Implementation of hysteresis
+ if(rising){
+ if (!above_trig_low(point)){
+ led = 1;
+ } else {
+ led = 0;
+ }
+ } else if (!rising){
+ if (!above_trig_high(point)){
+ led = 0;
+ } else {
+ led = 1;
+ }
+ }
+}
+
+float data_process() { //Setup for data process
float point ;
if (first) {
for (int i =0; i <MAX_B; i++) {
- avg_buffer[avg_write] = local_buffer[i];
+ int data = local_buffer[i];
+ avg_buffer[avg_write] = data;
avg_write = (++avg_write) % AVG_LEN;
- }
- if (write == 0) {
- first = false;
+ avg_sum += data;
+ }
+ if (avg_write == 0) {
+ first = false;
+ pre_point = local_buffer[MAX_B - 1];
}
}
else {
@@ -70,26 +131,19 @@
avg_sum = avg_sum + data - avg_buffer[avg_write];
avg_buffer[avg_write] = data;
- avg_write = (++avg_write) % AVG_LEN;
- point = get_trend();
-
+ avg_write = (++avg_write) % AVG_LEN;
+ pre_point = point;
+ point = average();
+ identify_pulse(point);
}
}
return point; //The tenth point
}
-float data_process() {
- return normalise();
+void write_to_display(float output) {
}
-void write_to_display(float output) {
- }
-
-void identify_pulse(float ouput) {
-
-
-}
int main() {
sampler.attach(&sampling, 0.0125); //Sample at 80Hz
@@ -101,7 +155,7 @@
}
}
float output = data_process();
- identify_pulse(output);
+
write_to_display(output);
}
}

