Simple (basic) snake game

Dependencies:   N5110 mbed

Committer:
MsTee
Date:
Mon May 09 01:55:29 2016 +0000
Revision:
4:d1f0cf1ea11b
Parent:
3:79d3148204e1
Completed Doxygen Documentation;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MsTee 0:9eb93eff2469 1 /**
MsTee 0:9eb93eff2469 2 Thokozile M Tembo 200822004
MsTee 0:9eb93eff2469 3 @file main.cpp
MsTee 0:9eb93eff2469 4 @brief Snake Game
MsTee 0:9eb93eff2469 5
MsTee 0:9eb93eff2469 6 */
MsTee 0:9eb93eff2469 7 #include "main.h"
MsTee 0:9eb93eff2469 8
MsTee 0:9eb93eff2469 9 int main() {
MsTee 2:dbfe6019b558 10
MsTee 0:9eb93eff2469 11 lcd.init(); // Initialise LCD
MsTee 2:dbfe6019b558 12 // Set brightness accordingly to the potentiometer
MsTee 2:dbfe6019b558 13 lcd.setBrightness(pot.read());
MsTee 0:9eb93eff2469 14 init_K64F(); // Initialise connection with buttons
MsTee 0:9eb93eff2469 15 welcomeScreen(); // Display welcome screen
MsTee 0:9eb93eff2469 16 calibrateJoystick(); // Calibrate the joystick
MsTee 0:9eb93eff2469 17
MsTee 0:9eb93eff2469 18 // Read joystick values every 20 ms (50 Hz)
MsTee 3:79d3148204e1 19 joystick_update_ticker.attach(&updateJoystick, 0.02);
MsTee 1:ab8ceac59e71 20 // Read potentiometer value every 300 ms
MsTee 1:ab8ceac59e71 21 brightness_update_ticker.attach(&updateBrightness, 0.3);
MsTee 0:9eb93eff2469 22
MsTee 0:9eb93eff2469 23 // Initialising random number generator
MsTee 0:9eb93eff2469 24 srand(time(NULL));
MsTee 0:9eb93eff2469 25
MsTee 1:ab8ceac59e71 26 snakeGame();
MsTee 0:9eb93eff2469 27 }
MsTee 0:9eb93eff2469 28
MsTee 0:9eb93eff2469 29 void init_K64F() {
MsTee 0:9eb93eff2469 30 // Configure serial comms
MsTee 0:9eb93eff2469 31 pc.baud(115200);
MsTee 0:9eb93eff2469 32 // Call pcb_button_isr function
MsTee 0:9eb93eff2469 33 pcb_button.rise(&pcb_button_isr);
MsTee 0:9eb93eff2469 34 pcb_button.mode(PullDown); // use PullDown
MsTee 0:9eb93eff2469 35 }
MsTee 0:9eb93eff2469 36
MsTee 0:9eb93eff2469 37 void welcomeScreen() {
MsTee 0:9eb93eff2469 38 lcd.printString("Welcome to" ,15,0); //inserts text for welcome on the first line hence the '1'
MsTee 0:9eb93eff2469 39 lcd.printString("Snake Game",15,1); // prints the text in the brackets on the secondline hence '2'
MsTee 0:9eb93eff2469 40 lcd.printString("Thokozile",0,3); //prints text in the third line
MsTee 0:9eb93eff2469 41 lcd.printString("Tembo",0,4); // prints name in fifth line
MsTee 0:9eb93eff2469 42 lcd.printString("200822004",0,5); // prints name in fifth line
MsTee 0:9eb93eff2469 43 wait(2); // waits for 2 seconds
MsTee 0:9eb93eff2469 44 lcd.clear();
MsTee 0:9eb93eff2469 45 lcd.refresh(); // resets the screen
MsTee 0:9eb93eff2469 46 }
MsTee 0:9eb93eff2469 47 void calibrateJoystick() {
MsTee 0:9eb93eff2469 48 // must not move during calibration
MsTee 0:9eb93eff2469 49 joystick.x0 = joy_x; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
MsTee 0:9eb93eff2469 50 joystick.y0 = joy_y;
MsTee 0:9eb93eff2469 51 }
MsTee 0:9eb93eff2469 52
MsTee 0:9eb93eff2469 53 void updateJoystick() {
MsTee 0:9eb93eff2469 54 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
MsTee 0:9eb93eff2469 55 joystick.x = joy_x - joystick.x0;
MsTee 0:9eb93eff2469 56 joystick.y = joy_y - joystick.y0;
MsTee 0:9eb93eff2469 57 joystick.button = joy_button; // read button state
MsTee 0:9eb93eff2469 58
MsTee 0:9eb93eff2469 59 // calculate direction depending on x,y values
MsTee 0:9eb93eff2469 60 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
MsTee 0:9eb93eff2469 61 if (fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
MsTee 0:9eb93eff2469 62 joystick.direction = CENTRE;
MsTee 0:9eb93eff2469 63 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
MsTee 0:9eb93eff2469 64 joystick.direction = UP;
MsTee 0:9eb93eff2469 65 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
MsTee 0:9eb93eff2469 66 joystick.direction = DOWN;
MsTee 0:9eb93eff2469 67 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
MsTee 0:9eb93eff2469 68 joystick.direction = LEFT;
MsTee 0:9eb93eff2469 69 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
MsTee 0:9eb93eff2469 70 joystick.direction = RIGHT;
MsTee 0:9eb93eff2469 71 } else {
MsTee 0:9eb93eff2469 72 joystick.direction = UNKNOWN;
MsTee 0:9eb93eff2469 73 }
MsTee 0:9eb93eff2469 74 }
MsTee 0:9eb93eff2469 75
MsTee 0:9eb93eff2469 76 /* Snake Game Logic */
MsTee 0:9eb93eff2469 77
MsTee 1:ab8ceac59e71 78 void snakeGame() {
MsTee 0:9eb93eff2469 79
MsTee 0:9eb93eff2469 80 // Game Variables
MsTee 3:79d3148204e1 81 int snake_x[220]; // This is the array of pixels that refers to the snake parts, horizontally for X values
MsTee 3:79d3148204e1 82 int snake_y[220]; // This is the array of pixels that refers to the snake parts, vertically for Y values
MsTee 0:9eb93eff2469 83
MsTee 3:79d3148204e1 84 AppleType apple; // The function responsible for Creating the food
MsTee 0:9eb93eff2469 85
MsTee 1:ab8ceac59e71 86 // Game Variables
MsTee 3:79d3148204e1 87 int snake_size; // variable for snake length
MsTee 3:79d3148204e1 88 int x_direction; //variable for snake X direction
MsTee 3:79d3148204e1 89 int y_direction; // vairable for snake Y direction
MsTee 3:79d3148204e1 90 int next_x; // the next X varaible to be occupied by snake
MsTee 3:79d3148204e1 91 int next_y; // the next X varaible to be occupied by snake
MsTee 3:79d3148204e1 92 int score; //Stores the value of score based on how many fruits have been eaten by snake
MsTee 3:79d3148204e1 93 int snake_speed; // the rate at which the snake moves
MsTee 0:9eb93eff2469 94
MsTee 0:9eb93eff2469 95 while(1) {
MsTee 3:79d3148204e1 96 switch(game_state) { // initial state consturcts game environment snake, border food etc
MsTee 0:9eb93eff2469 97 case INIT:
MsTee 3:79d3148204e1 98 x_direction = 0; // set initially to 0
MsTee 0:9eb93eff2469 99 y_direction = 0;
MsTee 0:9eb93eff2469 100 score = 0;
MsTee 3:79d3148204e1 101 snake_size = 5; // Initial size of snake (set to 5 blocks)
MsTee 3:79d3148204e1 102 snake_speed = 0; // 0 - 100 lies between 0 and a 100
MsTee 0:9eb93eff2469 103 // Clear Screen
MsTee 0:9eb93eff2469 104 lcd.clear();
MsTee 0:9eb93eff2469 105 // Draw border
MsTee 3:79d3148204e1 106 lcd.drawRect(1,1,81,45,0);
MsTee 0:9eb93eff2469 107
MsTee 0:9eb93eff2469 108 // Reset snake parts
MsTee 3:79d3148204e1 109 for (int i = 0; i < 220; i++) {//resets the coordinates of the snake body across the screen within border
MsTee 0:9eb93eff2469 110 snake_x[i] = 0;
MsTee 0:9eb93eff2469 111 snake_y[i] = 0;
MsTee 0:9eb93eff2469 112 }
MsTee 0:9eb93eff2469 113 // Draw Initial snake
MsTee 3:79d3148204e1 114 for (int i = 0; i < snake_size; i++) { // draw the initial snake body, 5 blocks = 5time 4x4
MsTee 0:9eb93eff2469 115 snake_x[i] = (snake_size-1) - i;
MsTee 0:9eb93eff2469 116 snake_y[i] = 0;
MsTee 3:79d3148204e1 117 drawBlock(snake_x[i], snake_y[i]); // draws 4x4 pixel block
MsTee 0:9eb93eff2469 118 }
MsTee 0:9eb93eff2469 119
MsTee 3:79d3148204e1 120 apple = placeRandomApple(); // function responsible for setting random coordinates for food
MsTee 0:9eb93eff2469 121
MsTee 0:9eb93eff2469 122 lcd.refresh();
MsTee 0:9eb93eff2469 123
MsTee 3:79d3148204e1 124 game_state = WAIT_FOR_USER; // Enters game state set by enum
MsTee 3:79d3148204e1 125
MsTee 0:9eb93eff2469 126 break;
MsTee 0:9eb93eff2469 127 case WAIT_FOR_USER:
MsTee 3:79d3148204e1 128 // Wait until user moves joystick to the right or down (waits for game to start
MsTee 0:9eb93eff2469 129 while ((joystick.direction != RIGHT) && (joystick.direction != DOWN)) {
MsTee 3:79d3148204e1 130 sleep(); // ignores command when joystick is moved up or left at beginning of game
MsTee 0:9eb93eff2469 131 }
MsTee 0:9eb93eff2469 132 // Go to Play state
MsTee 0:9eb93eff2469 133 game_state = PLAY;
MsTee 3:79d3148204e1 134 break; // if joystick is moved right or down, then PLAY commences
MsTee 0:9eb93eff2469 135 case PLAY:
MsTee 3:79d3148204e1 136 while (game_state == PLAY) { //hence while in game play state
MsTee 0:9eb93eff2469 137
MsTee 3:79d3148204e1 138 switch (joystick.direction) {// define joystick conditions for right
MsTee 0:9eb93eff2469 139 case RIGHT:
MsTee 3:79d3148204e1 140 if (x_direction != -1) { // If joystick not pushed left
MsTee 3:79d3148204e1 141 x_direction = 1; //then x direction is right
MsTee 3:79d3148204e1 142 y_direction = 0; //y direction is 0 because joystick is not in vertical postion
MsTee 0:9eb93eff2469 143 }
MsTee 0:9eb93eff2469 144 break;
MsTee 0:9eb93eff2469 145 case LEFT:
MsTee 3:79d3148204e1 146 if (x_direction != 1) { // If joystic is not pushed right
MsTee 3:79d3148204e1 147 x_direction = -1; //then the diretion is left
MsTee 3:79d3148204e1 148 y_direction = 0; //y remains zero because joystick is not moved vertically
MsTee 0:9eb93eff2469 149 }
MsTee 0:9eb93eff2469 150 break;
MsTee 0:9eb93eff2469 151 case DOWN:
MsTee 3:79d3148204e1 152 if (y_direction != -1) { // If not pushed up,
MsTee 3:79d3148204e1 153 x_direction = 0; //remains 0 because joystick is not in horizontal position
MsTee 3:79d3148204e1 154 y_direction = 1; // Hence direction is down
MsTee 0:9eb93eff2469 155 }
MsTee 0:9eb93eff2469 156 break;
MsTee 0:9eb93eff2469 157 case UP:
MsTee 3:79d3148204e1 158 if (y_direction != 1) { // If joystick not pushed down
MsTee 3:79d3148204e1 159 x_direction = 0; // then x direction is 0 because joystick is not in horizontal position
MsTee 3:79d3148204e1 160 y_direction = -1; // Hence direction is up
MsTee 0:9eb93eff2469 161 }
MsTee 0:9eb93eff2469 162 break;
MsTee 0:9eb93eff2469 163 }
MsTee 0:9eb93eff2469 164
MsTee 3:79d3148204e1 165 next_x = snake_x[0] + x_direction; // defines new X postion of each snake pixel
MsTee 3:79d3148204e1 166 next_y = snake_y[0] + y_direction; // defines new Y position of each snake pixel
MsTee 0:9eb93eff2469 167
MsTee 0:9eb93eff2469 168 if (getBlock(next_x, next_y) && (next_x != apple.x) && (next_y != apple.y)) {
MsTee 3:79d3148204e1 169 // If snake runs into itself,
MsTee 3:79d3148204e1 170 game_state = GAME_OVER; // then game is over
MsTee 0:9eb93eff2469 171 } else if ((next_x > 19) || (next_y > 10) || (next_x < 0) || (next_y < 0)) {
MsTee 3:79d3148204e1 172 // if the snake hits the border,
MsTee 3:79d3148204e1 173 game_state = GAME_OVER; // game is over
MsTee 0:9eb93eff2469 174 } else {
MsTee 3:79d3148204e1 175 // Nothing happens
MsTee 0:9eb93eff2469 176 if ((next_x == apple.x) && (next_y == apple.y)) {
MsTee 3:79d3148204e1 177 // If snake consumes food
MsTee 3:79d3148204e1 178
MsTee 3:79d3148204e1 179 snake_size++; // the size of snake increases.
MsTee 3:79d3148204e1 180 score++; // the score increase by 1
MsTee 3:79d3148204e1 181 snake_speed = ((snake_speed + 10) < 150) ? (snake_speed + 10) : snake_speed; // snake speed increase, gets more difficult
MsTee 3:79d3148204e1 182
MsTee 3:79d3148204e1 183 apple = placeRandomApple(); // generate new position of food
MsTee 3:79d3148204e1 184 // Does not remove tail block to allow increase in snake size
MsTee 0:9eb93eff2469 185 } else {
MsTee 0:9eb93eff2469 186 // Remove tail
MsTee 3:79d3148204e1 187 eraseBlock(snake_x[snake_size-1], snake_y[snake_size-1]); // if snake did not eat food then erase tail block to maintain inital size
MsTee 3:79d3148204e1 188 } // if snake did not eat food then erase tail block to maintain inital size
MsTee 3:79d3148204e1 189
MsTee 0:9eb93eff2469 190
MsTee 3:79d3148204e1 191
MsTee 3:79d3148204e1 192 for (int i = snake_size-1; i > 0; i--) { // shifts all the pixels of the snake body, except head
MsTee 0:9eb93eff2469 193 snake_x[i] = snake_x[i - 1];
MsTee 0:9eb93eff2469 194 snake_y[i] = snake_y[i - 1];
MsTee 0:9eb93eff2469 195 }
MsTee 0:9eb93eff2469 196
MsTee 3:79d3148204e1 197
MsTee 3:79d3148204e1 198 snake_x[0] = next_x; // hence moves snake head to lead for new position
MsTee 0:9eb93eff2469 199 snake_y[0] = next_y;
MsTee 0:9eb93eff2469 200
MsTee 3:79d3148204e1 201
MsTee 3:79d3148204e1 202 drawBlock(next_x, next_y); // constructs new head postion
MsTee 0:9eb93eff2469 203
MsTee 0:9eb93eff2469 204 // Redraw things on LCD
MsTee 3:79d3148204e1 205 lcd.refresh();
MsTee 0:9eb93eff2469 206
MsTee 3:79d3148204e1 207 wait_ms(200 - snake_speed); // alters snake speed based on rate of the loop
MsTee 0:9eb93eff2469 208 }
MsTee 0:9eb93eff2469 209 }
MsTee 0:9eb93eff2469 210 break;
MsTee 0:9eb93eff2469 211 case GAME_OVER:
MsTee 3:79d3148204e1 212 char score_string[14]; // number of characters for score
MsTee 3:79d3148204e1 213 sprintf(score_string, "Score: %d", score); // prints score value estimated based on number of food eaten.
MsTee 0:9eb93eff2469 214 // Clear Screen
MsTee 0:9eb93eff2469 215 lcd.clear();
MsTee 1:ab8ceac59e71 216 // Print score
MsTee 3:79d3148204e1 217 lcd.printString("GAME OVER!",0,0); //prints 'GAME OVER'
MsTee 1:ab8ceac59e71 218 lcd.printString(score_string,0,1);
MsTee 3:79d3148204e1 219
MsTee 3:79d3148204e1 220 lcd.printString("REPLAY",48,5); // Replay message at bottom right corner next to PCB
MsTee 3:79d3148204e1 221
MsTee 1:ab8ceac59e71 222 // Blink LED and Buzz until user presses the
MsTee 1:ab8ceac59e71 223 // PCB Button
MsTee 3:79d3148204e1 224 blinkLEDandBuzz(); // Runs until the pcb_button pressed
MsTee 1:ab8ceac59e71 225 // When blinkLEDandBuzz finished go to Init state
MsTee 3:79d3148204e1 226 game_state = INIT; // returns to INIT state at beginning of loop to start new game
MsTee 0:9eb93eff2469 227 break;
MsTee 0:9eb93eff2469 228 default:
MsTee 0:9eb93eff2469 229 game_state = INIT;
MsTee 0:9eb93eff2469 230 }
MsTee 0:9eb93eff2469 231 }
MsTee 0:9eb93eff2469 232 }
MsTee 0:9eb93eff2469 233
MsTee 3:79d3148204e1 234 AppleType placeRandomApple() { // responsible for placing food
MsTee 3:79d3148204e1 235
MsTee 3:79d3148204e1 236 int good_location = 0; //varaible for suitable location for food
MsTee 0:9eb93eff2469 237 AppleType apple;
MsTee 0:9eb93eff2469 238 // Look for a new location for an apple
MsTee 3:79d3148204e1 239 while (!good_location) { //while not in good location
MsTee 3:79d3148204e1 240 apple.x = rand() % 20; // 0 to 19 // random x coordinate
MsTee 3:79d3148204e1 241 apple.y = rand() % 10; // 0 to 9 // random y coordinate
MsTee 0:9eb93eff2469 242 // Don't put apple on the snake
MsTee 3:79d3148204e1 243 if (!getBlock(apple.x, apple.y)) good_location = 1; // checks for other pixels in the 20x11 field (within border)
MsTee 3:79d3148204e1 244 } // avoids snake pixels, so food isnt generate on snake
MsTee 3:79d3148204e1 245 drawApple(apple.x, apple.y); //hence draws food
MsTee 3:79d3148204e1 246 return apple; // returns food
MsTee 0:9eb93eff2469 247 }
MsTee 0:9eb93eff2469 248
MsTee 0:9eb93eff2469 249 // field_x (0..19), field_y (0..10)
MsTee 3:79d3148204e1 250 void drawBlock(int field_x, int field_y) { // responsible for the construct of the 4x4 pixel
MsTee 0:9eb93eff2469 251 // field_x*(block_size)+(border_offset)
MsTee 3:79d3148204e1 252 lcd.drawRect(field_x*4+2, field_y*4+2, 3, 3, 1);
MsTee 0:9eb93eff2469 253 }
MsTee 0:9eb93eff2469 254
MsTee 3:79d3148204e1 255 void eraseBlock(int field_x, int field_y) { // erase block when snake moves, from preivous position
MsTee 0:9eb93eff2469 256 // Draw an empty square on top
MsTee 0:9eb93eff2469 257 // field_x*(block_size)+(border_offset)
MsTee 0:9eb93eff2469 258 lcd.drawRect(field_x*4+2, field_y*4+2, 3, 3, 3);
MsTee 0:9eb93eff2469 259 }
MsTee 0:9eb93eff2469 260
MsTee 3:79d3148204e1 261 void drawApple(int field_x, int field_y) { //construct food
MsTee 3:79d3148204e1 262 int offset_x = field_x*4+2; // offset of 2 pixels
MsTee 0:9eb93eff2469 263 int offset_y = field_y*4+2;
MsTee 0:9eb93eff2469 264 // Drawing an apple pixel by pixel (8 dots)
MsTee 3:79d3148204e1 265 lcd.setPixel(offset_x+1,offset_y);
MsTee 0:9eb93eff2469 266 lcd.setPixel(offset_x+2,offset_y);
MsTee 0:9eb93eff2469 267 lcd.setPixel(offset_x,offset_y+1);
MsTee 0:9eb93eff2469 268 lcd.setPixel(offset_x,offset_y+2);
MsTee 0:9eb93eff2469 269 lcd.setPixel(offset_x+3,offset_y+1);
MsTee 0:9eb93eff2469 270 lcd.setPixel(offset_x+3,offset_y+2);
MsTee 0:9eb93eff2469 271 lcd.setPixel(offset_x+1,offset_y+3);
MsTee 0:9eb93eff2469 272 lcd.setPixel(offset_x+2,offset_y+3);
MsTee 0:9eb93eff2469 273 }
MsTee 0:9eb93eff2469 274
MsTee 3:79d3148204e1 275 int getBlock(int field_x, int field_y) { // check for block on apply and snake to allow food to be eaten
MsTee 0:9eb93eff2469 276 int offset_x = field_x*4+2;
MsTee 0:9eb93eff2469 277 int offset_y = field_y*4+2;
MsTee 0:9eb93eff2469 278 // Pixel at (offset_x+1,offset_y) will be active
MsTee 0:9eb93eff2469 279 // for both apple and the snake block
MsTee 0:9eb93eff2469 280 return lcd.getPixel(offset_x+1,offset_y);
MsTee 0:9eb93eff2469 281 }
MsTee 0:9eb93eff2469 282
MsTee 0:9eb93eff2469 283 // This function is called when button is pressed
MsTee 0:9eb93eff2469 284 void pcb_button_isr() {
MsTee 0:9eb93eff2469 285 g_pcb_button_flag = 1;
MsTee 1:ab8ceac59e71 286 }
MsTee 1:ab8ceac59e71 287
MsTee 1:ab8ceac59e71 288 void blinkLEDandBuzz() {
MsTee 1:ab8ceac59e71 289 // Reset button interrupt flag
MsTee 3:79d3148204e1 290 // in case if it was pressed during the game PLAY state
MsTee 1:ab8ceac59e71 291 g_pcb_button_flag = 0;
MsTee 1:ab8ceac59e71 292
MsTee 1:ab8ceac59e71 293 // Set the buzzer period to 0.002 s
MsTee 3:79d3148204e1 294 pcb_buzzer.period(0.002); // frequency of sound
MsTee 1:ab8ceac59e71 295 // Flag is needed to switch between
MsTee 1:ab8ceac59e71 296 // on and off states repeatedly
MsTee 1:ab8ceac59e71 297 int flag = 0;
MsTee 1:ab8ceac59e71 298
MsTee 1:ab8ceac59e71 299 // Wait for the button to be pressed
MsTee 3:79d3148204e1 300 while(!g_pcb_button_flag) { // while not equal to 1, while button unpressed
MsTee 1:ab8ceac59e71 301
MsTee 1:ab8ceac59e71 302 if (flag == 0) {
MsTee 3:79d3148204e1 303 // enable buzzer and led to ring and blink
MsTee 1:ab8ceac59e71 304 pcb_led.write(1);
MsTee 3:79d3148204e1 305 pcb_buzzer.write(0.5); // duty cycle period of 0.5sec and LED 1 sec
MsTee 1:ab8ceac59e71 306 flag = 1;
MsTee 1:ab8ceac59e71 307
MsTee 1:ab8ceac59e71 308 } else if (flag == 1) {
MsTee 3:79d3148204e1 309 // disable buzzer and led when button is pressed
MsTee 1:ab8ceac59e71 310 pcb_led.write(0);
MsTee 1:ab8ceac59e71 311 pcb_buzzer.write(0);
MsTee 1:ab8ceac59e71 312 flag = 0;
MsTee 1:ab8ceac59e71 313 }
MsTee 3:79d3148204e1 314
MsTee 3:79d3148204e1 315 wait(0.1); // delay before switching
MsTee 1:ab8ceac59e71 316 }
MsTee 1:ab8ceac59e71 317
MsTee 1:ab8ceac59e71 318 // Disable LED and Buzzer
MsTee 1:ab8ceac59e71 319 pcb_led.write(0);
MsTee 1:ab8ceac59e71 320 pcb_buzzer.write(0);
MsTee 1:ab8ceac59e71 321 }
MsTee 1:ab8ceac59e71 322
MsTee 1:ab8ceac59e71 323 // updateBrightness function called
MsTee 2:dbfe6019b558 324 // by the ticker every 300 ms
MsTee 1:ab8ceac59e71 325
MsTee 1:ab8ceac59e71 326 void updateBrightness() {
MsTee 3:79d3148204e1 327 // Static means that the value will be kept
MsTee 3:79d3148204e1 328 // in the memory between iterations
MsTee 2:dbfe6019b558 329 static float lcd_brighntness = 0;
MsTee 2:dbfe6019b558 330
MsTee 3:79d3148204e1 331 float pot_value = pot.read(); //value of potentiometer
MsTee 3:79d3148204e1 332 float pot_allowed_difference = 0.1;
MsTee 1:ab8ceac59e71 333
MsTee 2:dbfe6019b558 334 if (abs(lcd_brighntness - pot_value) > pot_allowed_difference) {
MsTee 2:dbfe6019b558 335 // Only update when potentiometer reading changes by
MsTee 2:dbfe6019b558 336 // a certain amount
MsTee 2:dbfe6019b558 337 lcd.setBrightness(pot_value);
MsTee 2:dbfe6019b558 338 lcd_brighntness = pot_value;
MsTee 1:ab8ceac59e71 339 }
MsTee 1:ab8ceac59e71 340
MsTee 0:9eb93eff2469 341 }