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)); }