Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Reddit menu example - May 8, 2019
- Displays a multi-level menu on a 20x4 LCD screen, with 5-button navigation.
- Board = Uno
- Other hardware: 20x4 I2C LCD
- 5 series-resistive buttons
- Button 1 should be left, button 2 down, button 3 up, button 4 right. 5 = select.
- buttons, resistors, pin levels:
- 1 220Ω 394
- 2 470Ω 329
- 3 1KΩ 264
- 4 2.2KΩ 194
- 5 4.7KΩ 114
- */
- #include "Wire.h" // For I2C (standard Arduino IDE library)
- #include "LiquidCrystal_I2C.h" // Library location --- https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c
- LiquidCrystal_I2C lcd(0x27, 20, 4); // 0x27 is -usually- the default I2C bus address of the backpack
- int buttonInput_pin = A0; // The physical input pin for buttons.
- int buttonInput_pinValue = 0; // This is used for storing the actual pin value.
- int button_pressed_current_value = 0;
- int button_pressed_previous_value = 0;
- // The variables below are used to debounce button presses.
- // The buttons are going to be checked ten times a second.
- // 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.
- bool buttons_enabled = true; // Used for debouncing buttons.
- int button_debounce_time = 100; // A time in milliseconds to debounce the buttons.
- unsigned long button_press_begin_time = 0;
- unsigned long button_press_current_time = 0;
- void setup() {
- Serial.begin(9600);
- lcd.init();
- // buttonInput_pin is analogRead(), doesn't require declaration
- // I2C pins A4, A5 are fixed and don't require declaration
- lcd_clear_all_lines();
- button_pressed__no_button();
- Serial.println("Exiting setup()");
- }
- void loop() {
- if (buttons_enabled == true) {
- check_buttons();
- start_button_timer();
- }
- else {
- check_button_timer();
- }
- } // end of main loop
- void check_buttons() {
- button_pressed_current_value = analogRead(buttonInput_pin);
- if (button_pressed_previous_value < 50 && button_pressed_current_value > 50) {
- lcd_print_blank_line(1);
- if (button_pressed_current_value > 50 && button_pressed_current_value < 130) {
- button_pressed__select();
- }
- if (button_pressed_current_value > 180 && button_pressed_current_value < 220) {
- button_pressed__right();
- }
- if (button_pressed_current_value > 230 && button_pressed_current_value < 290) {
- button_pressed__up();
- }
- if (button_pressed_current_value > 300 && button_pressed_current_value < 360) {
- button_pressed__down();
- }
- if (button_pressed_current_value > 370 && button_pressed_current_value < 430) {
- // left button
- button_pressed__left();
- }
- }
- button_pressed_previous_value = button_pressed_current_value;
- }
- void button_pressed__select() {
- lcd.setCursor(0, 0);
- lcd.print("button = select");
- Serial.println("button = select");
- delay(2000);
- button_pressed__no_button();
- }
- void button_pressed__right() {
- lcd.setCursor(0, 0);
- lcd.print("button = right");
- Serial.println("button = right");
- delay(2000);
- button_pressed__no_button();
- }
- void button_pressed__up() {
- lcd.setCursor(0, 0);
- lcd.print("button = up");
- Serial.println("button = up");
- delay(2000);
- button_pressed__no_button();
- }
- void button_pressed__down() {
- lcd.setCursor(0, 0);
- lcd.print("button = down");
- Serial.println("button = down");
- delay(2000);
- button_pressed__no_button();
- }
- void button_pressed__left() {
- lcd.setCursor(0, 0);
- lcd.print("button = left");
- Serial.println("button = left");
- delay(2000);
- button_pressed__no_button();
- }
- void button_pressed__no_button() {
- lcd_print_blank_line(1);
- lcd.setCursor(0, 1);
- lcd.print("button = none");
- Serial.println("button = none");
- }
- void start_button_timer() {
- // This is for starting the button timer. This is done every time the button input is checked.
- buttons_enabled = false;
- button_press_begin_time = millis();
- }
- void check_button_timer() {
- // This function re-enables the button input if button_debounce_time has passed.
- button_press_current_time = millis();
- if (button_press_current_time >= button_press_begin_time) {
- if (button_press_current_time >= (button_press_begin_time + button_debounce_time)) {
- buttons_enabled = true;
- }
- }
- else {
- button_press_begin_time = millis();
- }
- }
- void lcd_clear_all_lines() {
- lcd_print_blank_line(1);
- lcd_print_blank_line(2);
- lcd_print_blank_line(3);
- lcd_print_blank_line(4);
- }
- void lcd_print_blank_line(int lineNumber) {
- // This function 'erases' a given line by printing 20 spaces in it.
- int sLine = lineNumber - 1;
- lcd.setCursor(0, sLine);
- lcd.print(" ");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement