Inst Project Submission
Dependencies: C12832 HC_SR04_Ultrasonic_Library mbed
Diff: main.cpp
- Revision:
- 0:f28e44548b08
diff -r 000000000000 -r f28e44548b08 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Aug 11 08:57:24 2018 +0000 @@ -0,0 +1,153 @@ +#include "mbed.h" +#include "C12832.h" + +DigitalOut trig(p21); //definition of the input signal. +DigitalIn echo(p22); //definition of the input signal. + +DigitalOut led1(LED1); // defines the led 1 used to show the trigger signal is happening. +DigitalOut led2(LED2); // defines the led 2 used to show the echo signal is happening. +DigitalOut led4(LED4); //defines the led 1 used to show the buzzer is turned on or off. + +C12832 lcd(p5, p7, p6, p8, p11); //Definition of LCD & Pins. + +Timer sonar; //definition of the sonar timer. + +PwmOut spker (p26); //Definition of the speaker. + +PwmOut r (p23); //Definition of the red led. +PwmOut g (p24); //Definition of the green led. +PwmOut b (p25); //Definition of the blue led. + +InterruptIn button(p14); //interrupt used to turn on/off buzzer. "calls function to flip buzzstart". +Timer debounce; //debounces button timer. + +int measurement; //defines the measurement variable. + +int offset = 0; //definition of the sonar timer offset. + +float inMin = 200; //minimum value readable in mm. +float inMax = 4000; //maximum readable value in mm. +float outMin = 0; //minimum mapped output value. +float outMax = 1; //maximum mapped output value. +float mapping = 0; //mapping value. + +bool buzzstart; // value flipped from o-1 to turn on off buzzer. + +float spkerVal=0.5; //initial pwm out value. + +//ranges used for buzzer. +int range1Min = 300; +int range2Min = 800; +int range3Min = 1200; + +//ranges used for speaker output. +int spkroutnear= 1000; +int spkroutmid= 600; +int spkroutfar= 200; + +float mapped_led() //function to create the map value for the leds. +{ + //mapping calculation for the measured distance to a float value between 0 and 1 used for RGB colour gradient shifts colour from green to red as the distance changes. I could have done this more directly but the mapping calculation is a nice bit of code to have to map one range of values to another. + mapping = ((measurement - inMin) * (outMax - outMin) / (inMax - inMin) + outMin); +//Caps the value for the RGBs between 0 and 1 + if (mapping < 0.00f) { //if statement less than 0 return 0. + return 0; + } else if (mapping > 1.00f) { //if statement greater than 1 return 1. + return 1; + } else { + return mapping; //value to return between 0 and 1. + } +} + +void ledCntrl() //function to control the leds pwm value on the application board. +{ + r=mapped_led(); //sets the value of the common anode RGB red to a duty cycle equal to the mapped value. + g=1-mapped_led (); //sets the value of the common anode RGB green to a duty cycle of 1 less the mapped value. + + if (buzzstart==1) { //condition based on bool value used to set the on condition of the onboard speaker. + if (measurement <= range1Min) { //if the measurement from the sensor is less than or equal to the lower value then; + spker.period(1.0/spkroutnear); //creates the Pwm out for the speaker/frequency to make the sound. + spker=spkerVal; // this is the value for the speaker duty cycle output 0 would turn the speaker off. + } + if (measurement >= range1Min && measurement <= range2Min) { //condition if measurement is less than/equal to range 1 and less than/equal to range 2 do the following; + spker.period(1.0/spkroutmid); //creates the Pwm out for the speaker/frequency to make the sound. + spker=spkerVal; // this is the value for the speaker duty cycle output 0 would turn the speaker off. + } + if (measurement >= range2Min && measurement <= range3Min) { //condition if measurement is greater than/equal to range 2 and less than/equal to range 3 do the following; + spker.period(1.0/spkroutfar); //creates the Pwm out for the speaker/frequency to make the sound. + spker=spkerVal; // this is the value for the speaker duty cycle output 0 would turn the speaker off. + } else if (measurement > range3Min) {//condition if measurement is greater than range 3 do the following; + spker = 0; //turns off the speaker. + } + } else if (measurement > range3Min) { //condition if measurement is greater than range 3 do the following; + spker = 0; //turns off the speaker. + } +} +void buzzCntrl() //function to control the bool value used to activate the buzzer. +{ + if (debounce.read_ms() >(200)) { //this conditional statement checks to see if the debounce time is greater than x milliseconds. It ignores any detected presses inside of this time. + debounce.reset(); //this will reset the button press timer allowing for another press to happen and the debouncing timer to start again. + led4=!led4; //flips the condition of led 4. + buzzstart = led4.read(); // links the state of buzzstart to led 4. + } +} +void printdim() //LCD Print Function +{ + lcd.cls(); //Clears the LCD + lcd.locate(2,15); //Location to be used for measurement information in mm. + lcd.printf("Measurement %d mm" ,measurement); //send the measurement to the lcd for display. +} +void measure_offset () //allows for the measure of software polling timer delay in microseconds used to correct possible errors in the measurement times due to the delay. +{ + while (echo==2) {}; // loops while the value of echo is 2, then following happens. + led2 = 0; // condition of led 2 is set to 0. + sonar.stop(); // the timer sonar is stopped. + offset = sonar.read_us(); // reads the timer +} +void take_measure() //measure distance between 2cm and 4m. +{ + int A_sum = 0; //sets the initial value for the average sum of the readings. + + while(1) { //Loop to read Sonar distance values, scale, and print values. + trig = 1; // trigger sonar to send a ping + led1 = trig; // led1 was set to trigger + led2 = 0; // led 2 was set to 0 + sonar.reset(); //the sonar timer was reset. + wait_us(10.0); // wait period for trigger out signal. + trig = 0; // turns of the trigger signal + led1 = trig; //sets the led1 to the value of the trigger. +//wait for echo high + while (echo==0) {}; // loop while the echo = o, then do the following. + led2=echo; // sets led 2 equal to the state of echo. + sonar.start(); //echo high, so start timer + while (echo==1) {}; //loop while echo = 1, then do the following; + sonar.stop(); //stop timer + for (int A = 0; A < 5; ++A) { //for the increments of I, read the sonar and sum the values, each reading has the software overhead timer delay subtracted and is scaled to mm + A_sum += (((sonar.read_us()-offset)/58.0)*10); //value of the sum. + } + measurement = A_sum/5.00f; //average of the readings by dividing the sum by the number of reading “5”. + led2 = 0; //sets the value of the led to 0. + wait(0.2); //loop wait period. + break; // breaks out of the loop. + } +} +int main() //main function of the application. +{ + r=1; //initial value of the red led. + g=1; //initial value of the red green. + b=1; //initial value of the blue led. + sonar.reset();// resets the value of the sonar. + sonar.start(); //starts the sonar timer. + measure_offset(); //calls the measure offset value. + button.rise(&buzzCntrl); //interrupt in call the buzzer control function. + debounce.start(); //starts the button debounce timer. + + while(1) { // main while loop. + take_measure(); //calls the measure function. + mapped_led(); // calls the value mapping function for the leds. + printdim(); //calls the print function to print the dimensions out the to the led screen. + ledCntrl(); // calls the led control function. + } +} + +