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
main.cpp
- Committer:
- 2247469r
- Date:
- 2018-02-14
- Revision:
- 5:651843de21ce
- Parent:
- 4:878821708feb
File content as of revision 5:651843de21ce:
//Rango says, hey there Connnor!
#include "mbed.h"
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] = {};
int avg_buffer[AVG_LEN] = {};
int read = 0;
int write = 0;
int avg_write = 0;
int avg_sum;
bool first;
float avg;
float pre_point;
bool rising = false;
Ticker sampler;
void sampling () { //Sample Signal
unsigned int sample = Ain.read_u16();
sample_buffer[write++] = sample;
write = write%(2*MAX_B);
}
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_point;
point = normalise(point);
return point;
}
float average(){
float point;
avg = avg_sum/AVG_LEN;
int normalised = avg_buffer[avg_write-1] - avg;
point = filter(normalised);
return point;
}
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++) {
int data = local_buffer[i];
avg_buffer[avg_write] = data;
avg_write = (++avg_write) % AVG_LEN;
avg_sum += data;
}
if (avg_write == 0) {
first = false;
pre_point = local_buffer[MAX_B - 1];
}
}
else {
for (int i =0; i <MAX_B; i++) {
int data = local_buffer[i];
avg_sum = avg_sum + data - avg_buffer[avg_write];
avg_buffer[avg_write] = data;
avg_write = (++avg_write) % AVG_LEN;
pre_point = point;
point = average();
identify_pulse(point);
}
}
return point; //The tenth point
}
void write_to_display(float output) {
}
int main() {
sampler.attach(&sampling, 0.0125); //Sample at 80Hz
while(1) {
if (write-read > MAX_B || read-write > MAX_B) { // |write-read| > MAX_B/2
for(int i = 0; i < MAX_B/2; i++) {
local_buffer[i] = sample_buffer[read];
read = (++read) % MAX_B;
}
}
float output = data_process();
write_to_display(output);
}
}

