Menu

Тема в разделе "Arduino & Shields", создана пользователем ИванМорозов, 28 июл 2017.

  1. Привет , прошу о помощи , не секрет нашёл его в инрнете , залил , но при перезаключение вверх и вниз , меню как БЕШАННЫЕ, бегают . Если не сложно подскажите что да как .
    Код (C++):
    /*+++++++++++++++++++++++++++++++++++++++++++++++++++
    Author : Fahmi Ghani
    Date : 5 July 2015
    Project : LCD Menu Function
    Component : LCD Keypad shield
    Description : Simple Menu function on LCD
    Button Function:
    Up/Down - change Menu Page
    Select - enter page
    Left - Exit
    Video Link: http://youtu.be/cMqif5ICS5M
    +++++++++++++++++++++++++++++++++++++++++++++++++++*/

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
    int keypad_pin = A0;
    int keypad_value = 0;
    int keypad_value_old = 0;
    char btn_push;
    byte mainMenuPage = 1;
    byte mainMenuPageOld = 1;
    byte mainMenuTotal = 4;
    void setup()
    {
    lcd.init(); // initialize the lcd
    lcd.clear();
    lcd.backlight();
    MainMenuDisplay();
    delay(1000);
    }
    void loop()
    {
    btn_push = ReadKeypad();
    MainMenuBtn();
    if(btn_push == 'S')//enter selected menu
    {
    WaitBtnRelease();
    switch (mainMenuPage)
    {
    case 1:
    MenuA();
    break;
    case 2:
    MenuB();
    break;
    case 3:
    MenuC();
    break;
    case 4:
    MenuD();
    break;
    }
    MainMenuDisplay();
    WaitBtnRelease();
    }
    delay(10);
    }//-------------— End of loop() loop —-------------------
    void MenuA()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu A");
    while(ReadKeypad()!= 'L')
    {
    //Insert Task for Menu A here
    }
    }
    void MenuB()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu B");
    while(ReadKeypad()!= 'L')
    {
    //Insert Task for Menu B here
    }
    }
    void MenuC()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu C");
    while(ReadKeypad()!= 'L')
    {
    //Insert Task for Menu C here
    }
    }
    void MenuD()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu D");
    while(ReadKeypad()!= 'L')
    {
    //Insert Task for Menu D here
    }
    }
    void MainMenuDisplay()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    switch (mainMenuPage)
    {
    case 1:
    lcd.print("1. Menu A");
    break;
    case 2:
    lcd.print("2. Menu B");
    break;
    case 3:
    lcd.print("3. Menu C");
    break;
    case 4:
    lcd.print("4. Menu D");
    break;
    }
    }
    void MainMenuBtn()
    {
    WaitBtnRelease();
    if(btn_push == 'U')
    {
    mainMenuPage++;
    if(mainMenuPage > mainMenuTotal)
    mainMenuPage = 1;
    }
    else if(btn_push == 'D')
    {
    mainMenuPage--;
    if(mainMenuPage == 0)
    mainMenuPage = mainMenuTotal;
    }
    if(mainMenuPage != mainMenuPageOld) //only update display when page change
    {
    MainMenuDisplay();
    mainMenuPageOld = mainMenuPage;
    }
    }
    char ReadKeypad()
    {
    /* Keypad button analog Value
    no button pressed 1023
    select 741
    left 513
    down 454
    up 341
    right 0

    мое
    1 -0
    2 -340
    3 -453
    4 -511
    */

    keypad_value = analogRead(keypad_pin);
    if(keypad_value < 50) // вниз
    return 'L';
    else if(keypad_value < 400)
    return 'U'; // вних
    else if(keypad_value < 500)
    return 'D'; // вверх

    else if(keypad_value < 600)
    return 'S'; // ок

    }
    void WaitBtnRelease()
    {
    while( analogRead(keypad_pin) < 200){}

    }
     
  2. vector99

    vector99 Гик

    Вот здесь сможеш найти ответ на свой вопрос https://sohabr.net/habr/post/251181/
    Проблема в опросе кнопок, нужно устанавливать границы от и до
    Код (C++):
     if((keypad_value >300) && (keypad_value<400))
    return 'U'; // вниз
    Примерно так!
     
    Последнее редактирование: 28 июл 2017
  3. 9xA59kK

    9xA59kK Гик

    Еще есть проблема дребезга контактов кнопок. С которой тебе придется разбираться.