Uses the SRF02 UDS and displays distance in a variety of ways on the N5110 LCD.

Dependencies:   N5110WN PowerControl SRF02 mbed

main.cpp

Committer:
JakBlackburn
Date:
2015-03-13
Revision:
0:73bfbe8729d4
Child:
1:7f151ab172cb

File content as of revision 0:73bfbe8729d4:

#include "mbed.h"
#include "PowerControl/PowerControl.h"
#include "PowerControl/EthernetPowerControl.h"
#include "Speaker.h"
#include "N5110.h"
#include "SRF02/SRF02.h"

// Inputs
InterruptIn UnitTog(p14);
AnalogIn LCDTog(p15);
InterruptIn LogTog(p16);
InterruptIn VisTog(p17);
AnalogIn BuzVol(p19);
AnalogIn BLEDLevel(p20);
SRF02 sensor(p28,p27);//SDA SCL

// Outputs
//     VCC,SCE,RST,D/C,MOSI,SCLK,LED
N5110 lcd(p7,p8,p9,p10,p11,p13,p26);
Speaker Buzzer(p18);
PwmOut BLED(p26);
DigitalOut WLED(p21);
Serial pc(USBTX,USBRX);// the tx and rx respectively
BusOut leds(LED4,LED3,LED2,LED1);

float scanSpeed=1; //float that changes the speed that the distance is taken
float volume=1; //float used to vary the volume
int distance; //integer that stores the distance
float unitX=1; // if 1 in cm, 0.01 = m, 10 = mm
int timerFlag=0;
int U=0;  // if 0 cm, 1 is m, 2 is mm
string units;

Ticker timer;
//functions
void warnings();    // deals with the visual and audiable alerts.
void getDistance(); // takes 10 distances and averages them.
void unitToggle();  // changes the units cm/m/mm
void timerExpired();// timers ISR
void setScanSpeed(int dist); // sets the speed of the scanning, dependant on the distance


struct State {
 float unitMultiple; // unit mulitple
  Unit; // unit
 int nextState[2]; // array of next states
};
typedef const struct State STyp;
STyp fsm[3] = {
 {1,"cm",{0,1}}, // State 0 
 {0.01,"m",{1,2}}, // 
 {10,"mm",{2,0}}
 }; 
int state=0;


int main() {
    timer.attach(&timerExpired,scanSpeed);  
    while(1) {
     //timer.attach(&timerExpired,scanSpeed);
        if(timerFlag){
            timerFlag=0;
            unitToggle();
            getDistance();
         }
    }
}

void timerExpired(){
    timerFlag=1;   
}


void warnings(){
    WLED=1;
    volume= BuzVol.read();
    Buzzer.PlayNote(800.0, 0.1, volume);
    WLED=0;   
}
void getDistance(){
    int dist0 = sensor.getDistanceCm();
    wait(0.5*scanSpeed);
    int dist1 = sensor.getDistanceCm();
    wait(0.5*scanSpeed);
    int dist2 = sensor.getDistanceCm();
    wait(0.5*scanSpeed);
    int dist3 = sensor.getDistanceCm();
    wait(0.5*scanSpeed);
    int dist4 = sensor.getDistanceCm();
    wait(0.5*scanSpeed);
    int dist5 = sensor.getDistanceCm();
    wait(0.5*scanSpeed);
    int dist6 = sensor.getDistanceCm();
    wait(0.5*scanSpeed);
    int dist7 = sensor.getDistanceCm();
    wait(0.5*scanSpeed);
    int dist8 = sensor.getDistanceCm();
    wait(0.5*scanSpeed);
    int dist9 = sensor.getDistanceCm();
    distance=(dist0+dist1+dist2+dist3+dist4+dist5+dist6+dist7+dist8+dist9)/10;
    setScanSpeed(distance);
    
    pc.printf("Distance = %d %a\n",distance*unitX,units);
    warnings();
}

void unitToggle(){
    unitX = fsm[state].unitMultiple; // set output depending on current state
    units= fsm[state].Unit; // wait in that state for desired time
    state = fsm[state].nextState[UnitTog]; // read input (BusIn) and update current state
    //U++;
   // if(U==3){U=0;}
   // if(U==0){unitX=1;units="cm";}
   // if(U==1){unitX=0.01;units="m";}
   // if(U==2){unitX=10;units="mm";}
   // pc.printf("Units = %s \n",units);   
}

void setScanSpeed(int dist){
    if(dist>=100){
        scanSpeed=1/0.5; // sets the speed to every 2 seconds    
    }
    if(dist>=50){
        scanSpeed=1/1; // sets the speed to every second    
    }
    if(dist>=25){
        scanSpeed=1/2; // sets the speed to 2 times a second        
    }
    if(dist>=10){
        scanSpeed=1/4; // sets the speed to 4 times a second    
    }
    if(dist<10){
        scanSpeed=1/8; // sets the speed to 8 times a second    
    }
    pc.printf("Scan Speed = %d times/sec \n",(1/scanSpeed));
}