'Sensor-Matic!' ELEC2645 Jack Berriman - 200836573

Dependencies:   N5110-JDB SRF02 SoftPWM-JDB TMP102 mbed

Committer:
ll13jdb
Date:
Thu May 05 14:55:30 2016 +0000
Revision:
0:e8ca5d36a1e7
Final Project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ll13jdb 0:e8ca5d36a1e7 1 /*
ll13jdb 0:e8ca5d36a1e7 2
ll13jdb 0:e8ca5d36a1e7 3 ELEC2645 - Embedded Systems Project - "Sensor-matic!"
ll13jdb 0:e8ca5d36a1e7 4
ll13jdb 0:e8ca5d36a1e7 5 Distance and Temperature Sensors Displayed on Nokia 5110 Screen
ll13jdb 0:e8ca5d36a1e7 6
ll13jdb 0:e8ca5d36a1e7 7
ll13jdb 0:e8ca5d36a1e7 8 Week 19 - Testing SRF02 Distance Sensor
ll13jdb 0:e8ca5d36a1e7 9
ll13jdb 0:e8ca5d36a1e7 10 Week 20 - Creating Splash Screens
ll13jdb 0:e8ca5d36a1e7 11
ll13jdb 0:e8ca5d36a1e7 12 Week 21 - Diagrams for Temperature and Distance
ll13jdb 0:e8ca5d36a1e7 13
ll13jdb 0:e8ca5d36a1e7 14 Easter - Navigation Between Menus
ll13jdb 0:e8ca5d36a1e7 15
ll13jdb 0:e8ca5d36a1e7 16 Week 22 - Piezo/LEDs Interfaced
ll13jdb 0:e8ca5d36a1e7 17
ll13jdb 0:e8ca5d36a1e7 18 Week 23 - DOxygen Commenting
ll13jdb 0:e8ca5d36a1e7 19
ll13jdb 0:e8ca5d36a1e7 20 Week 24 - Cleaning Up & Submission
ll13jdb 0:e8ca5d36a1e7 21
ll13jdb 0:e8ca5d36a1e7 22
ll13jdb 0:e8ca5d36a1e7 23 (c) Jack Berriman, University of Leeds, Summer 2016
ll13jdb 0:e8ca5d36a1e7 24
ll13jdb 0:e8ca5d36a1e7 25 */
ll13jdb 0:e8ca5d36a1e7 26
ll13jdb 0:e8ca5d36a1e7 27 /**
ll13jdb 0:e8ca5d36a1e7 28 @file main.cpp
ll13jdb 0:e8ca5d36a1e7 29 @brief Program Implementation
ll13jdb 0:e8ca5d36a1e7 30 */
ll13jdb 0:e8ca5d36a1e7 31
ll13jdb 0:e8ca5d36a1e7 32
ll13jdb 0:e8ca5d36a1e7 33 #include "main.h"
ll13jdb 0:e8ca5d36a1e7 34
ll13jdb 0:e8ca5d36a1e7 35
ll13jdb 0:e8ca5d36a1e7 36 // ------------------------- MAIN FUNCTION ------------------------- //
ll13jdb 0:e8ca5d36a1e7 37
ll13jdb 0:e8ca5d36a1e7 38 int main() // Main Function
ll13jdb 0:e8ca5d36a1e7 39 {
ll13jdb 0:e8ca5d36a1e7 40
ll13jdb 0:e8ca5d36a1e7 41 init_K64F(); // Initialise FRDM K64F Micrcontroller
ll13jdb 0:e8ca5d36a1e7 42 init_buzzer(); // Initialise Piezo Buzzer
ll13jdb 0:e8ca5d36a1e7 43 init_program(); // Initialise Other Program Requirements (Screen/Ticker/Baud Rate)
ll13jdb 0:e8ca5d36a1e7 44
ll13jdb 0:e8ca5d36a1e7 45 welcomeScreen(); // Display Welcome Screen
ll13jdb 0:e8ca5d36a1e7 46 screen.clear(); // Clear Screen
ll13jdb 0:e8ca5d36a1e7 47
ll13jdb 0:e8ca5d36a1e7 48 while (1) { // Infinite Program While Loop
ll13jdb 0:e8ca5d36a1e7 49
ll13jdb 0:e8ca5d36a1e7 50 if (screenNumber == 0) { // Main Menu = 0
ll13jdb 0:e8ca5d36a1e7 51 mainMenu();
ll13jdb 0:e8ca5d36a1e7 52 } else if (screenNumber == 1) { // Sensor Menu = 1
ll13jdb 0:e8ca5d36a1e7 53 sensorMenu();
ll13jdb 0:e8ca5d36a1e7 54 } else if (screenNumber == 2) { // Options Menu = 2
ll13jdb 0:e8ca5d36a1e7 55 optionsMenu();
ll13jdb 0:e8ca5d36a1e7 56 } else if (screenNumber == 3) { // Distance Display = 3
ll13jdb 0:e8ca5d36a1e7 57 distanceDisplay();
ll13jdb 0:e8ca5d36a1e7 58 } else { // Temperature Display = 4
ll13jdb 0:e8ca5d36a1e7 59 temperatureDisplay();
ll13jdb 0:e8ca5d36a1e7 60 }
ll13jdb 0:e8ca5d36a1e7 61
ll13jdb 0:e8ca5d36a1e7 62 screen.refresh(); // Refresh Screen AFTER Each Iteration
ll13jdb 0:e8ca5d36a1e7 63 sleep(); // Put Peripherals To Sleep (Due to InterruptIn)
ll13jdb 0:e8ca5d36a1e7 64
ll13jdb 0:e8ca5d36a1e7 65 }
ll13jdb 0:e8ca5d36a1e7 66 }
ll13jdb 0:e8ca5d36a1e7 67
ll13jdb 0:e8ca5d36a1e7 68
ll13jdb 0:e8ca5d36a1e7 69 // ------------------------- INITIALISE FUNCTIONS ------------------------- //
ll13jdb 0:e8ca5d36a1e7 70
ll13jdb 0:e8ca5d36a1e7 71 void clearAll() // Clears Current Buffer (Text/Pixels) -- ADAPTED FROM ELEC1620 (GAME OF LIFE PROJECT)
ll13jdb 0:e8ca5d36a1e7 72 {
ll13jdb 0:e8ca5d36a1e7 73 for (int xPixel = 0; xPixel < 84; xPixel++) { // Loops Through X-Pixels
ll13jdb 0:e8ca5d36a1e7 74 for (int yPixel = 0; yPixel < 48; yPixel++) { // Loops Through Y-Pixels
ll13jdb 0:e8ca5d36a1e7 75 screen.clearPixel(xPixel,yPixel); // Clears
ll13jdb 0:e8ca5d36a1e7 76 }
ll13jdb 0:e8ca5d36a1e7 77 }
ll13jdb 0:e8ca5d36a1e7 78 screen.refresh(); // Refreshes Screen AFTER Clearing
ll13jdb 0:e8ca5d36a1e7 79 }
ll13jdb 0:e8ca5d36a1e7 80
ll13jdb 0:e8ca5d36a1e7 81
ll13jdb 0:e8ca5d36a1e7 82 void init_K64F() // Initialise K64F Function
ll13jdb 0:e8ca5d36a1e7 83 {
ll13jdb 0:e8ca5d36a1e7 84 // On-Board LEDs are Active-Low
ll13jdb 0:e8ca5d36a1e7 85 r_led = 1;
ll13jdb 0:e8ca5d36a1e7 86 g_led = 1; // Set to 1 (High) to Turn OFF
ll13jdb 0:e8ca5d36a1e7 87 b_led = 1;
ll13jdb 0:e8ca5d36a1e7 88
ll13jdb 0:e8ca5d36a1e7 89 allLEDOff(); // Turn off All LEDs
ll13jdb 0:e8ca5d36a1e7 90
ll13jdb 0:e8ca5d36a1e7 91 forward.rise(&forward_isr); // Interrupts Fire on Rising Clock Edge
ll13jdb 0:e8ca5d36a1e7 92 backward.rise(&backward_isr);
ll13jdb 0:e8ca5d36a1e7 93
ll13jdb 0:e8ca5d36a1e7 94 forward.mode(PullDown); // Push Buttons are Connected to +3V3 - Pull-Down to Ground when Pressed
ll13jdb 0:e8ca5d36a1e7 95 backward.mode(PullDown);
ll13jdb 0:e8ca5d36a1e7 96 }
ll13jdb 0:e8ca5d36a1e7 97
ll13jdb 0:e8ca5d36a1e7 98
ll13jdb 0:e8ca5d36a1e7 99 void init_buzzer() // Initialise Piezo Buzzer Function
ll13jdb 0:e8ca5d36a1e7 100 {
ll13jdb 0:e8ca5d36a1e7 101 piezo.period(1.0/2000.0); // Set Frequency to 2 kHz
ll13jdb 0:e8ca5d36a1e7 102 piezo.write(0.0); // Turn OFF (Duty Cycle = 0)
ll13jdb 0:e8ca5d36a1e7 103 }
ll13jdb 0:e8ca5d36a1e7 104
ll13jdb 0:e8ca5d36a1e7 105
ll13jdb 0:e8ca5d36a1e7 106 void init_program() // Initialise Other Program Requirements
ll13jdb 0:e8ca5d36a1e7 107 {
ll13jdb 0:e8ca5d36a1e7 108 screen.init(); // Initialise Screen
ll13jdb 0:e8ca5d36a1e7 109 screen.clear(); // Clear Buffer
ll13jdb 0:e8ca5d36a1e7 110 systemTicker.attach(&system_isr,0.5); // Attach Ticker
ll13jdb 0:e8ca5d36a1e7 111 pc.baud(115200); // Set Serial Port Baud Rate to 115200 Hz
ll13jdb 0:e8ca5d36a1e7 112 }
ll13jdb 0:e8ca5d36a1e7 113
ll13jdb 0:e8ca5d36a1e7 114
ll13jdb 0:e8ca5d36a1e7 115 void welcomeScreen() // Prints Welcome Screen on Start-Up
ll13jdb 0:e8ca5d36a1e7 116 {
ll13jdb 0:e8ca5d36a1e7 117
ll13jdb 0:e8ca5d36a1e7 118 // printString is a function from N5110.h
ll13jdb 0:e8ca5d36a1e7 119 screen.printString("ELEC2645", 20, 0); // Format: screen.printString("Text", Number of Pixels 'in' (X-Position), Bank Number (Y-Position))
ll13jdb 0:e8ca5d36a1e7 120 screen.printString("Sensor-matic!", 5, 2); // Project Title
ll13jdb 0:e8ca5d36a1e7 121 screen.printString("By", 35, 4);
ll13jdb 0:e8ca5d36a1e7 122 screen.printString("Jack Berriman", 3, 5);
ll13jdb 0:e8ca5d36a1e7 123
ll13jdb 0:e8ca5d36a1e7 124 wait(2); // Delay (To Read Text)
ll13jdb 0:e8ca5d36a1e7 125
ll13jdb 0:e8ca5d36a1e7 126 }
ll13jdb 0:e8ca5d36a1e7 127
ll13jdb 0:e8ca5d36a1e7 128
ll13jdb 0:e8ca5d36a1e7 129 // ------------------------- STRUCTS ------------------------- //
ll13jdb 0:e8ca5d36a1e7 130
ll13jdb 0:e8ca5d36a1e7 131 AverageValues getAverageValues() // Struct for Calculating Average Values of Distance and Temperature
ll13jdb 0:e8ca5d36a1e7 132 {
ll13jdb 0:e8ca5d36a1e7 133 AverageValues values; // Access Struct
ll13jdb 0:e8ca5d36a1e7 134 int temporaryDistanceSum = 0;
ll13jdb 0:e8ca5d36a1e7 135 int temporaryTemperatureSum = 0; // Initialise Temporary 'Sum' Variables Equal to Zero
ll13jdb 0:e8ca5d36a1e7 136
ll13jdb 0:e8ca5d36a1e7 137 for (int i = 0; i <= 10; i++) { // Loop Through 10 Samples
ll13jdb 0:e8ca5d36a1e7 138
ll13jdb 0:e8ca5d36a1e7 139 int distanceRead = srf02.getDistanceCm(); // Each Iteration: Get Distance and Write to Variable 'distanceRead'
ll13jdb 0:e8ca5d36a1e7 140 temporaryDistanceSum += distanceRead; // Add to Sum
ll13jdb 0:e8ca5d36a1e7 141
ll13jdb 0:e8ca5d36a1e7 142 int temperatureRead = tmp102.get_temperature(); // Each Iteration: Get Temperature and Write to Variable 'distanceRead'
ll13jdb 0:e8ca5d36a1e7 143 temporaryTemperatureSum += temperatureRead; // Add to Sum
ll13jdb 0:e8ca5d36a1e7 144 }
ll13jdb 0:e8ca5d36a1e7 145
ll13jdb 0:e8ca5d36a1e7 146 values.averageDistance = temporaryDistanceSum/10; // Divide by Number of Samples (10)
ll13jdb 0:e8ca5d36a1e7 147 values.averageTemperature = temporaryTemperatureSum/10;
ll13jdb 0:e8ca5d36a1e7 148
ll13jdb 0:e8ca5d36a1e7 149 return values; // Return 'values' to Struct
ll13jdb 0:e8ca5d36a1e7 150 }
ll13jdb 0:e8ca5d36a1e7 151
ll13jdb 0:e8ca5d36a1e7 152
ll13jdb 0:e8ca5d36a1e7 153 // ------------------------- CURSOR POSITION (POTENTIOMETER) FUNCTIONS ------------------------- //
ll13jdb 0:e8ca5d36a1e7 154
ll13jdb 0:e8ca5d36a1e7 155 int getCursorPosition() // Read Potentiometer Value & Convert to Bank Value
ll13jdb 0:e8ca5d36a1e7 156 {
ll13jdb 0:e8ca5d36a1e7 157 int bank = floor(controller * 5) + 1; // Read Potentioementer & Multiply by 5
ll13jdb 0:e8ca5d36a1e7 158 // 'Floor' = Rounds Down
ll13jdb 0:e8ca5d36a1e7 159
ll13jdb 0:e8ca5d36a1e7 160 if (bank == 6) { // If Bank value us greater that 5...
ll13jdb 0:e8ca5d36a1e7 161 bank = 5; // A value of 5 is returned
ll13jdb 0:e8ca5d36a1e7 162 }
ll13jdb 0:e8ca5d36a1e7 163
ll13jdb 0:e8ca5d36a1e7 164 return bank; // Return Bank Value
ll13jdb 0:e8ca5d36a1e7 165 }
ll13jdb 0:e8ca5d36a1e7 166
ll13jdb 0:e8ca5d36a1e7 167
ll13jdb 0:e8ca5d36a1e7 168 void printCursorPositionMain(int cursor) // Print Cursor as Rectangle Next to Option in Main/Sensor Menu (Used with 'getCursorPosition')
ll13jdb 0:e8ca5d36a1e7 169 {
ll13jdb 0:e8ca5d36a1e7 170 // Prevents Cursor Position From Being Unselectable
ll13jdb 0:e8ca5d36a1e7 171 if (cursor != 1 && cursor != 3 && cursor != 5) { // If Cursor in Banks 2 or 4 - Print Rectangle
ll13jdb 0:e8ca5d36a1e7 172
ll13jdb 0:e8ca5d36a1e7 173 y_axis_rect_main = (cursor * 8) + 3; // Multiply Cursor by 8 to Return Y-Position & Add 3 to Align in Bank
ll13jdb 0:e8ca5d36a1e7 174
ll13jdb 0:e8ca5d36a1e7 175 screen.drawRect(75,y_axis_rect_main,2,2,0); // Print Rectangle (Depending on Potentiometer/Cursor)
ll13jdb 0:e8ca5d36a1e7 176 } else {
ll13jdb 0:e8ca5d36a1e7 177 screen.drawRect(75,y_axis_rect_main,2,2,0); // If Bank is 1, 3 or 5 - Still Print Rectangle
ll13jdb 0:e8ca5d36a1e7 178 }
ll13jdb 0:e8ca5d36a1e7 179 }
ll13jdb 0:e8ca5d36a1e7 180
ll13jdb 0:e8ca5d36a1e7 181
ll13jdb 0:e8ca5d36a1e7 182 void printCursorPositionOptions(int cursor, int stateOfLED, int stateOfSound) // Print Cursor as Rectangle Next to Option in Options Menu (Used with 'getCursorPosition')
ll13jdb 0:e8ca5d36a1e7 183 {
ll13jdb 0:e8ca5d36a1e7 184 // stateOfLed & stateOfSound Return 1 or 0
ll13jdb 0:e8ca5d36a1e7 185 // 1 or 0 Passed into 'drawRect' - Fills or Unfills Rectangle
ll13jdb 0:e8ca5d36a1e7 186
ll13jdb 0:e8ca5d36a1e7 187 y_axis_rect_options = (cursor * 8) + 3; // Multiply Cursor by 8 to Return Y-Position & Add 3 to Align in Bank
ll13jdb 0:e8ca5d36a1e7 188 cursor == 1 ? screen.drawRect(81,y_axis_rect_options,2,2,stateOfLED):screen.drawRect(81,y_axis_rect_options,2,2,stateOfSound);
ll13jdb 0:e8ca5d36a1e7 189 // If Cursor is 1 = Draw Rectangle OR If Cursor is 3 = Draw Rectangle
ll13jdb 0:e8ca5d36a1e7 190 }
ll13jdb 0:e8ca5d36a1e7 191
ll13jdb 0:e8ca5d36a1e7 192
ll13jdb 0:e8ca5d36a1e7 193 // ------------------------- MENU FUNCTIONS (MAIN/SENSORS/OPTIONS ------------------------- //
ll13jdb 0:e8ca5d36a1e7 194
ll13jdb 0:e8ca5d36a1e7 195 void mainMenu() // Function for Main Menu
ll13jdb 0:e8ca5d36a1e7 196 {
ll13jdb 0:e8ca5d36a1e7 197 y_axis_rect_main = 19; // Set Initial Y-Position to 19th Pixel
ll13jdb 0:e8ca5d36a1e7 198
ll13jdb 0:e8ca5d36a1e7 199 while (screenNumber == 0) { // While Main Menu Screen On...
ll13jdb 0:e8ca5d36a1e7 200
ll13jdb 0:e8ca5d36a1e7 201 int cursor = getCursorPosition(); // Read Position of Cursor
ll13jdb 0:e8ca5d36a1e7 202
ll13jdb 0:e8ca5d36a1e7 203 if (g_system_flag) {
ll13jdb 0:e8ca5d36a1e7 204 g_system_flag = 0; // Reset System Flag to 0
ll13jdb 0:e8ca5d36a1e7 205
ll13jdb 0:e8ca5d36a1e7 206 clearAll(); // Clears Previous Text String (Welcome Screen)
ll13jdb 0:e8ca5d36a1e7 207
ll13jdb 0:e8ca5d36a1e7 208 screen.printString("MAIN MENU", 16, 0); // Print String 'Main Menu'
ll13jdb 0:e8ca5d36a1e7 209 screen.drawLine(5,11,79,11,1); // Draw Line Above Sensors String
ll13jdb 0:e8ca5d36a1e7 210 screen.printString("Sensors", 3, 2); // Print String 'Sensors'
ll13jdb 0:e8ca5d36a1e7 211 screen.printString("Options", 3, 4); // Print String 'Options'
ll13jdb 0:e8ca5d36a1e7 212 screen.drawLine(5,44,79,44,1); // Draw Line Underneath Options String
ll13jdb 0:e8ca5d36a1e7 213
ll13jdb 0:e8ca5d36a1e7 214 // Used to Ensure Cursor is Set in Bank
ll13jdb 0:e8ca5d36a1e7 215 if (cursor <= 2) { // If Position of Cursor is 2 or Less
ll13jdb 0:e8ca5d36a1e7 216 cursor = 2; // Set Cursor to Equal 2
ll13jdb 0:e8ca5d36a1e7 217 }
ll13jdb 0:e8ca5d36a1e7 218 if (cursor >= 3) { // If Position of Cursor is 3 or Greater
ll13jdb 0:e8ca5d36a1e7 219 cursor = 4; // Set Cursor to Equal 4
ll13jdb 0:e8ca5d36a1e7 220 }
ll13jdb 0:e8ca5d36a1e7 221
ll13jdb 0:e8ca5d36a1e7 222 printCursorPositionMain(cursor); // Print Cursor to Screen
ll13jdb 0:e8ca5d36a1e7 223 pc.printf("Controller = %d \n",cursor); // Debug in 'CoolTerm.exe'
ll13jdb 0:e8ca5d36a1e7 224
ll13jdb 0:e8ca5d36a1e7 225 // Check Flag IF 'forward' Button Interrupt Pressed
ll13jdb 0:e8ca5d36a1e7 226 if (g_forward_flag == 1) {
ll13jdb 0:e8ca5d36a1e7 227 g_forward_flag = 0; // Clear Flag
ll13jdb 0:e8ca5d36a1e7 228
ll13jdb 0:e8ca5d36a1e7 229 // Determine Next Screen
ll13jdb 0:e8ca5d36a1e7 230 if (cursor == 2) {
ll13jdb 0:e8ca5d36a1e7 231 screenNumber = 1; // Go to Sensor Menu
ll13jdb 0:e8ca5d36a1e7 232 }
ll13jdb 0:e8ca5d36a1e7 233 if (cursor == 4) {
ll13jdb 0:e8ca5d36a1e7 234 screenNumber = 2; // Go to Options Menu
ll13jdb 0:e8ca5d36a1e7 235 }
ll13jdb 0:e8ca5d36a1e7 236 }
ll13jdb 0:e8ca5d36a1e7 237 }
ll13jdb 0:e8ca5d36a1e7 238 returnToMenu(); // Back Button Function
ll13jdb 0:e8ca5d36a1e7 239 screen.refresh(); // Refresh Screen
ll13jdb 0:e8ca5d36a1e7 240 }
ll13jdb 0:e8ca5d36a1e7 241 }
ll13jdb 0:e8ca5d36a1e7 242
ll13jdb 0:e8ca5d36a1e7 243 void sensorMenu() // Function for Sensor Menu
ll13jdb 0:e8ca5d36a1e7 244 {
ll13jdb 0:e8ca5d36a1e7 245 while (screenNumber == 1) { // While Sensor Menu is On...
ll13jdb 0:e8ca5d36a1e7 246
ll13jdb 0:e8ca5d36a1e7 247 int cursor = getCursorPosition(); // Read Position of Cursor
ll13jdb 0:e8ca5d36a1e7 248
ll13jdb 0:e8ca5d36a1e7 249 if (g_system_flag) {
ll13jdb 0:e8ca5d36a1e7 250 g_system_flag = 0; // Reset System Flag to 0
ll13jdb 0:e8ca5d36a1e7 251
ll13jdb 0:e8ca5d36a1e7 252 clearAll(); // Clears Previous Text String (Main Menu Screen)
ll13jdb 0:e8ca5d36a1e7 253
ll13jdb 0:e8ca5d36a1e7 254 screen.printString("SENSOR MENU", 10, 0); // Prints String 'SensorMenu'
ll13jdb 0:e8ca5d36a1e7 255 screen.drawLine(5,11,79,11,1); // Draw Line Above Dist Sensor
ll13jdb 0:e8ca5d36a1e7 256 screen.printString("Dist Sensor", 3, 2); // Prints String 'Dist Sensor'
ll13jdb 0:e8ca5d36a1e7 257 screen.printString("Temp Sensor", 3, 4); // Prints String 'Temper Sensor'
ll13jdb 0:e8ca5d36a1e7 258 screen.drawLine(5,44,79,44,1); // Draw Line Below Temp Sensor
ll13jdb 0:e8ca5d36a1e7 259
ll13jdb 0:e8ca5d36a1e7 260 // Used to Ensure Cursor is Set in Bank
ll13jdb 0:e8ca5d36a1e7 261 if (cursor <= 2) { // If Position of Cursor is 2 or Less
ll13jdb 0:e8ca5d36a1e7 262 cursor = 2; // Set Cursor to Equal 2
ll13jdb 0:e8ca5d36a1e7 263 }
ll13jdb 0:e8ca5d36a1e7 264 if (cursor >= 3) { // If Position of Cursor is 3 or Greater
ll13jdb 0:e8ca5d36a1e7 265 cursor = 4; // Set Cursor to Equal 4
ll13jdb 0:e8ca5d36a1e7 266 }
ll13jdb 0:e8ca5d36a1e7 267
ll13jdb 0:e8ca5d36a1e7 268 printCursorPositionMain(cursor); // Print Cursor to Screen
ll13jdb 0:e8ca5d36a1e7 269 pc.printf("Controller = %d \n",cursor); // Debug in 'CoolTerm.exe'
ll13jdb 0:e8ca5d36a1e7 270
ll13jdb 0:e8ca5d36a1e7 271 // Check Flag IF 'forward' Button Interrupt Pressed
ll13jdb 0:e8ca5d36a1e7 272 if (g_forward_flag == 1) {
ll13jdb 0:e8ca5d36a1e7 273 g_forward_flag = 0; // Clear Flag
ll13jdb 0:e8ca5d36a1e7 274
ll13jdb 0:e8ca5d36a1e7 275 // Determine Next Screen
ll13jdb 0:e8ca5d36a1e7 276 if (cursor == 2) {
ll13jdb 0:e8ca5d36a1e7 277 screenNumber = 3; // Go to Distance Display
ll13jdb 0:e8ca5d36a1e7 278 }
ll13jdb 0:e8ca5d36a1e7 279 if (cursor == 4) {
ll13jdb 0:e8ca5d36a1e7 280 screenNumber = 4; // Go to Temperature Display
ll13jdb 0:e8ca5d36a1e7 281 }
ll13jdb 0:e8ca5d36a1e7 282 }
ll13jdb 0:e8ca5d36a1e7 283 }
ll13jdb 0:e8ca5d36a1e7 284 returnToMenu(); // Back Button Function
ll13jdb 0:e8ca5d36a1e7 285 screen.refresh(); // Refresh Screen
ll13jdb 0:e8ca5d36a1e7 286 }
ll13jdb 0:e8ca5d36a1e7 287 }
ll13jdb 0:e8ca5d36a1e7 288
ll13jdb 0:e8ca5d36a1e7 289 void optionsMenu() // Function for Options Menu
ll13jdb 0:e8ca5d36a1e7 290 {
ll13jdb 0:e8ca5d36a1e7 291 y_axis_rect_options = 27; // Set Initial Y-Position to 27th Pixel
ll13jdb 0:e8ca5d36a1e7 292
ll13jdb 0:e8ca5d36a1e7 293 while (screenNumber == 2) { // While Options Menu is On...
ll13jdb 0:e8ca5d36a1e7 294
ll13jdb 0:e8ca5d36a1e7 295 int cursor = getCursorPosition(); // Read Position of Cursor
ll13jdb 0:e8ca5d36a1e7 296
ll13jdb 0:e8ca5d36a1e7 297 if (g_system_flag) {
ll13jdb 0:e8ca5d36a1e7 298 g_system_flag = 0; // Reset System Flag to 0
ll13jdb 0:e8ca5d36a1e7 299
ll13jdb 0:e8ca5d36a1e7 300 clearAll(); // Clears Previous Text String (Main Menu Screen)
ll13jdb 0:e8ca5d36a1e7 301
ll13jdb 0:e8ca5d36a1e7 302 screen.printString("Toggle LEDs", 1, 1); // Print String 'Toggle LEDs'
ll13jdb 0:e8ca5d36a1e7 303 screen.printString("Toggle Sound", 1, 3); // Print String 'Toggle Sound'
ll13jdb 0:e8ca5d36a1e7 304 screen.printString("Toggle Colour", 1, 5); // Print String 'Toggle Colour'
ll13jdb 0:e8ca5d36a1e7 305
ll13jdb 0:e8ca5d36a1e7 306 // Used to Ensure Cursor is Set in Bank
ll13jdb 0:e8ca5d36a1e7 307 if (cursor <= 2) { // If Position of Cursor is 2 or Less
ll13jdb 0:e8ca5d36a1e7 308 cursor = 1; // Set Cursor to Equal 1
ll13jdb 0:e8ca5d36a1e7 309 }
ll13jdb 0:e8ca5d36a1e7 310 if (cursor > 2 && cursor <= 4) { // If Position of Cursor is Between 2 or 4
ll13jdb 0:e8ca5d36a1e7 311 cursor = 3; // Set Cursor to Equal 3
ll13jdb 0:e8ca5d36a1e7 312 }
ll13jdb 0:e8ca5d36a1e7 313 if (cursor > 4) { // If Position of Cursor is Greater than 4
ll13jdb 0:e8ca5d36a1e7 314 cursor = 5; // Set Cursor to Equal 5
ll13jdb 0:e8ca5d36a1e7 315 }
ll13jdb 0:e8ca5d36a1e7 316
ll13jdb 0:e8ca5d36a1e7 317 if (triggerLEDs == 1) { // Read Trigger of LED
ll13jdb 0:e8ca5d36a1e7 318 allLEDOn(); // If Trigger = 1, Turn ON LEDs
ll13jdb 0:e8ca5d36a1e7 319 }
ll13jdb 0:e8ca5d36a1e7 320
ll13jdb 0:e8ca5d36a1e7 321 printCursorPositionOptions(cursor, stateOfLED, stateOfSound); // Print Position of Cursor
ll13jdb 0:e8ca5d36a1e7 322
ll13jdb 0:e8ca5d36a1e7 323 // Check Flag IF 'forward' Button Interrupt Pressed
ll13jdb 0:e8ca5d36a1e7 324 if (g_forward_flag == 1) {
ll13jdb 0:e8ca5d36a1e7 325 g_forward_flag = 0; // Clear Flag
ll13jdb 0:e8ca5d36a1e7 326
ll13jdb 0:e8ca5d36a1e7 327 // Determine Options to Edit
ll13jdb 0:e8ca5d36a1e7 328 if (cursor == 1) {
ll13jdb 0:e8ca5d36a1e7 329 stateOfLED = toggleLEDs(); // Toggle LEDs & Write 1 or 0 to 'stateOfLED'
ll13jdb 0:e8ca5d36a1e7 330 }
ll13jdb 0:e8ca5d36a1e7 331 if (cursor == 3) {
ll13jdb 0:e8ca5d36a1e7 332 stateOfSound = toggleSound(); // Toggle Sound & Write 1 or 0 to 'stateOfLED'
ll13jdb 0:e8ca5d36a1e7 333 }
ll13jdb 0:e8ca5d36a1e7 334 if (cursor == 5) {
ll13jdb 0:e8ca5d36a1e7 335 toggleColour(); // Toggle Colour
ll13jdb 0:e8ca5d36a1e7 336 }
ll13jdb 0:e8ca5d36a1e7 337 }
ll13jdb 0:e8ca5d36a1e7 338 }
ll13jdb 0:e8ca5d36a1e7 339 returnToMenu(); // Back Button Function
ll13jdb 0:e8ca5d36a1e7 340 screen.refresh(); // Refresh Screen
ll13jdb 0:e8ca5d36a1e7 341 }
ll13jdb 0:e8ca5d36a1e7 342 }
ll13jdb 0:e8ca5d36a1e7 343
ll13jdb 0:e8ca5d36a1e7 344 void distanceDisplay() // Function to Display Distance
ll13jdb 0:e8ca5d36a1e7 345 {
ll13jdb 0:e8ca5d36a1e7 346 AverageValues values; // Call Struct For Average Values
ll13jdb 0:e8ca5d36a1e7 347
ll13jdb 0:e8ca5d36a1e7 348 while(screenNumber == 3) { // While Temperature Display is On...
ll13jdb 0:e8ca5d36a1e7 349
ll13jdb 0:e8ca5d36a1e7 350 values = getAverageValues();
ll13jdb 0:e8ca5d36a1e7 351 int Distance = values.averageDistance; // Access Struct Value
ll13jdb 0:e8ca5d36a1e7 352
ll13jdb 0:e8ca5d36a1e7 353 if (g_system_flag) {
ll13jdb 0:e8ca5d36a1e7 354 g_system_flag = 0; // Reset System Flag to 0
ll13jdb 0:e8ca5d36a1e7 355
ll13jdb 0:e8ca5d36a1e7 356 clearAll();
ll13jdb 0:e8ca5d36a1e7 357
ll13jdb 0:e8ca5d36a1e7 358 if (triggerLEDs == 1) {
ll13jdb 0:e8ca5d36a1e7 359 LEDs_Distance(Distance); // Call Distance LED Function
ll13jdb 0:e8ca5d36a1e7 360 }
ll13jdb 0:e8ca5d36a1e7 361
ll13jdb 0:e8ca5d36a1e7 362 char buffer[14]; // Each Character = 6 pixels wide & Screen = 84 pixels (84/6 = 14)
ll13jdb 0:e8ca5d36a1e7 363 int length = sprintf(buffer,"Dist = %d CM",Distance); // Print Distance Value to Buffer
ll13jdb 0:e8ca5d36a1e7 364 pc.printf("DistAv = %f \n DistNorm = %f \n", Distance, srf02.getDistanceCm()); // Debug in 'CoolTerm.exe'
ll13jdb 0:e8ca5d36a1e7 365
ll13jdb 0:e8ca5d36a1e7 366 if (length <= 14) // If String Fits on Display
ll13jdb 0:e8ca5d36a1e7 367 screen.printString(buffer,3,2); // Display on Screen
ll13jdb 0:e8ca5d36a1e7 368
ll13jdb 0:e8ca5d36a1e7 369 if (Distance <= 14 || Distance >= 250) { // If Sensor is Out of Range
ll13jdb 0:e8ca5d36a1e7 370 clearAll(); // Clear Buffer
ll13jdb 0:e8ca5d36a1e7 371 screen.drawLine(4,2,80,2,2); // Draw Dotted Line Above Text
ll13jdb 0:e8ca5d36a1e7 372 screen.printString("DISTANCE OUT", 6, 1);
ll13jdb 0:e8ca5d36a1e7 373 screen.printString("OF RANGE", 18, 2);
ll13jdb 0:e8ca5d36a1e7 374 screen.drawLine(4,27,80,27,2); // Draw Dotted Line Below Text
ll13jdb 0:e8ca5d36a1e7 375 screen.printString("MIN = 15 CM", 10, 4);
ll13jdb 0:e8ca5d36a1e7 376 screen.printString("MAX = 250 CM", 7, 5);
ll13jdb 0:e8ca5d36a1e7 377
ll13jdb 0:e8ca5d36a1e7 378 if (triggerSound == 1) { // Play Continuous Buzz When Out of Range
ll13jdb 0:e8ca5d36a1e7 379 buzzerOn();
ll13jdb 0:e8ca5d36a1e7 380 }
ll13jdb 0:e8ca5d36a1e7 381 } else { // If Sensor is In Range
ll13jdb 0:e8ca5d36a1e7 382
ll13jdb 0:e8ca5d36a1e7 383 screen.printString("DIST SENSOR", 10, 0); // Print String 'Distance Sensor' (Title)
ll13jdb 0:e8ca5d36a1e7 384
ll13jdb 0:e8ca5d36a1e7 385 screen.drawRect(5,26,74,12,0); // Draw Rectangle Outline
ll13jdb 0:e8ca5d36a1e7 386 int fillLength = floor(PIXEL_PER_CM * Distance); // Update Fill Length Depending on Distance Value
ll13jdb 0:e8ca5d36a1e7 387
ll13jdb 0:e8ca5d36a1e7 388 screen.drawRect(6,27,fillLength,11,1); // Fill the Distance Bar (Left to Right)
ll13jdb 0:e8ca5d36a1e7 389
ll13jdb 0:e8ca5d36a1e7 390 screen.drawRect(17,26,2,12,0); // Puts in Dividers at 50 cm Intervals
ll13jdb 0:e8ca5d36a1e7 391 screen.drawRect(33,26,2,12,0);
ll13jdb 0:e8ca5d36a1e7 392 screen.drawRect(48,26,2,12,0);
ll13jdb 0:e8ca5d36a1e7 393 screen.drawRect(63,26,2,12,0);
ll13jdb 0:e8ca5d36a1e7 394
ll13jdb 0:e8ca5d36a1e7 395 screen.printString("15",0,5); // Prints Lower Bound Marker (15 cm)
ll13jdb 0:e8ca5d36a1e7 396 screen.printString("250",67,5); // Prints Upper Bound Marker (250 cm)
ll13jdb 0:e8ca5d36a1e7 397
ll13jdb 0:e8ca5d36a1e7 398 if (Distance <= 50) {
ll13jdb 0:e8ca5d36a1e7 399 if (triggerSound == 1) { // Check Trigger Value of Buzzer
ll13jdb 0:e8ca5d36a1e7 400 buzzerClose(); // Play Highly Freuquent Buzz
ll13jdb 0:e8ca5d36a1e7 401 }
ll13jdb 0:e8ca5d36a1e7 402 } else if (Distance <= 100) {
ll13jdb 0:e8ca5d36a1e7 403 if (triggerSound == 1) { // Check Trigger Value of Buzzer
ll13jdb 0:e8ca5d36a1e7 404 buzzerNormal(); // Play Moderately Freuquent Buzz
ll13jdb 0:e8ca5d36a1e7 405 }
ll13jdb 0:e8ca5d36a1e7 406 } else if (Distance <= 200) {
ll13jdb 0:e8ca5d36a1e7 407 if (triggerSound == 1) { // Check Trigger Value of Buzzer
ll13jdb 0:e8ca5d36a1e7 408 buzzerFar(); // Play Lowly Freuquent Buzz
ll13jdb 0:e8ca5d36a1e7 409 }
ll13jdb 0:e8ca5d36a1e7 410 }
ll13jdb 0:e8ca5d36a1e7 411 }
ll13jdb 0:e8ca5d36a1e7 412
ll13jdb 0:e8ca5d36a1e7 413
ll13jdb 0:e8ca5d36a1e7 414 returnToMenu(); // Function for Back Button
ll13jdb 0:e8ca5d36a1e7 415 screen.refresh(); // Refreshes Screen
ll13jdb 0:e8ca5d36a1e7 416 }
ll13jdb 0:e8ca5d36a1e7 417 }
ll13jdb 0:e8ca5d36a1e7 418 }
ll13jdb 0:e8ca5d36a1e7 419
ll13jdb 0:e8ca5d36a1e7 420 void temperatureDisplay() // Function to Display Temperature
ll13jdb 0:e8ca5d36a1e7 421 {
ll13jdb 0:e8ca5d36a1e7 422 AverageValues values; // Call Struct For Average Values
ll13jdb 0:e8ca5d36a1e7 423
ll13jdb 0:e8ca5d36a1e7 424 while(screenNumber == 4) { // While Temperature Display is On...
ll13jdb 0:e8ca5d36a1e7 425
ll13jdb 0:e8ca5d36a1e7 426 values = getAverageValues();
ll13jdb 0:e8ca5d36a1e7 427 int Temperature = values.averageTemperature; // Access Struct Value
ll13jdb 0:e8ca5d36a1e7 428
ll13jdb 0:e8ca5d36a1e7 429 if (g_system_flag) {
ll13jdb 0:e8ca5d36a1e7 430 g_system_flag = 0; // Reset System Flag to 0
ll13jdb 0:e8ca5d36a1e7 431
ll13jdb 0:e8ca5d36a1e7 432 clearAll(); // Clears Previous Text String (Sensor Menu Screen)
ll13jdb 0:e8ca5d36a1e7 433
ll13jdb 0:e8ca5d36a1e7 434 screen.printString("TEMP SENSOR", 10, 0); // Print String 'Temp Sensor' (Title)
ll13jdb 0:e8ca5d36a1e7 435
ll13jdb 0:e8ca5d36a1e7 436 LEDs_Temperature(Temperature); // Call Temperature LED Function
ll13jdb 0:e8ca5d36a1e7 437
ll13jdb 0:e8ca5d36a1e7 438 char buffer[14]; // Each Character = 6 pixels wide & Screen = 84 pixels (84/6 = 14)
ll13jdb 0:e8ca5d36a1e7 439 int length = sprintf(buffer,"Temp = %d -C",Temperature); // Print Temperature Value to Buffer
ll13jdb 0:e8ca5d36a1e7 440 pc.printf("TempAv = %f \n TempNorm = %f \n", Temperature, tmp102.get_temperature()); // Debug in 'CoolTerm.exe'
ll13jdb 0:e8ca5d36a1e7 441
ll13jdb 0:e8ca5d36a1e7 442 if (length <= 14) // If String Fits on Display
ll13jdb 0:e8ca5d36a1e7 443 screen.printString(buffer,6,2); // Display on Screen
ll13jdb 0:e8ca5d36a1e7 444
ll13jdb 0:e8ca5d36a1e7 445 screen.drawCircle(15,36,7,1); // Circular End of Thermometer
ll13jdb 0:e8ca5d36a1e7 446 screen.drawRect(22,32,6,8,1); // Start of Thermometer
ll13jdb 0:e8ca5d36a1e7 447 screen.drawRect(26,32,48,8,0); // Outline of the Thermometer
ll13jdb 0:e8ca5d36a1e7 448
ll13jdb 0:e8ca5d36a1e7 449 int fillLength = floor(PIXEL_PER_DEGREE * Temperature); // Update Fill Length Depending on Thermometer Value
ll13jdb 0:e8ca5d36a1e7 450
ll13jdb 0:e8ca5d36a1e7 451 screen.drawRect(27,33,fillLength,6,1); // Fill the Thermometer (Left to Right)
ll13jdb 0:e8ca5d36a1e7 452 screen.refresh(); // Refresh Screen
ll13jdb 0:e8ca5d36a1e7 453 }
ll13jdb 0:e8ca5d36a1e7 454 returnToMenu(); // Function for Back Button
ll13jdb 0:e8ca5d36a1e7 455 }
ll13jdb 0:e8ca5d36a1e7 456 }
ll13jdb 0:e8ca5d36a1e7 457
ll13jdb 0:e8ca5d36a1e7 458
ll13jdb 0:e8ca5d36a1e7 459 // ------------------------- OPTIONS MENU (TOGGLE) FUNCTIONS ------------------------- //
ll13jdb 0:e8ca5d36a1e7 460
ll13jdb 0:e8ca5d36a1e7 461 bool toggleLEDs() // Toggles LED (Enable/Disable)
ll13jdb 0:e8ca5d36a1e7 462 {
ll13jdb 0:e8ca5d36a1e7 463 if (triggerLEDs == 0) {
ll13jdb 0:e8ca5d36a1e7 464 allLEDOn(); // Turn ON LEDs (While on Options Screen)
ll13jdb 0:e8ca5d36a1e7 465 triggerLEDs = 1; // 'Flip' Trigger
ll13jdb 0:e8ca5d36a1e7 466 } else {
ll13jdb 0:e8ca5d36a1e7 467 allLEDOff(); // Turn OFF LEDs (While on Options Screen
ll13jdb 0:e8ca5d36a1e7 468 triggerLEDs = 0; // 'Flip' Trigger
ll13jdb 0:e8ca5d36a1e7 469 }
ll13jdb 0:e8ca5d36a1e7 470
ll13jdb 0:e8ca5d36a1e7 471 bool stateOfLED = triggerLEDs; // Set Trigger Value (1 or 0) into Bool
ll13jdb 0:e8ca5d36a1e7 472 return stateOfLED; // Return Bool (Used in Printing Rectangle)
ll13jdb 0:e8ca5d36a1e7 473 }
ll13jdb 0:e8ca5d36a1e7 474
ll13jdb 0:e8ca5d36a1e7 475
ll13jdb 0:e8ca5d36a1e7 476 bool toggleSound() // Toggles Sound (Enable/Disable)
ll13jdb 0:e8ca5d36a1e7 477 {
ll13jdb 0:e8ca5d36a1e7 478 if (triggerSound == 0) {
ll13jdb 0:e8ca5d36a1e7 479 piezo.write(0.5); // Play Bleep Noise
ll13jdb 0:e8ca5d36a1e7 480 wait(0.1);
ll13jdb 0:e8ca5d36a1e7 481 piezo.write(0.0);
ll13jdb 0:e8ca5d36a1e7 482 triggerSound = 1; // 'Flip' Trigger
ll13jdb 0:e8ca5d36a1e7 483 } else {
ll13jdb 0:e8ca5d36a1e7 484 triggerSound = 0; // 'Flip' Trigger
ll13jdb 0:e8ca5d36a1e7 485 }
ll13jdb 0:e8ca5d36a1e7 486
ll13jdb 0:e8ca5d36a1e7 487 bool stateOfSound = triggerSound; // Set Trigger Value (1 or 0) into Bool
ll13jdb 0:e8ca5d36a1e7 488 return stateOfSound; // Return Bool (Used in Printing Rectangle)
ll13jdb 0:e8ca5d36a1e7 489 }
ll13jdb 0:e8ca5d36a1e7 490
ll13jdb 0:e8ca5d36a1e7 491
ll13jdb 0:e8ca5d36a1e7 492 void toggleColour() // Toggles Colour (Black-on-White/White-on-Black)
ll13jdb 0:e8ca5d36a1e7 493 {
ll13jdb 0:e8ca5d36a1e7 494 if (triggerColour == 0) {
ll13jdb 0:e8ca5d36a1e7 495 screen.inverseMode(); // Set Colour to Inverse Mode (White-on-Black)
ll13jdb 0:e8ca5d36a1e7 496 triggerColour = 1; // 'Flip' Trigger
ll13jdb 0:e8ca5d36a1e7 497 } else {
ll13jdb 0:e8ca5d36a1e7 498 screen.normalMode(); // Set Colour to Normal Mode (Black-on-White)
ll13jdb 0:e8ca5d36a1e7 499 triggerColour = 0; // 'Flip' Trigger
ll13jdb 0:e8ca5d36a1e7 500 }
ll13jdb 0:e8ca5d36a1e7 501 }
ll13jdb 0:e8ca5d36a1e7 502
ll13jdb 0:e8ca5d36a1e7 503
ll13jdb 0:e8ca5d36a1e7 504 // ------------------------- LED & SOFT-PWM FUNCTIONS ------------------------- //
ll13jdb 0:e8ca5d36a1e7 505
ll13jdb 0:e8ca5d36a1e7 506 void allLEDOn() // Function to Turn ON All LEDs
ll13jdb 0:e8ca5d36a1e7 507 {
ll13jdb 0:e8ca5d36a1e7 508 red_led = 0;
ll13jdb 0:e8ca5d36a1e7 509 yellow_led = 0;
ll13jdb 0:e8ca5d36a1e7 510 green_led = 0;
ll13jdb 0:e8ca5d36a1e7 511 }
ll13jdb 0:e8ca5d36a1e7 512
ll13jdb 0:e8ca5d36a1e7 513
ll13jdb 0:e8ca5d36a1e7 514 void allLEDOff() // Function to Turn OFF All LEDs
ll13jdb 0:e8ca5d36a1e7 515 {
ll13jdb 0:e8ca5d36a1e7 516 red_led = 1;
ll13jdb 0:e8ca5d36a1e7 517 yellow_led = 1;
ll13jdb 0:e8ca5d36a1e7 518 green_led = 1;
ll13jdb 0:e8ca5d36a1e7 519 }
ll13jdb 0:e8ca5d36a1e7 520
ll13jdb 0:e8ca5d36a1e7 521
ll13jdb 0:e8ca5d36a1e7 522 void LEDs_Flashing()
ll13jdb 0:e8ca5d36a1e7 523 {
ll13jdb 0:e8ca5d36a1e7 524 redPWM = 0.5; // Turn ON Soft PWM LEDs
ll13jdb 0:e8ca5d36a1e7 525 yellowPWM = 0.5;
ll13jdb 0:e8ca5d36a1e7 526 greenPWM = 0.5;
ll13jdb 0:e8ca5d36a1e7 527
ll13jdb 0:e8ca5d36a1e7 528 redPWM.period(0.25); // Set Period = 0.25 seconds
ll13jdb 0:e8ca5d36a1e7 529 yellowPWM.period(0.25);
ll13jdb 0:e8ca5d36a1e7 530 greenPWM.period(0.25);
ll13jdb 0:e8ca5d36a1e7 531 }
ll13jdb 0:e8ca5d36a1e7 532
ll13jdb 0:e8ca5d36a1e7 533
ll13jdb 0:e8ca5d36a1e7 534 void cancel_LEDs_Flashing()
ll13jdb 0:e8ca5d36a1e7 535 {
ll13jdb 0:e8ca5d36a1e7 536 redPWM = 0; // Turn OFF Soft PWM LEDs
ll13jdb 0:e8ca5d36a1e7 537 yellowPWM = 0;
ll13jdb 0:e8ca5d36a1e7 538 greenPWM = 0;
ll13jdb 0:e8ca5d36a1e7 539
ll13jdb 0:e8ca5d36a1e7 540 redPWM.stop(); // Stop Soft PWM
ll13jdb 0:e8ca5d36a1e7 541 yellowPWM.stop();
ll13jdb 0:e8ca5d36a1e7 542 greenPWM.stop();
ll13jdb 0:e8ca5d36a1e7 543 }
ll13jdb 0:e8ca5d36a1e7 544
ll13jdb 0:e8ca5d36a1e7 545
ll13jdb 0:e8ca5d36a1e7 546 void LEDs_Distance(int d) // LEDs Illuminate (Depending on Distance)
ll13jdb 0:e8ca5d36a1e7 547 {
ll13jdb 0:e8ca5d36a1e7 548
ll13jdb 0:e8ca5d36a1e7 549 if (d < 15 || d > 250) { // All ON
ll13jdb 0:e8ca5d36a1e7 550 LEDs_Flashing(); // Enable Soft PWM Flashing LEDs
ll13jdb 0:e8ca5d36a1e7 551 } else if (d >= 15 && d < 50) { // Red ON
ll13jdb 0:e8ca5d36a1e7 552 cancel_LEDs_Flashing(); // Prevent Soft PWM Overwritting Digital LEDs
ll13jdb 0:e8ca5d36a1e7 553 red_led = 0;
ll13jdb 0:e8ca5d36a1e7 554 yellow_led = 1;
ll13jdb 0:e8ca5d36a1e7 555 green_led = 1;
ll13jdb 0:e8ca5d36a1e7 556 } else if (d >= 50 && d < 100) { // Red & Yellow ON
ll13jdb 0:e8ca5d36a1e7 557 cancel_LEDs_Flashing();
ll13jdb 0:e8ca5d36a1e7 558 red_led = 0;
ll13jdb 0:e8ca5d36a1e7 559 yellow_led = 0;
ll13jdb 0:e8ca5d36a1e7 560 green_led = 1;
ll13jdb 0:e8ca5d36a1e7 561 } else if (d >= 100 && d < 150) { // Yellow ON
ll13jdb 0:e8ca5d36a1e7 562 cancel_LEDs_Flashing();
ll13jdb 0:e8ca5d36a1e7 563 red_led = 1;
ll13jdb 0:e8ca5d36a1e7 564 yellow_led = 0;
ll13jdb 0:e8ca5d36a1e7 565 green_led = 1;
ll13jdb 0:e8ca5d36a1e7 566 } else if (d >= 150 && d < 200) { // Yellow & Green ON
ll13jdb 0:e8ca5d36a1e7 567 cancel_LEDs_Flashing();
ll13jdb 0:e8ca5d36a1e7 568 red_led = 1;
ll13jdb 0:e8ca5d36a1e7 569 yellow_led = 0;
ll13jdb 0:e8ca5d36a1e7 570 green_led = 0;
ll13jdb 0:e8ca5d36a1e7 571 } else if (d >= 200 && d < 250) { // Green ON
ll13jdb 0:e8ca5d36a1e7 572 cancel_LEDs_Flashing();
ll13jdb 0:e8ca5d36a1e7 573 red_led = 1;
ll13jdb 0:e8ca5d36a1e7 574 yellow_led = 1;
ll13jdb 0:e8ca5d36a1e7 575 green_led = 0;
ll13jdb 0:e8ca5d36a1e7 576 }
ll13jdb 0:e8ca5d36a1e7 577 }
ll13jdb 0:e8ca5d36a1e7 578
ll13jdb 0:e8ca5d36a1e7 579
ll13jdb 0:e8ca5d36a1e7 580 void LEDs_Temperature(int t) // LEDs Illuminate (Depending on Temperature)
ll13jdb 0:e8ca5d36a1e7 581 {
ll13jdb 0:e8ca5d36a1e7 582
ll13jdb 0:e8ca5d36a1e7 583 if (t < 10 || t >= 40) { // All ON
ll13jdb 0:e8ca5d36a1e7 584 allLEDOn();
ll13jdb 0:e8ca5d36a1e7 585 } else if (t >= 10 && t < 15) { // Red ON
ll13jdb 0:e8ca5d36a1e7 586 red_led = 0;
ll13jdb 0:e8ca5d36a1e7 587 yellow_led = 1;
ll13jdb 0:e8ca5d36a1e7 588 green_led = 1;
ll13jdb 0:e8ca5d36a1e7 589 } else if (t >= 15 && t < 20) { // Red & Yellow ON
ll13jdb 0:e8ca5d36a1e7 590 red_led = 0;
ll13jdb 0:e8ca5d36a1e7 591 yellow_led = 0;
ll13jdb 0:e8ca5d36a1e7 592 green_led = 1;
ll13jdb 0:e8ca5d36a1e7 593 } else if (t >= 20 && t < 25) { // Green ON
ll13jdb 0:e8ca5d36a1e7 594 red_led = 0;
ll13jdb 0:e8ca5d36a1e7 595 yellow_led = 0;
ll13jdb 0:e8ca5d36a1e7 596 green_led = 1;
ll13jdb 0:e8ca5d36a1e7 597 } else if (t >= 25 && t < 30) { // Red & Yellow ON
ll13jdb 0:e8ca5d36a1e7 598 red_led = 0;
ll13jdb 0:e8ca5d36a1e7 599 yellow_led = 0;
ll13jdb 0:e8ca5d36a1e7 600 green_led = 1;
ll13jdb 0:e8ca5d36a1e7 601 } else if (t >= 30 && t < 40) { // Red ON
ll13jdb 0:e8ca5d36a1e7 602 red_led = 0;
ll13jdb 0:e8ca5d36a1e7 603 yellow_led = 1;
ll13jdb 0:e8ca5d36a1e7 604 green_led = 1;
ll13jdb 0:e8ca5d36a1e7 605 }
ll13jdb 0:e8ca5d36a1e7 606 }
ll13jdb 0:e8ca5d36a1e7 607
ll13jdb 0:e8ca5d36a1e7 608
ll13jdb 0:e8ca5d36a1e7 609 // ------------------------- BUZZER FUNCTIONS ------------------------- //
ll13jdb 0:e8ca5d36a1e7 610
ll13jdb 0:e8ca5d36a1e7 611 void buzzerOn() // Buzz Continuously
ll13jdb 0:e8ca5d36a1e7 612 {
ll13jdb 0:e8ca5d36a1e7 613 piezo.write(0.5); // Set Duty Cycle - 50%
ll13jdb 0:e8ca5d36a1e7 614 wait_ms(10); // Wait 10 Milli-Seconds
ll13jdb 0:e8ca5d36a1e7 615 }
ll13jdb 0:e8ca5d36a1e7 616
ll13jdb 0:e8ca5d36a1e7 617
ll13jdb 0:e8ca5d36a1e7 618 void buzzerClose() // Buzz Every 0.1 Seconds
ll13jdb 0:e8ca5d36a1e7 619 {
ll13jdb 0:e8ca5d36a1e7 620 piezo.write(0.5);
ll13jdb 0:e8ca5d36a1e7 621 wait(0.1); // Wait 0.1 Seconds
ll13jdb 0:e8ca5d36a1e7 622 piezo.write(0.0);
ll13jdb 0:e8ca5d36a1e7 623 }
ll13jdb 0:e8ca5d36a1e7 624
ll13jdb 0:e8ca5d36a1e7 625
ll13jdb 0:e8ca5d36a1e7 626 void buzzerNormal() // Buzz Every 0.3 Seconds
ll13jdb 0:e8ca5d36a1e7 627 {
ll13jdb 0:e8ca5d36a1e7 628 piezo.write(0.5);
ll13jdb 0:e8ca5d36a1e7 629 wait(0.3);
ll13jdb 0:e8ca5d36a1e7 630 piezo.write(0.0);
ll13jdb 0:e8ca5d36a1e7 631 }
ll13jdb 0:e8ca5d36a1e7 632
ll13jdb 0:e8ca5d36a1e7 633
ll13jdb 0:e8ca5d36a1e7 634 void buzzerFar() // Buzz Every 0.5 Seconds
ll13jdb 0:e8ca5d36a1e7 635 {
ll13jdb 0:e8ca5d36a1e7 636 piezo.write(0.5);
ll13jdb 0:e8ca5d36a1e7 637 wait(0.5);
ll13jdb 0:e8ca5d36a1e7 638 piezo.write(0.0);
ll13jdb 0:e8ca5d36a1e7 639 }
ll13jdb 0:e8ca5d36a1e7 640
ll13jdb 0:e8ca5d36a1e7 641
ll13jdb 0:e8ca5d36a1e7 642 // ------------------------- ISR & INTERRUPT FUNCTIONS ------------------------- //
ll13jdb 0:e8ca5d36a1e7 643
ll13jdb 0:e8ca5d36a1e7 644 void returnToMenu() // Function for Returning to Main Menu (if 'backward' Button Pressed)
ll13jdb 0:e8ca5d36a1e7 645 {
ll13jdb 0:e8ca5d36a1e7 646 // Check Flag IF 'forward' Button Interrupt Pressed
ll13jdb 0:e8ca5d36a1e7 647 if (g_backward_flag) {
ll13jdb 0:e8ca5d36a1e7 648 g_backward_flag = 0; // Clear Flag
ll13jdb 0:e8ca5d36a1e7 649
ll13jdb 0:e8ca5d36a1e7 650 screenNumber = 0; // Go to Screen Number = 0 (Main Menu)
ll13jdb 0:e8ca5d36a1e7 651 cancel_LEDs_Flashing();
ll13jdb 0:e8ca5d36a1e7 652 allLEDOff(); // Turn OFF LEDs
ll13jdb 0:e8ca5d36a1e7 653 piezo.write(0.0); // Write 0% Duty Cycle to Piezo (Turn OFF)
ll13jdb 0:e8ca5d36a1e7 654 }
ll13jdb 0:e8ca5d36a1e7 655
ll13jdb 0:e8ca5d36a1e7 656 }
ll13jdb 0:e8ca5d36a1e7 657
ll13jdb 0:e8ca5d36a1e7 658
ll13jdb 0:e8ca5d36a1e7 659 void system_isr() // ISR For 'systemTicker'
ll13jdb 0:e8ca5d36a1e7 660 {
ll13jdb 0:e8ca5d36a1e7 661 g_system_flag = 1; // Set 'systemTicker' Flag
ll13jdb 0:e8ca5d36a1e7 662 }
ll13jdb 0:e8ca5d36a1e7 663
ll13jdb 0:e8ca5d36a1e7 664
ll13jdb 0:e8ca5d36a1e7 665 void forward_isr() // ISR For 'forward' Buttom
ll13jdb 0:e8ca5d36a1e7 666 {
ll13jdb 0:e8ca5d36a1e7 667 g_forward_flag = 1; // Set 'forward' Button Flag
ll13jdb 0:e8ca5d36a1e7 668 }
ll13jdb 0:e8ca5d36a1e7 669
ll13jdb 0:e8ca5d36a1e7 670
ll13jdb 0:e8ca5d36a1e7 671 void backward_isr() // ISR For 'backward' Button
ll13jdb 0:e8ca5d36a1e7 672 {
ll13jdb 0:e8ca5d36a1e7 673 g_backward_flag = 1; // Set 'backward' Button Flag
ll13jdb 0:e8ca5d36a1e7 674 }