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
Fork of EDP2_display by
main.cpp
- Committer:
- raduschirila
- Date:
- 2018-03-07
- Revision:
- 5:4152a51f0724
- Parent:
- 4:82c807b7685e
- Child:
- 6:66dca4356808
File content as of revision 5:4152a51f0724:
#include "mbed.h"
#define max7219_reg_noop 0x00
#define max7219_reg_digit0 0x01
#define max7219_reg_digit1 0x02
#define max7219_reg_digit2 0x03
#define max7219_reg_digit3 0x04
#define max7219_reg_digit4 0x05
#define max7219_reg_digit5 0x06
#define max7219_reg_digit6 0x07
#define max7219_reg_digit7 0x08
#define max7219_reg_decodeMode 0x09
#define max7219_reg_intensity 0x0a
#define max7219_reg_scanLimit 0x0b
#define max7219_reg_shutdown 0x0c
#define max7219_reg_displayTest 0x0f
Serial pc(USBTX, USBRX); // tx, rx this is for the data to be sent via the usb port to the computer
Ticker pulse,freq,display_rate;
InterruptIn button(PTD5);
AnalogIn pulse_in(PTB0);
AnalogOut o(PTE30);
DigitalOut led(PTD5);
float xi,ypast,y,alpha=0.5,sum=0;
float v[80];
int q=0;
bool first=true;
inline bool slope(float f[80])
{
float r=(f[9]-f[3])/6;
return( (r>-0.01 && r<-0.03) ? true: false);
}
void get_pulse()
{
xi=(float)pulse_in;
//noise reduction algorithm
if(!first) { //noise filtering procedure
y= (alpha*xi)+ ((1-alpha)*ypast);
ypast=y;
sum+=y;
q++;
} else
first=false;
//normalization procedure
v[q-1]=y-(sum/(float)q)+0.1;//normalization procedure raw pulse value minus the trendline(running average)
//o=v[q-1];
if(q==80) {
q=0;
sum=sum/80;
}
if(slope) frq++;
}
#define LOW 0
#define HIGH 1
SPI max72_spi(PTD2, NC, PTD1);
DigitalOut load(PTD0); //will provide the load signal
//patterns declarations do not touch
char heart[8] = {0x00,0x36,0x7f,0x7f,0x3e,0x1c,0x08,0x00};
char five[8]= {0x7c,0x40,0x40,0x78,0x04,0x04,0x04,0x78};
char six[8]= {0x00,0x3c,0x20,0x20,0x3e,0x22,0x22,0x3e};
char seven[8]= {0x7c,0x04,0x04,0x08,0x08,0x08,0x08,0x08};
char eight[8]= {0x7e,0x42,0x42,0x42,0x7e,0x42,0x42,0x7e};
char nine[8]= {0x3e,0x22,0x22,0x3e,0x02,0x02,0x02,0x1e};
char ten[8]= {0x4f,0x49,0x49,0x49,0x49,0x49,0x49,0x4f};
char eleven[8]= {0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48};
char twlv[8]= {0x4f,0x41,0x41,0x41,0x4f,0x48,0x48,0x4f};
char thirtn[8]= {0x4f,0x41,0x41,0x4f,0x41,0x41,0x41,0x4f};
char fourtn[8]= {0x49,0x49,0x49,0x4f,0x41,0x41,0x41,0x41};
char fiftn[8]= {0x4f,0x48,0x48,0x4f,0x41,0x41,0x41,0x4f};
char wave[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
//DISPLAY FUNCTIONS DO NOT TOUCH
void write_to_max( int reg, int col)
{
load = LOW; // begin
max72_spi.write(reg); // specify register
max72_spi.write(col); // put data
load = HIGH; // make sure data is loaded (on rising edge of LOAD/CS)
}
//writes 8 bytes to the display
void pattern_to_display(char *testdata)
{
int cdata;
for(int idx = 0; idx <= 7; idx++) {
cdata = testdata[idx];
write_to_max(idx+1,cdata);
}
}
void setup_dot_matrix ()
{
// initiation of the max 7219
// SPI setup: 8 bits, mode 0
max72_spi.format(8, 0);
max72_spi.frequency(100000); //down to 100khx easier to scope ;-)
write_to_max(max7219_reg_scanLimit, 0x07);
write_to_max(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits)
write_to_max(max7219_reg_shutdown, 0x01); // not in shutdown mode
write_to_max(max7219_reg_displayTest, 0x00); // no display test
for (int e=1; e<=8; e++) { // empty registers, turn all LEDs off
write_to_max(e,0);
}
// maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set
write_to_max(max7219_reg_intensity, 0x08);
}
void clear()
{
for (int e=1; e<=8; e++) { // empty registers, turn all LEDs off
write_to_max(e,0);
}
}
//END OF DISPLAY FUNCTIONS
void splash_screen()
{
setup_dot_matrix (); /* setup matric */
pattern_to_display(heart);
wait_ms(1000);
heart[7]=0x01;
heart[0]=0x01;
for(int i=1; i<=8; ++i) {
pattern_to_display(heart);
wait(0.2);
heart[7]<<=1;
heart[7]|=1;
heart[0]=heart[7];
}
for(int i=1; i<=6; ++i) {
heart[i]=~heart[i];
}
pattern_to_display(heart);
wait(1);
clear();
}
void shift_all(char wav[8])
{
for(int i=1;i<=7;++i)
{
wav[i-1]=wav[i];
}
wav[7]=0x00;
pattern_to_display(wav);
}
char wave[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
void frq()
{
void disp()
{
int steps=v[q]/0.0125;
for(int i=1;i<=steps;++i)
{
wave[7]<<=1;
wave[7]|=1;
}
pattern_to_display(wave);
shift_all(wave);
}
int main()
{
splash_screen();//wait for the pulse to be stable by showing stuff on the display so the user is happy
pulse.attach(&get_pulse,0.0125);//attach the interrupt thing so it starts the ISR every 0.0125 s
button.rise(%frq);
display_rate.attach(&disp,0.1);
while(1) {
}
}
