Final revision to radar/distance measuring tool. Radar feature not implemented within time frame due to issues with hardware and mbed.org servers
Dependencies: N5110 PowerControl SRF02 mbed
main.cpp
- Committer:
- el13k3s
- Date:
- 2015-05-11
- Revision:
- 0:ca83aafb7dcb
- Child:
- 1:d374bd09fa94
File content as of revision 0:ca83aafb7dcb:
/** @file main.cpp @brief Radar/Distance Measurement program implementation @author Karina Sodipo @date May 2015 */ #include "mbed.h" #include "N5110.h" #include "SRF02.h" #include "PowerControl/PowerControl.h" #include "PowerControl/EthernetPowerControl.h" /** @see - mbed CookBook (Power Management) */ /// function to power down the USB interface #define USR_POWERDOWN (0x104) int semihost_powerdown() { uint32_t arg; return __semihost(USR_POWERDOWN, &arg); } /** @namespace lcd @brief LCD screen display with VCC,SCE,RST,D/C,MOSI,SCLK,LED pins */ N5110 lcd(p7,p8,p9,p10,p11,p13,p26); // /** @namespace sensor @brief SRF02 ultrasonic distance sensor */ SRF02 sensor(p28,p27); /** @namespace leds @brief the on-board mbed LEDs in a BusOut class */ BusOut leds(LED4,LED3,LED2,LED1); /** @namespace led @brief LED proximity indicator */ PwmOut led(p24); /** @namespace screenInvert @brief button to switch from black-on-white to white-on-black */ InterruptIn screenInvert(p16); /** @namespace unitSW @brief button to switch from cm to inches */ InterruptIn unitSW(p17); /** @namespace radarDist @brief slide switch toggling radar and distance displays */ InterruptIn radarDist(p18); /** @namespace POT @brief potentiometer to change backlight brightness on LCD screen */ AnalogIn POT(p20); /** @namespace buzzer @brief Piezo buzzer for audio alerts (distance below 50cm / 20inch threshold AND countdown to sensor update) */ PwmOut buzzer(p21); /// function to display the checkerboard pattern void checkerboard(); /// function for LED and Piezo alerts in CM void proximityCm(); /// function for LED and Piezo alerts in INCHES void proximityIn(); /// function to define states of screenInvert button void initDisplay(); /// function to define states of unitsSW button void initMeasureIn(); /// function for potentiometer to change screen brightness void brightness(); /// function to display readings/radar in black-on-white mode void normal(); /// function to display readings/radar in white-on-black mode void invert(); /// function to measure distance in cm void centimetre(); /// function to measure distance in inches void inches(); /// function for radar display void radar(); /// buffer to store data sent to the screen char buffer[14]; /// Change units to measure distance in, modified in units() ISR int unit = 0; /*!< 'unit' toggled in units() ISR */ /// ISR for toggling between CM and INCH readings void units() { unit++; if (unit > 1) { // check whether unit modes stays within bounds unit = 0; } } /// pixel display style, modified in pixels() ISR int pixel = 0; /*!< 'pixel' set in pixels() ISR */ /// ISR for toggling between black-on-white and white-on-black display void pixels() { pixel++; if (pixel > 1) { // check whether display modes stays within bounds pixel = 0; } } int main() { /// Power down Ethernet interface to save ~ 175mW PHY_PowerDown(); /// Power down magic USB interface chip to save ~ 150mW int result = semihost_powerdown(); /// Disable clock on unused peripherals Peripheral_PowerDown(0x2000); /// CAN controller 1 Peripheral_PowerDown(0x4000); /// CAN controller 2 /// initialize the screen lcd.init(); /// call pixels() on rising edge when button pressed screenInvert.mode(PullUp); screenInvert.rise(&pixels); /// call units() on rising edge when button pressed unitSW.mode(PullUp); unitSW.rise(&units); /// switch to radar display - not radarDist.rise(&radar); /// switch to distance reader in cm radarDist.fall(¢imetre); /// Device welcome messages - print strings of characters at defined coordinates lcd.printString("Radar/Distance",0,1); lcd.printString("Measuring",15,3); lcd.printString("tool",30,5); wait(2); /// hold message for 2 secs lcd.refresh(); /// clear screen lcd.printString("A project",15,1); lcd.printString("by",35,3); lcd.printString("Karina Sodipo",3,5); wait(2); lcd.refresh(); lcd.printString("University",10,1); lcd.printString("of Leeds",15,3); lcd.printString("ELEC2645",15,5); wait(2); lcd.refresh(); /// display a checkerboard pattern to illustrate transition from start-up to main device functionality checkerboard(); wait(2); lcd.clear(); /// clear the buffer lcd.refresh(); while(1) { /// loop infinitely brightness(); initMeasureIn(); initDisplay(); } } /** @see - University of Leeds ELEC1620 Digital Electronics & Microcontrollers lecture slides */ /// function to display the checkerboard pattern void checkerboard() { for (int i = 0; i < 84; i+=2) { for (int j = 0; j < 48; j+=2) { lcd.setPixel(i,j); } } lcd.refresh(); } /// function to indicate object proximity on LED and buzzer in CM void proximityCm() { int distance = sensor.getDistanceCm(); if (distance < 50) { led = 1; buzzer = 0.5; wait(0.5); led = 0; buzzer = 0; wait(0.25); led = 1; buzzer = 0.5; wait(0.5); led = 0; buzzer = 0; wait(0.25); led = 1; buzzer = 0.5; wait(0.5); led = 0; buzzer = 0; wait(0.25); led = 1; buzzer = 0.5; wait(0.5); led = 0; buzzer = 0; wait(0.25); lcd.refresh(); } else { buzzer = 1; wait(0.5); buzzer = 0; wait(0.5); buzzer = 1; wait(0.5); buzzer = 0; wait(0.5); buzzer = 1; wait(0.5); buzzer = 0; wait(0.5); lcd.refresh(); } } /// function to indicate object proximity on LED and buzzer in INCHES void proximityIn() { int distance = sensor.getDistanceInch(); if (distance < 20) { led = 1; buzzer = 0.5; wait(0.5); led = 0; buzzer = 0; wait(0.25); led = 1; buzzer = 0.5; wait(0.5); led = 0; buzzer = 0; wait(0.25); led = 1; buzzer = 0.5; wait(0.5); led = 0; buzzer = 0; wait(0.25); led = 1; buzzer = 0.5; wait(0.5); led = 0; buzzer = 0; wait(0.25); lcd.refresh(); } else { buzzer = 1; wait(0.5); buzzer = 1; wait(0.5); buzzer = 1; wait(0.5); buzzer = 1; wait(0.5); buzzer = 1; wait(0.5); buzzer = 1; wait(0.5); lcd.refresh(); lcd.clear(); } } /// function to change units of readings: 0 - centimetres, 1 - inches void initMeasureIn() { if (unit == 0) { leds = 8; // switch LED4 on to indicate unit centimetre(); } if (unit == 1) { leds = 2; // switch LED2 on to indicate unit inches(); } } /// function to change display modes: 0 - normal display, 1 - inverted display void initDisplay() { if (pixel == 0) { leds = 4; // switch LED3 on to indicate display mode normal(); } if (pixel == 1) { leds = 1; // switch LED1 on to indicate display mode invert(); } } /// function to control screen backlight brightness void brightness() { lcd.setBrightness(POT); } /// function to set pixel display as black-on-white void normal() { lcd.normalMode(); } /// function to set pixel display as white-on-black void invert() { lcd.inverseMode(); } /// function to read distances in centimetres void centimetre() { int distance = sensor.getDistanceCm(); int length = sprintf(buffer,"D = %d cm",distance); /// Only allow data with length < or = 24 to be displayed if (length<= 14) lcd.printString(buffer,0,3); proximityCm(); /// short delay before next measurement wait(0.5); } /// function to read distances in inches void inches() { int distance = sensor.getDistanceInch(); int length = sprintf(buffer,"D = %d inches",distance); if (length<= 14) lcd.printString(buffer,0,3); proximityIn(); /// short delay before next measurement wait(0.5); } /// function for radar display - not called because it returns an error on the mbed void radar() { lcd.clear(); int distance = sensor.getDistanceCm(); // loop through if (distance < 5) { lcd.setPixel(41,1); } else if (distance < 10) { lcd.setPixel(41,2); } else if (distance < 15) { lcd.setPixel(41,3); } else if (distance < 20) { lcd.setPixel(41,4); } else if (distance < 25) { lcd.setPixel(41,5); } else if (distance < 30) { lcd.setPixel(41,6); } else if (distance < 35) { lcd.setPixel(41,7); } else if (distance < 40) { lcd.setPixel(41,8); } else if (distance < 45) { lcd.setPixel(41,9); } else if (distance < 50) { lcd.setPixel(41,10); } else if (distance < 55) { lcd.setPixel(41,11); } else if (distance < 60) { lcd.setPixel(41,12); } else if (distance < 65) { lcd.setPixel(41,13); } else if (distance < 70) { lcd.setPixel(41,14); } else if (distance < 75) { lcd.setPixel(41,15); } else if (distance < 80) { lcd.setPixel(41,16); } else if (distance < 85) { lcd.setPixel(41,17); } else if (distance < 90) { lcd.setPixel(41,18); } else if (distance < 95) { lcd.setPixel(41,19); } else if (distance < 100) { lcd.setPixel(41,20); } else if (distance < 105) { lcd.setPixel(41,21); } else if (distance < 110) { lcd.setPixel(41,22); } else if (distance < 115) { lcd.setPixel(41,23); } else if (distance < 120) { lcd.setPixel(41,24); } else if (distance < 125) { lcd.setPixel(41,25); } else if (distance < 130) { lcd.setPixel(41,26); } else if (distance < 135) { lcd.setPixel(41,27); } else if (distance < 140) { lcd.setPixel(41,28); } else if (distance < 145) { lcd.setPixel(41,29); } else if (distance < 150) { lcd.setPixel(41,30); } else if (distance < 155) { lcd.setPixel(41,31); } else if (distance < 160) { lcd.setPixel(41,32); } else if (distance < 165) { lcd.setPixel(41,33); } else if (distance < 170) { lcd.setPixel(41,34); } else if (distance < 175) { lcd.setPixel(41,35); } else if (distance < 180) { lcd.setPixel(41,36); } else if (distance < 185) { lcd.setPixel(41,37); } else if (distance < 190) { lcd.setPixel(41,38); } else if (distance < 195) { lcd.setPixel(41,39); } else if (distance < 200) { lcd.setPixel(41,40); } else if (distance < 205) { lcd.setPixel(41,41); } else if (distance < 210) { lcd.setPixel(41,42); } else if (distance < 215) { lcd.setPixel(41,43); } else if (distance < 220) { lcd.setPixel(41,44); } else if (distance < 225) { lcd.setPixel(41,45); } else if (distance < 230) { lcd.setPixel(41,46); } else if (distance < 235) { lcd.setPixel(41,47); } else if (distance < 240) { lcd.setPixel(41,48); } else { lcd.setPixel(41,48); } wait(3); lcd.refresh(); }