Components and supplies
1
Resistor 221 ohm
3
Pushbutton Switch, Push-Pull
1
Alphanumeric LCD, 16 x 2
1
Rotary potentiometer (generic)
1
Solderless Breadboard Full Size
1
Buzzer
1
Jumper wires (generic)
1
Arduino UNO
Apps and platforms
1
Arduino IDE
Project description
Code
Pomodoro codiing
arduino
1#include <LiquidCrystal.h> 2//LCD pinMode setup 3const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; 4LiquidCrystal lcd(rs, en, d4, d5, d6, d7); 5 6//music tone setup for "SO" (G), "LA" (A), "TI" (B), "DO" (C) 7int abc[] = {3920, 4400, 4940, 5230}; 8 9//variables declaration 10signed short minutes, secondes; 11char timeline[16]; 12char countf[16]; 13int buzzerpin = 7; 14int rightButton = 8; 15int leftButton = 9; 16int selectButton = 10; 17int menu = 1; 18int flag = 0; 19int count = 0; 20int mins; 21int sec; 22int total; 23 24//----------------------------------------- SETUP PROGRAM --------------------------------------------------- 25void setup(){ 26 lcd.begin(16,2); 27 pinMode(rightButton, INPUT_PULLUP); 28 pinMode(leftButton, INPUT_PULLUP); 29 pinMode(selectButton, INPUT_PULLUP); 30 pinMode(buzzerpin, OUTPUT); 31 32 lcd.setCursor(3,0); 33 lcd.print("WELCOME TO"); 34 for(int i = 0; i < 4; i++) //playing welcoming melody 35 { 36 mtone(buzzerpin, abc[i], 500); 37 delay(50); 38 lcd.setCursor(4,1); 39 lcd.print("POMODORO"); 40 } 41 42 updateMenu(); 43 44} 45//------------------------------------- PUSHBUTTON INPUT DETECTION --------------------------------------------- 46//flag 0 for "auto" and "custom" (general mode) menu interface 47//flag 1 for "Yes" and "no" (continue confirmation) menu interface 48//flag 2 for custom option mode menu interface 49//mtone() function play a tone if sny switch was pressed 50//Notice that there is a tone different between "select button" and "left/right buttion" 51 52void loop(){ 53 if(!digitalRead(leftButton)){ 54 mtone(buzzerpin, abc[0], 50); 55 menu++; 56 if (flag == 0){ 57 mtone(buzzerpin, abc[0], 50); 58 updateMenu(); 59 } 60 else if (flag == 1){ 61 mtone(buzzerpin, abc[0], 50); 62 updateMenu2(); 63 } 64 else if (flag == 2){ 65 mtone(buzzerpin, abc[0], 50); 66 updateMenu3(); 67 } 68 delay(100); 69 while(!digitalRead(leftButton)); 70 } 71 if(!digitalRead(rightButton)){ 72 73 menu--; 74 if (flag == 0){ 75 mtone(buzzerpin, abc[0], 100); // abc[i] tone sound for 0.5 second 76 updateMenu(); 77 } 78 else if (flag == 1){ 79 mtone(buzzerpin, abc[0], 100); // abc[i] tone sound for 0.5 second 80 updateMenu2(); 81 } 82 else if (flag == 2){ 83 mtone(buzzerpin, abc[0], 100); // abc[i] tone sound for 0.5 second 84 updateMenu3(); 85 } 86 delay(100); 87 while(!digitalRead(rightButton)); 88 } 89 if(!digitalRead(selectButton)){ 90 if (flag == 0){ 91 mtone(buzzerpin, abc[3], 50); // abc[i] tone sound for 0.5 second 92 executeAction(); 93 } 94 else if (flag == 1){ 95 mtone(buzzerpin, abc[3], 50); // abc[i] tone sound for 0.5 second 96 updateMenu2(); 97 confirm(); 98 } 99 else if (flag == 2){ 100 mtone(buzzerpin, abc[3], 50); // abc[i] tone sound for 0.5 second 101 action2(); 102 } 103 delay(100); 104 while(!digitalRead(selectButton)); 105 } 106 107} 108//--------------------------------------------- General Mode Menu Display ----------------------------------------------- 109void updateMenu(){ 110 switch(menu){ 111 case 0: //auxiliary condition 112 menu = 1; 113 break; 114 115 case 1: //Select option 1 - AUTO interface 116 lcd.clear(); 117 lcd.print("---- OPTION ----"); 118 lcd.setCursor(1,1); 119 lcd.print("~AUTO"); 120 lcd.setCursor(9,1); 121 lcd.print("CUSTOM"); 122 break; 123 124 case 2: //Select option 2- CUSTOM interface 125 lcd.clear(); 126 lcd.print("---- OPTION ----"); 127 lcd.setCursor(2,1); 128 lcd.print("AUTO"); 129 lcd.setCursor(8,1); 130 lcd.print("~CUSTOM"); 131 break; 132 133 case 3: 134 menu = 2; 135 break; 136 } 137} 138//------------------------------------------- Function Execution for auto and custom ---------------------------------- 139void executeAction(){ 140 switch(menu){ 141 case 1: 142 flag = 0; 143 delay(100); 144 action1(); 145 break; 146 147 case 2: 148 menu = 1; 149 flag = 2; 150 updateMenu3(); 151 break; 152 } 153} 154 155void action1(){ 156 lcd.clear(); 157 lcd.print("---- ALERT! ----"); 158 buzz(); 159 for (int i=5;i>=0;i--){ 160 lcd.setCursor(1,1); 161 lcd.print("GET READY IN "); 162 lcd.setCursor(14,1); 163 lcd.print(i); 164 delay(1000); 165 } 166 167 timedisplay(); 168 delay(2000); 169} 170 171//----------------------------------- custom mode menu display ----------------------------------== 172void updateMenu3(){ 173 switch(menu){ 174 case 0: //auxiliary condition 175 menu = 1; 176 break; 177 178 case 1: //Select option 1 - AUTO interface 179 delay(100); 180 lcd.clear(); 181 lcd.print("---- OPTION ----"); 182 lcd.setCursor(1,1); 183 lcd.print("~1HR"); 184 lcd.setCursor(7,1); 185 lcd.print("2HR"); 186 lcd.setCursor(12,1); 187 lcd.print("3HR"); 188 break; 189 190 case 2: //Select option 2- CUSTOM interface 191 delay(100); 192 lcd.clear(); 193 lcd.print("---- OPTION ----"); 194 lcd.setCursor(2,1); 195 lcd.print("1HR"); 196 lcd.setCursor(6,1); 197 lcd.print("~2HR"); 198 lcd.setCursor(12,1); 199 lcd.print("3HR"); 200 break; 201 202 case 3: 203 delay(100); 204 lcd.clear(); 205 lcd.print("---- OPTION ----"); 206 lcd.setCursor(2,1); 207 lcd.print("1HR"); 208 lcd.setCursor(7,1); 209 lcd.print("2HR"); 210 lcd.setCursor(11,1); 211 lcd.print("~3HR"); 212 break; 213 214 case 4: //Select option 1 - AUTO interface 215 delay(100); 216 lcd.clear(); 217 lcd.print("---- OPTION ----"); 218 lcd.setCursor(1,1); 219 lcd.print("~4HR"); 220 lcd.setCursor(7,1); 221 lcd.print("5HR"); 222 lcd.setCursor(12,1); 223 lcd.print("6HR"); 224 break; 225 226 case 5: //Select option 2- CUSTOM interface 227 delay(100); 228 lcd.clear(); 229 lcd.print("---- OPTION ----"); 230 lcd.setCursor(2,1); 231 lcd.print("4HR"); 232 lcd.setCursor(6,1); 233 lcd.print("~5HR"); 234 lcd.setCursor(12,1); 235 lcd.print("6HR"); 236 break; 237 238 case 6: 239 delay(100); 240 lcd.clear(); 241 lcd.print("---- OPTION ----"); 242 lcd.setCursor(2,1); 243 lcd.print("4HR"); 244 lcd.setCursor(7,1); 245 lcd.print("5HR"); 246 lcd.setCursor(11,1); 247 lcd.print("~6HR"); 248 break; 249 250 case 7: //Select option 1 - AUTO interface 251 delay(100); 252 lcd.clear(); 253 lcd.print("---- OPTION ----"); 254 lcd.setCursor(1,1); 255 lcd.print("~7HR"); 256 lcd.setCursor(7,1); 257 lcd.print("8HR"); 258 lcd.setCursor(12,1); 259 lcd.print("BCK"); 260 break; 261 262 case 8: //Select option 2- CUSTOM interface 263 delay(100); 264 lcd.clear(); 265 lcd.print("---- OPTION ----"); 266 lcd.setCursor(2,1); 267 lcd.print("7HR"); 268 lcd.setCursor(6,1); 269 lcd.print("~8HR"); 270 lcd.setCursor(12,1); 271 lcd.print("BCK"); 272 break; 273 274 case 9: 275 delay(100); 276 lcd.clear(); 277 lcd.print("---- OPTION ----"); 278 lcd.setCursor(2,1); 279 lcd.print("7HR"); 280 lcd.setCursor(7,1); 281 lcd.print("8HR"); 282 lcd.setCursor(11,1); 283 lcd.print("~BCK"); 284 break; 285 286 case 10: 287 menu = 9; 288 break; 289 } 290} 291 292//-------------------------- Function execution for each custom mode option ----------------------------------------- 293void action2(){ 294 switch(menu){ 295 case 0: 296 menu = 1; 297 break; 298 299 case 1: 300 lcd.clear(); 301 flag = 2; 302 for (int i = 0; i < 2; i++){ 303 action1(); 304 } 305 lcd.clear(); 306 lcd.print("SESSION"); 307 308 lcd.setCursor(0,1); 309 lcd.print("ENDED"); 310 for (int i = 0; i <3; i++){ 311 digitalWrite(buzzerpin, HIGH); 312 delay(100); 313 digitalWrite(buzzerpin, LOW); 314 delay(100); 315 } 316 delay(2000); 317 updateMenu3(); 318 flag = 2; 319 count = 0; 320 break; 321 322 case 2: 323 lcd.clear(); 324 flag = 2; 325 for (int i = 0; i < 4; i++){ 326 action1(); 327 } 328 lcd.clear(); 329 lcd.print("SESSION"); 330 lcd.setCursor(0,1); 331 lcd.print("ENDED"); 332 for (int i = 0; i <3; i++){ 333 digitalWrite(buzzerpin, HIGH); 334 delay(100); 335 digitalWrite(buzzerpin, LOW); 336 delay(100); 337 } 338 delay(1000); 339 updateMenu3(); 340 flag = 2; 341 count = 0; 342 break; 343 344 case 3: 345 lcd.clear(); 346 flag = 2; 347 for (int i = 0; i < 6; i++){ 348 action1(); 349 } 350 lcd.clear(); 351 lcd.print("SESSION"); 352 lcd.setCursor(0,1); 353 lcd.print("ENDED"); 354 for (int i = 0; i <3; i++){ 355 digitalWrite(buzzerpin, HIGH); 356 delay(100); 357 digitalWrite(buzzerpin, LOW); 358 delay(100); 359 } 360 delay(1000); 361 updateMenu3(); 362 flag = 2; 363 count = 0; 364 break; 365 366 case 4: 367 lcd.clear(); 368 flag = 2; 369 for (int i = 0; i < 8; i++){ 370 action1(); 371 } 372 lcd.clear(); 373 lcd.print("SESSION"); 374 lcd.setCursor(0,1); 375 lcd.print("ENDED"); 376 for (int i = 0; i <3; i++){ 377 digitalWrite(buzzerpin, HIGH); 378 delay(100); 379 digitalWrite(buzzerpin, LOW); 380 delay(100); 381 } 382 delay(1000); 383 updateMenu3(); 384 flag = 2; 385 count = 0; 386 break; 387 388 case 5: 389 lcd.clear(); 390 flag = 2; 391 for (int i = 0; i < 10; i++){ 392 action1(); 393 } 394 lcd.clear(); 395 lcd.print("SESSION"); 396 lcd.setCursor(0,1); 397 lcd.print("ENDED"); 398 for (int i = 0; i <3; i++){ 399 digitalWrite(buzzerpin, HIGH); 400 delay(100); 401 digitalWrite(buzzerpin, LOW); 402 delay(100); 403 } 404 delay(1000); 405 updateMenu3(); 406 flag = 2; 407 count = 0; 408 break; 409 410 case 6: 411 lcd.clear(); 412 flag = 2; 413 for (int i = 0; i < 7; i++){ 414 action1(); 415 } 416 lcd.clear(); 417 lcd.print("SESSION"); 418 lcd.setCursor(0,1); 419 lcd.print("ENDED"); 420 for (int i = 0; i <3; i++){ 421 digitalWrite(buzzerpin, HIGH); 422 delay(100); 423 digitalWrite(buzzerpin, LOW); 424 delay(100); 425 } 426 delay(1000); 427 updateMenu3(); 428 flag = 2; 429 count = 0; 430 break; 431 432 case 7: 433 lcd.clear(); 434 flag = 2; 435 for (int i = 0; i < 8; i++){ 436 action1(); 437 } 438 lcd.clear(); 439 lcd.print("SESSION"); 440 lcd.setCursor(0,1); 441 lcd.print("ENDED"); 442 for (int i = 0; i <3; i++){ 443 digitalWrite(buzzerpin, HIGH); 444 delay(100); 445 digitalWrite(buzzerpin, LOW); 446 delay(100); 447 } 448 delay(1000); 449 updateMenu3(); 450 flag = 2; 451 count = 0; 452 break; 453 454 case 8: 455 lcd.clear(); 456 flag = 2; 457 for (int i = 0; i < 9; i++){ 458 action1(); 459 } 460 lcd.clear(); 461 lcd.print("SESSION"); 462 lcd.setCursor(0,1); 463 lcd.print("ENDED"); 464 for (int i = 0; i <3; i++){ 465 digitalWrite(buzzerpin, HIGH); 466 delay(100); 467 digitalWrite(buzzerpin, LOW); 468 delay(100); 469 } 470 delay(1000); 471 updateMenu3(); 472 flag = 2; 473 count = 0; 474 break; 475 476 case 9: 477 menu = 1; 478 flag = 0; 479 updateMenu(); 480 481 break; 482 483 case 10: 484 menu = 9; 485 break; 486 } 487 488} 489 490//---------------------- 30 minutes pomodoro session program --------------------------------------- 491void timedisplay(){ 492 minutes = 25; 493 secondes = 0; 494 495 lcd.clear(); 496 lcd.print("--- FOCUSING ---"); 497 498 while (minutes != 0 or secondes != 0){ 499 if(secondes == 0){ 500 lcd.setCursor(0,1); 501 sprintf(timeline," %0.2d %0.2d ", minutes, secondes); 502 lcd.print(timeline); 503 delay(300); 504 lcd.setCursor(7,1); 505 lcd.print(":"); 506 lcd.setCursor(8,1); 507 lcd.print(":"); 508 lcd.setCursor(7,1); 509 lcd.print(""); 510 lcd.setCursor(8,1); 511 lcd.print(""); 512 delay(700); 513 secondes = 59; 514 minutes --; 515 } 516 else{ 517 lcd.setCursor(0,1); 518 sprintf(timeline," %0.2d %0.2d ", minutes, secondes); 519 lcd.print(timeline); 520 delay(300); 521 lcd.setCursor(7,1); 522 lcd.print(":"); 523 lcd.setCursor(8,1); 524 lcd.print(":"); 525 lcd.setCursor(7,1); 526 lcd.print(""); 527 lcd.setCursor(8,1); 528 lcd.print(""); 529 delay(700); 530 secondes --; 531 } 532 } 533 lcd.setCursor(0,1); 534 sprintf(timeline," %0.2d :: %0.2d ", minutes, secondes); 535 lcd.print(timeline); 536 delay(1000); 537 lcd.clear(); 538 lcd.print("-- COMPLETED! --"); 539 buzz(); 540 lcd.setCursor(3,1); 541 lcd.print("REST TIME"); 542 delay(2000); 543 544 minutes = 5; 545 secondes = 0; 546 547 lcd.clear(); 548 lcd.print("----- REST -----"); 549 while (minutes != 0 or secondes != 0){ 550 if(secondes == 0){ 551 lcd.setCursor(0,1); 552 sprintf(timeline," %0.2d %0.2d ", minutes, secondes); 553 lcd.print(timeline); 554 delay(300); 555 lcd.setCursor(7,1); 556 lcd.print(":"); 557 lcd.setCursor(8,1); 558 lcd.print(":"); 559 lcd.setCursor(7,1); 560 lcd.print(""); 561 lcd.setCursor(8,1); 562 lcd.print(""); 563 delay(700); 564 secondes = 59; 565 minutes --; 566 } 567 else{ 568 lcd.setCursor(0,1); 569 sprintf(timeline," %0.2d %0.2d ", minutes, secondes); 570 lcd.print(timeline); 571 delay(300); 572 lcd.setCursor(7,1); 573 lcd.print(":"); 574 lcd.setCursor(8,1); 575 lcd.print(":"); 576 lcd.setCursor(7,1); 577 lcd.print(""); 578 lcd.setCursor(8,1); 579 lcd.print(""); 580 delay(700); 581 secondes --; 582 } 583 } 584 lcd.setCursor(0,1); 585 sprintf(timeline," %0.2d :: %0.2d ", minutes, secondes); 586 lcd.print(timeline); 587 delay(1000); 588 589 count++; 590 total = count * 30; 591 if (total >= 60){ 592 mins = total /60; 593 sec = total%60; 594 } 595 else{ 596 mins = 0; 597 sec = total; 598 } 599 lcd.clear(); 600 lcd.print("-- CHECKPOINT --"); 601 digitalWrite(buzzerpin, HIGH); 602 delay(100); 603 digitalWrite(buzzerpin, LOW); 604 delay(100); 605 lcd.setCursor(0,1); 606 sprintf(countf, "COUNT:%0.2d %0.2d:%0.2d", count, mins, sec); 607 lcd.print(countf); 608 delay(1000); 609 if (flag == 0){ 610 updateMenu2(); 611 flag = 1; 612 } 613 } 614 615//---------------------------- confirmation menu display ----------------------------------- 616void updateMenu2(){ 617 618 switch(menu){ 619 case 0: //auxiliary condition 620 menu = 1; 621 break; 622 623 case 1: //Select option 1 - YES interface 624 lcd.clear(); 625 lcd.print("-- CONTINUE ? --"); 626 lcd.setCursor(2,1); 627 lcd.print("~YES"); 628 lcd.setCursor(11,1); 629 lcd.print("NO"); 630 break; 631 632 case 2: //Select option 2- NO interface 633 lcd.clear(); 634 lcd.print("-- CONTINUE ? --"); 635 lcd.setCursor(3,1); 636 lcd.print("YES"); 637 lcd.setCursor(10,1); 638 lcd.print("~NO"); 639 break; 640 641 case 3: 642 menu = 2; 643 break; 644 } 645} 646 647//-------------------- confirmation to continue execution --------------------------------------- 648void confirm(){ 649 switch(menu){ 650 case 1: 651 delay(100); 652 flag = 0; 653 action1(); 654 break; 655 656 case 2: 657 delay(100); 658 flag = 0; 659 menu = 1; 660 total = count * 30; 661 if (total >= 60){ 662 mins = total /60; 663 sec = total%60; 664 } 665 else{ 666 mins = 0; 667 sec = total; 668 } 669 lcd.clear(); 670 lcd.print("---- SUMMARY ----"); 671 lcd.setCursor(0,1); 672 sprintf(countf, "COUNT:%0.2d %0.2d:%0.2d", count, mins, sec); 673 lcd.print(countf); 674 delay(2000); 675 count = 0; 676 677 678 updateMenu(); 679 break; 680 } 681} 682 683// ------------------------ buzzer execution ------------------------------- 684void buzz(){ 685 for (int i = 0; i <3; i++){ 686 digitalWrite(buzzerpin, HIGH); 687 delay(50); 688 digitalWrite(buzzerpin, LOW); 689 delay(50); 690 } 691} 692 693//------------------------- welcoming message execution --------------------- 694void mtone(int dx, int hz, unsigned long tm) 695{ 696 unsigned long t = millis(); 697 unsigned long ns = (long)500000 / hz; 698 699 // Repeats for tm milliseconds. 700 // Sounds for tm milliseconds 701 while(millis() - t < tm) 702 { 703 digitalWrite(dx, HIGH); 704 delayMicroseconds(ns); 705 digitalWrite(dx, LOW); 706 delayMicroseconds(ns); 707 } 708}
Downloadable files
Schematic diagram via Tinker CAD.
Schematic diagram via Tinker CAD.

Comments
Only logged in users can leave comments