Advertisement
skizziks_53

mini LCD + button tester v.02

May 8th, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.77 KB | None | 0 0
  1. /*
  2.   Reddit menu example - May 8, 2019
  3.   Displays a multi-level menu on a 20x4 LCD screen, with 5-button navigation.
  4.   Board = Uno
  5.   Other hardware: 20x4 I2C LCD
  6.                   5 series-resistive buttons
  7.  
  8.  
  9.   Button 1 should be left, button 2 down, button 3 up, button 4 right. 5 = select.
  10.   buttons, resistors, pin levels:
  11.   1   220Ω  394
  12.   2   470Ω  329
  13.   3   1KΩ   264
  14.   4   2.2KΩ   194
  15.   5   4.7KΩ   114
  16.  
  17. */
  18.  
  19. #include "Wire.h" // For I2C (standard Arduino IDE library)
  20. #include "LiquidCrystal_I2C.h" // Library location --- https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c
  21. LiquidCrystal_I2C lcd(0x27, 20, 4); // 0x27 is -usually- the default I2C bus address of the backpack
  22.  
  23. int buttonInput_pin = A0; // The physical input pin for buttons.
  24. int buttonInput_pinValue = 0; // This is used for storing the actual pin value.
  25. int button_pressed_current_value = 0;
  26. int button_pressed_previous_value = 0;
  27.  
  28.  
  29. // The variables below are used to debounce button presses.
  30. // The buttons are going to be checked ten times a second.
  31. // Only one button press will be detected for each time the button is pressed. Holding the button down should not result in additional 'presses' being detected.
  32. bool buttons_enabled = true; // Used for debouncing buttons.
  33. int button_debounce_time = 100; // A time in milliseconds to debounce the buttons.
  34. unsigned long button_press_begin_time = 0;
  35. unsigned long button_press_current_time = 0;
  36.  
  37.  
  38.  
  39. void setup() {
  40.   Serial.begin(9600);
  41.   lcd.init();
  42.   // buttonInput_pin is analogRead(), doesn't require declaration
  43.   // I2C pins A4, A5 are fixed and don't require declaration
  44.   lcd_clear_all_lines();
  45.   button_pressed__no_button();
  46.   Serial.println("Exiting setup()");
  47. }
  48.  
  49.  
  50.  
  51.  
  52. void loop() {
  53.  
  54.   if (buttons_enabled == true) {
  55.     check_buttons();
  56.     start_button_timer();
  57.   }
  58.   else {
  59.     check_button_timer();
  60.   }
  61.  
  62. } // end of main loop
  63.  
  64.  
  65.  
  66.  
  67.  
  68. void check_buttons() {
  69.  
  70.   button_pressed_current_value = analogRead(buttonInput_pin);
  71.   if (button_pressed_previous_value < 50 && button_pressed_current_value > 50) {
  72.     lcd_print_blank_line(1);
  73.     if (button_pressed_current_value > 50 && button_pressed_current_value < 130) {
  74.       button_pressed__select();
  75.     }
  76.     if (button_pressed_current_value > 180 && button_pressed_current_value < 220) {
  77.       button_pressed__right();
  78.     }
  79.     if (button_pressed_current_value > 230 && button_pressed_current_value < 290) {
  80.       button_pressed__up();
  81.     }
  82.     if (button_pressed_current_value > 300 && button_pressed_current_value < 360) {
  83.       button_pressed__down();
  84.     }
  85.     if (button_pressed_current_value > 370 && button_pressed_current_value < 430) {
  86.       // left button
  87.       button_pressed__left();
  88.     }
  89.   }
  90.   button_pressed_previous_value = button_pressed_current_value;
  91. }
  92.  
  93.  
  94. void button_pressed__select() {
  95.   lcd.setCursor(0, 0);
  96.   lcd.print("button = select");
  97.   Serial.println("button = select");
  98.   delay(2000);
  99.   button_pressed__no_button();
  100. }
  101.  
  102. void button_pressed__right() {
  103.   lcd.setCursor(0, 0);
  104.   lcd.print("button = right");
  105.   Serial.println("button = right");
  106.   delay(2000);
  107.   button_pressed__no_button();
  108. }
  109.  
  110. void button_pressed__up() {
  111.   lcd.setCursor(0, 0);
  112.   lcd.print("button = up");
  113.   Serial.println("button = up");
  114.   delay(2000);
  115.   button_pressed__no_button();
  116. }
  117.  
  118. void button_pressed__down() {
  119.   lcd.setCursor(0, 0);
  120.   lcd.print("button = down");
  121.   Serial.println("button = down");
  122.   delay(2000);
  123.   button_pressed__no_button();
  124. }
  125.  
  126. void button_pressed__left() {
  127.   lcd.setCursor(0, 0);
  128.   lcd.print("button = left");
  129.   Serial.println("button = left");
  130.   delay(2000);
  131.   button_pressed__no_button();
  132. }
  133.  
  134. void button_pressed__no_button() {
  135.   lcd_print_blank_line(1);
  136.   lcd.setCursor(0, 1);
  137.   lcd.print("button = none");
  138.   Serial.println("button = none");
  139. }
  140.  
  141.  
  142. void start_button_timer() {
  143.   // This is for starting the button timer. This is done every time the button input is checked.
  144.   buttons_enabled = false;
  145.   button_press_begin_time = millis();
  146. }
  147.  
  148.  
  149. void check_button_timer() {
  150.   // This function re-enables the button input if button_debounce_time has passed.
  151.   button_press_current_time = millis();
  152.   if (button_press_current_time >= button_press_begin_time) {
  153.     if (button_press_current_time >= (button_press_begin_time + button_debounce_time)) {
  154.       buttons_enabled = true;
  155.     }
  156.   }
  157.   else {
  158.     button_press_begin_time = millis();
  159.   }
  160. }
  161.  
  162.  
  163. void lcd_clear_all_lines() {
  164.   lcd_print_blank_line(1);
  165.   lcd_print_blank_line(2);
  166.   lcd_print_blank_line(3);
  167.   lcd_print_blank_line(4);
  168. }
  169.  
  170. void lcd_print_blank_line(int lineNumber) {
  171.   // This function 'erases' a given line by printing 20 spaces in it.
  172.   int sLine = lineNumber - 1;
  173.   lcd.setCursor(0, sLine);
  174.   lcd.print("                    ");
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement