Простая задача с кнопками

Ваннафлай
Offline
Зарегистрирован: 01.07.2021

Цикл зажигает диодную ленту по одному диоду, когда это происходит другие кнопки не могут сработать, нужно сделать чтобы при нажатии следующей кнопки текущий цикл прерывался и запускался тот который соответствует нажатой кнопке. Всего кнопок 7.

 

#include <SoftwareSerial.h>
#include "SeeedGroveMP3.h"
#include "KT403A_Player.h"
#include "WT2003S_Player.h"
#include <Keypad.h> // подключаем библиотеку для управление клавиатурой
#include "Adafruit_NeoPixel.h"

#define ShowSerial Serial
#define LED_COUNT 119
#define LED_PIN 22

unsigned long last_time;
const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 4; //число столбцов у нашей клавиатуры
char hexaKeys[ROWS][COLS] = {// здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования
{'4','8','#','D'}, 
{'3','7','*','C'},
{'2','6','0','B'},
{'1','5','9','A'}
};
const int ledPin1 =  36;// номер порта для кнопки 1
const int ledPin2 =  38;// номер порта для кнопки 2
const int ledPin3 =  40;// номер порта для кнопки 3
const int ledPin4 =  42;// номер порта для кнопки 4
const int ledPin5 =  44;// номер порта для кнопки 5
const int ledPin6 =  46;// номер порта для кнопки 6
const int ledPin7 =  48;// номер порта для кнопки 7
int ledState = LOW; // по умолчанию кнопка 1 выключена

byte rowPins[ROWS] = {9, 8, 7, 6}; //к каким выводам подключаем управление строками
byte colPins[COLS] = {5, 4, 3, 2}; //к каким выводам подключаем управление столбцами

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

#ifdef __AVR__
    #include <SoftwareSerial.h>
    SoftwareSerial SSerial(10, 11); // RX, TX
    #define COMSerial SSerial
    #define ShowSerial Serial
    MP3Player<WT2003S<SoftwareSerial>> Mp3Player;
    //MP3Player<KT403A<SoftwareSerial>> Mp3Player;
#endif

#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
    #define COMSerial Serial1
    #define ShowSerial SerialUSB
    MP3Player<WT2003S<Uart>> Mp3Player;
    //MP3Player<KT403A<Uart>> Mp3Player;
#endif

#ifdef ARDUINO_ARCH_STM32F4
    #define COMSerial Serial
    #define ShowSerial SerialUSB
    MP3Player<WT2003S<HardwareSerial>> Mp3Player;
    //MP3Player<KT403A<HardwareSerial>> Mp3Player;
#endif

static uint8_t recv_cmd[8] = {};

void setup() {
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
    pinMode(ledPin4, OUTPUT);
    pinMode(ledPin5, OUTPUT);
    pinMode(ledPin6, OUTPUT);
    pinMode(ledPin7, OUTPUT);
    strip.begin(); //Инициализируем ленту.
    ShowSerial.begin(9600);
    COMSerial.begin(9600);
    while (!ShowSerial);
    while (!COMSerial);
    delay(100);
    Mp3Player.controller->init(COMSerial);
    printMenu();
}



void loop() {
  
                            
    uint8_t len = 0;
    uint8_t i;

    char customKey = customKeypad.getKey();//записывем нажатый символ
    if (millis() - last_time > 50000)
    {
                for (int o = 0; o < LED_COUNT; o++)
                {                
                last_time = millis(); 
                strip.setPixelColor(o, strip.Color(255, 255, 0));
                strip.show();
                }   
    }
    
    if (customKey == '1'){//если что-то нажато
                Serial.println(customKey);//выводим нажатый символ в монитор порта
                Mp3Player.controller->volume (50);
                Mp3Player.controller->playSDSong ("0001.mp3");
                Serial.println("Pause or Resume the MP3 player");
                digitalWrite(ledPin7, LOW);//выключаем кнопки
                digitalWrite(ledPin6, LOW);//выключаем кнопки
                digitalWrite(ledPin5, LOW);//выключаем кнопки
                digitalWrite(ledPin4, LOW);//выключаем кнопки
                digitalWrite(ledPin3, LOW);//выключаем кнопки
                digitalWrite(ledPin2, LOW);//выключаем кнопки
                digitalWrite(ledPin1, HIGH);//подсвечиваем кнопку
                last_time = millis();                
                for (int o = 0; o < LED_COUNT; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 0));
                strip.show();
                }                              
                for (int o = 0; o < 18; o++)
                {
                strip.setPixelColor(o, strip.Color(255, 0, 0));
                strip.show();
                }
    
                }
    
    if (customKey == '2'){//если что-то нажато
                Serial.println(customKey);//выводим нажатый символ в монитор порта
                Mp3Player.controller->volume (50);
                Mp3Player.controller->playSDSong ("0002.mp3");
                Serial.println("Play the next song");
                digitalWrite(ledPin7, LOW);//выключаем кнопки
                digitalWrite(ledPin6, LOW);//выключаем кнопки
                digitalWrite(ledPin5, LOW);//выключаем кнопки
                digitalWrite(ledPin4, LOW);//выключаем кнопки
                digitalWrite(ledPin3, LOW);//выключаем кнопки
                digitalWrite(ledPin2, HIGH);//выключаем кнопки
                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
                last_time = millis();
                for (int o = 0; o < LED_COUNT; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 0));
                strip.show();
                }                                                
                for (int o = 0; o < 36; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 255, 0));
                strip.show();
                }
    
                }

    if (customKey == '3'){//если что-то нажато
                Serial.println(customKey);//выводим нажатый символ в монитор порта
                Mp3Player.controller->volume (50);
                Mp3Player.controller->playSDSong ("0003.mp3");
                Serial.println("Play the next song");
                digitalWrite(ledPin7, LOW);//выключаем кнопки
                digitalWrite(ledPin6, LOW);//выключаем кнопки
                digitalWrite(ledPin5, LOW);//выключаем кнопки
                digitalWrite(ledPin4, LOW);//выключаем кнопки
                digitalWrite(ledPin3, HIGH);//выключаем кнопки
                digitalWrite(ledPin2, LOW);//выключаем кнопки
                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
                last_time = millis();                
                for (int o = 0; o < LED_COUNT; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 0));
                strip.show();
                }                                                
                for (int o = 0; o < 54; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 255));
                strip.show();
                }
    
                }

    if (customKey == '4'){//если что-то нажато
                Serial.println(customKey);//выводим нажатый символ в монитор порта
                Mp3Player.controller->volume (50);
                Mp3Player.controller->playSDSong ("0004.mp3");
                Serial.println("Play the next song");
                digitalWrite(ledPin7, LOW);//выключаем кнопки
                digitalWrite(ledPin6, LOW);//выключаем кнопки
                digitalWrite(ledPin5, LOW);//выключаем кнопки
                digitalWrite(ledPin4, HIGH);//выключаем кнопки
                digitalWrite(ledPin3, LOW);//выключаем кнопки
                digitalWrite(ledPin2, LOW);//выключаем кнопки
                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
                last_time = millis();                
                for (int o = 0; o < LED_COUNT; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 0));
                strip.show();
                }                                                                
                for (int o = 0; o < 72; o++)
                {
                strip.setPixelColor(o, strip.Color(255, 0, 0));
                strip.show();
                }
    
                }

    if (customKey == '5'){//если что-то нажато
                Serial.println(customKey);//выводим нажатый символ в монитор порта
                Mp3Player.controller->volume (50);
                Mp3Player.controller->playSDSong ("0005.mp3");
                Serial.println("Play the next song");
                digitalWrite(ledPin7, LOW);//выключаем кнопки
                digitalWrite(ledPin6, LOW);//выключаем кнопки
                digitalWrite(ledPin5, HIGH);//выключаем кнопки
                digitalWrite(ledPin4, LOW);//выключаем кнопки
                digitalWrite(ledPin3, LOW);//выключаем кнопки
                digitalWrite(ledPin2, LOW);//выключаем кнопки
                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
                last_time = millis();                
                for (int o = 0; o < LED_COUNT; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 0));
                strip.show();
                }                                                                                
                for (int o = 0; o < 90; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 255, 0));
                strip.show();
                }
    
                }

    if (customKey == '6'){//если что-то нажато
                Serial.println(customKey);//выводим нажатый символ в монитор порта
                Mp3Player.controller->volume (50);
                Mp3Player.controller->playSDSong ("0006.mp3");
                Serial.println("Play the next song");
                digitalWrite(ledPin7, LOW);//выключаем кнопки
                digitalWrite(ledPin6, HIGH);//выключаем кнопки
                digitalWrite(ledPin5, LOW);//выключаем кнопки
                digitalWrite(ledPin4, LOW);//выключаем кнопки
                digitalWrite(ledPin3, LOW);//выключаем кнопки
                digitalWrite(ledPin2, LOW);//выключаем кнопки
                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
                last_time = millis();                 
                for (int o = 0; o < LED_COUNT; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 0));
                strip.show();
                }                                                                               
                for (int o = 0; o < 119; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 255));
                strip.show();
                }
    
                }

    if (customKey == '7'){//если что-то нажато
                Serial.println(customKey);//выводим нажатый символ в монитор порта
                Mp3Player.controller->volume (50);
                Mp3Player.controller->playSDSong ("0007.mp3");
                Serial.println("Play the next song");
                digitalWrite(ledPin7, HIGH);//выключаем кнопки
                digitalWrite(ledPin6, LOW);//выключаем кнопки
                digitalWrite(ledPin5, LOW);//выключаем кнопки
                digitalWrite(ledPin4, LOW);//выключаем кнопки
                digitalWrite(ledPin3, LOW);//выключаем кнопки
                digitalWrite(ledPin2, LOW);//выключаем кнопки
                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
                last_time = millis();                 
                for (int o = 0; o < LED_COUNT; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 0));
                strip.show();
                }                                                                               
                for (int o = 0; o < 119; o++)
                {
                strip.setPixelColor(o, strip.Color(0, 0, 255));
                strip.show();
                }
    
                }


    if (Serial.available()) {
        char chr = '\0';
        while (chr != '\n') { // Blockly read data from serial monitor
            chr = Serial.read();
            // Serial.print(chr);
            recv_cmd[len++] = chr;
        }
    }

    if (len > 0) {
        // Print reveiced data
        // Serial.print("Received cmd: ");
        // for(i = 0; i < len; i++) {
        //     Serial.print(recv_cmd[i]);
        //     Serial.print(" ");
        // }
        // Serial.println();

        switch (recv_cmd[0]) {
            case 'p':
                Mp3Player.controller->pause_or_play();
                Serial.println("Pause or Resume the MP3 player");
                break;
            case 'n':
                Mp3Player.controller->next();
                Serial.println("Play the next song");
                break;
            case 'l':
                Mp3Player.controller->previous();
                Serial.println("Play the previous song");
                break;
            case '+':
                ShowSerial.print("Volume Raise: ");
                Mp3Player.controller->volumeUp();
                break;
            case '-':
                ShowSerial.println("Volume down: ");
                Mp3Player.controller->volumeDown();
                break;
            default:
                printMenu();
                break;
        }

    }
   

}

void printMenu(void) {
    ShowSerial.println("MP3 Command List:");
    ShowSerial.println("-----------------");
    ShowSerial.println("'+' or '-'  : raise/lower volume");
    ShowSerial.println("'p'         : play or pause");
    ShowSerial.println("'n'         : next song");
    ShowSerial.println("'l'         : next song");
    ShowSerial.println("Any other key to show this menu");
    ShowSerial.println();
}

 

b707
Offline
Зарегистрирован: 26.05.2017

пипец какой гавнокод... Семь одинаковых условий по кнопкам... вы о функциях что-нибудь слышали?

b707
Offline
Зарегистрирован: 26.05.2017

Ваннафлай пишет:

нужно сделать чтобы при нажатии следующей кнопки текущий цикл прерывался и запускался тот который соответствует нажатой кнопке.

песня тоже должна прерываться?

Kakmyc
Offline
Зарегистрирован: 15.01.2018
Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Сделайте всё одной функцией и вставьте в середину цикла strip.setPixelColor(o, strip.Color(0, 0, 255)); опрос кнопок. 

barmaley2m@yandex.ru

или 700 р

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Судя но номерам пинов (стр. 21-27) у клиента Мега2560, а в стр. 38 определяется Софт сериал. Достаточно, чтобы подозревать неадекватность. Я бы не рискнул ;)))

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

А зачем он на меге?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Бармалей пишет:

А зачем он на меге?

про то и говорю :))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мужики, зачем обсуждать качество кода? Это коммерческий раздел и в этом разделе ТС имеет полное право быть абсолютным чайником, который ничего не знает и знать не хочет. В чём проблема-то?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Сорян. Просто человека сюда отправили после вопроса в некоммерческой части. Но ты все равно прав.

Отползаю ;)).

man9913
Offline
Зарегистрирован: 19.03.2016

соглашусь с предпредыдущим каментом .

если бы тс был спецом в аппаратных фичах разных моделей ардуинок, то он вряд ли нуждался бы в услугах оказываемых в этом разделе.

Ваннафлай
Offline
Зарегистрирован: 01.07.2021

да

Ваннафлай
Offline
Зарегистрирован: 01.07.2021

Kakmyc пишет:
1500р kakmycmail@gmail.com

за сегодня получится сделать?

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Сделает.  Там на полчаса работы. 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ваннафлай пишет:

Kakmyc пишет:
1500р kakmycmail@gmail.com

за сегодня получится сделать?

Вполне

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Бармалей пишет:

Сделает.  Там на полчаса работы. 

Это если без мозгов к делу подходить и делать на отьебись.

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Да, делай

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Тем не менее никаких предложений на почту не поступало

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Да он только что тут был. 

Ваннафлай
Offline
Зарегистрирован: 01.07.2021

Kakmyc пишет:
Тем не менее никаких предложений на почту не поступало

написал скинул код

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

А бапки?

man9913
Offline
Зарегистрирован: 19.03.2016

лол, безумный демпинг бармалея отпугивает от него заказчиков.

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Рад, что ты переживаешь за меня. Но я сам отказался. 

man9913
Offline
Зарегистрирован: 19.03.2016

если бы я переживал за каждого бомжа, то поседел бы и умер за неделю, потому и не водится за мной такой привычки. 

а так ты молодец что отказался, а то когда много денег - тоже плохо, растолстел бы ты на колбасе, обленился бы, форму бы потерял. кто бы тут тогда народ смешил, совсем бы форум без тебя загнулся бы.

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Ну это ты Маня, надо фигуру беречь.