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

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

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

 

001#include <SoftwareSerial.h>
002#include "SeeedGroveMP3.h"
003#include "KT403A_Player.h"
004#include "WT2003S_Player.h"
005#include <Keypad.h> // подключаем библиотеку для управление клавиатурой
006#include "Adafruit_NeoPixel.h"
007 
008#define ShowSerial Serial
009#define LED_COUNT 119
010#define LED_PIN 22
011 
012unsigned long last_time;
013const byte ROWS = 4; //число строк у нашей клавиатуры
014const byte COLS = 4; //число столбцов у нашей клавиатуры
015char hexaKeys[ROWS][COLS] = {// здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования
016{'4','8','#','D'},
017{'3','7','*','C'},
018{'2','6','0','B'},
019{'1','5','9','A'}
020};
021const int ledPin1 =  36;// номер порта для кнопки 1
022const int ledPin2 =  38;// номер порта для кнопки 2
023const int ledPin3 =  40;// номер порта для кнопки 3
024const int ledPin4 =  42;// номер порта для кнопки 4
025const int ledPin5 =  44;// номер порта для кнопки 5
026const int ledPin6 =  46;// номер порта для кнопки 6
027const int ledPin7 =  48;// номер порта для кнопки 7
028int ledState = LOW; // по умолчанию кнопка 1 выключена
029 
030byte rowPins[ROWS] = {9, 8, 7, 6}; //к каким выводам подключаем управление строками
031byte colPins[COLS] = {5, 4, 3, 2}; //к каким выводам подключаем управление столбцами
032 
033Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
034Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
035 
036#ifdef __AVR__
037    #include <SoftwareSerial.h>
038    SoftwareSerial SSerial(10, 11); // RX, TX
039    #define COMSerial SSerial
040    #define ShowSerial Serial
041    MP3Player<WT2003S<SoftwareSerial>> Mp3Player;
042    //MP3Player<KT403A<SoftwareSerial>> Mp3Player;
043#endif
044 
045#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
046    #define COMSerial Serial1
047    #define ShowSerial SerialUSB
048    MP3Player<WT2003S<Uart>> Mp3Player;
049    //MP3Player<KT403A<Uart>> Mp3Player;
050#endif
051 
052#ifdef ARDUINO_ARCH_STM32F4
053    #define COMSerial Serial
054    #define ShowSerial SerialUSB
055    MP3Player<WT2003S<HardwareSerial>> Mp3Player;
056    //MP3Player<KT403A<HardwareSerial>> Mp3Player;
057#endif
058 
059static uint8_t recv_cmd[8] = {};
060 
061void setup() {
062    pinMode(ledPin1, OUTPUT);
063    pinMode(ledPin2, OUTPUT);
064    pinMode(ledPin3, OUTPUT);
065    pinMode(ledPin4, OUTPUT);
066    pinMode(ledPin5, OUTPUT);
067    pinMode(ledPin6, OUTPUT);
068    pinMode(ledPin7, OUTPUT);
069    strip.begin(); //Инициализируем ленту.
070    ShowSerial.begin(9600);
071    COMSerial.begin(9600);
072    while (!ShowSerial);
073    while (!COMSerial);
074    delay(100);
075    Mp3Player.controller->init(COMSerial);
076    printMenu();
077}
078 
079 
080 
081void loop() {
082   
083                             
084    uint8_t len = 0;
085    uint8_t i;
086 
087    char customKey = customKeypad.getKey();//записывем нажатый символ
088    if (millis() - last_time > 50000)
089    {
090                for (int o = 0; o < LED_COUNT; o++)
091                {               
092                last_time = millis();
093                strip.setPixelColor(o, strip.Color(255, 255, 0));
094                strip.show();
095                }  
096    }
097     
098    if (customKey == '1'){//если что-то нажато
099                Serial.println(customKey);//выводим нажатый символ в монитор порта
100                Mp3Player.controller->volume (50);
101                Mp3Player.controller->playSDSong ("0001.mp3");
102                Serial.println("Pause or Resume the MP3 player");
103                digitalWrite(ledPin7, LOW);//выключаем кнопки
104                digitalWrite(ledPin6, LOW);//выключаем кнопки
105                digitalWrite(ledPin5, LOW);//выключаем кнопки
106                digitalWrite(ledPin4, LOW);//выключаем кнопки
107                digitalWrite(ledPin3, LOW);//выключаем кнопки
108                digitalWrite(ledPin2, LOW);//выключаем кнопки
109                digitalWrite(ledPin1, HIGH);//подсвечиваем кнопку
110                last_time = millis();               
111                for (int o = 0; o < LED_COUNT; o++)
112                {
113                strip.setPixelColor(o, strip.Color(0, 0, 0));
114                strip.show();
115                }                             
116                for (int o = 0; o < 18; o++)
117                {
118                strip.setPixelColor(o, strip.Color(255, 0, 0));
119                strip.show();
120                }
121     
122                }
123     
124    if (customKey == '2'){//если что-то нажато
125                Serial.println(customKey);//выводим нажатый символ в монитор порта
126                Mp3Player.controller->volume (50);
127                Mp3Player.controller->playSDSong ("0002.mp3");
128                Serial.println("Play the next song");
129                digitalWrite(ledPin7, LOW);//выключаем кнопки
130                digitalWrite(ledPin6, LOW);//выключаем кнопки
131                digitalWrite(ledPin5, LOW);//выключаем кнопки
132                digitalWrite(ledPin4, LOW);//выключаем кнопки
133                digitalWrite(ledPin3, LOW);//выключаем кнопки
134                digitalWrite(ledPin2, HIGH);//выключаем кнопки
135                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
136                last_time = millis();
137                for (int o = 0; o < LED_COUNT; o++)
138                {
139                strip.setPixelColor(o, strip.Color(0, 0, 0));
140                strip.show();
141                }                                               
142                for (int o = 0; o < 36; o++)
143                {
144                strip.setPixelColor(o, strip.Color(0, 255, 0));
145                strip.show();
146                }
147     
148                }
149 
150    if (customKey == '3'){//если что-то нажато
151                Serial.println(customKey);//выводим нажатый символ в монитор порта
152                Mp3Player.controller->volume (50);
153                Mp3Player.controller->playSDSong ("0003.mp3");
154                Serial.println("Play the next song");
155                digitalWrite(ledPin7, LOW);//выключаем кнопки
156                digitalWrite(ledPin6, LOW);//выключаем кнопки
157                digitalWrite(ledPin5, LOW);//выключаем кнопки
158                digitalWrite(ledPin4, LOW);//выключаем кнопки
159                digitalWrite(ledPin3, HIGH);//выключаем кнопки
160                digitalWrite(ledPin2, LOW);//выключаем кнопки
161                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
162                last_time = millis();               
163                for (int o = 0; o < LED_COUNT; o++)
164                {
165                strip.setPixelColor(o, strip.Color(0, 0, 0));
166                strip.show();
167                }                                               
168                for (int o = 0; o < 54; o++)
169                {
170                strip.setPixelColor(o, strip.Color(0, 0, 255));
171                strip.show();
172                }
173     
174                }
175 
176    if (customKey == '4'){//если что-то нажато
177                Serial.println(customKey);//выводим нажатый символ в монитор порта
178                Mp3Player.controller->volume (50);
179                Mp3Player.controller->playSDSong ("0004.mp3");
180                Serial.println("Play the next song");
181                digitalWrite(ledPin7, LOW);//выключаем кнопки
182                digitalWrite(ledPin6, LOW);//выключаем кнопки
183                digitalWrite(ledPin5, LOW);//выключаем кнопки
184                digitalWrite(ledPin4, HIGH);//выключаем кнопки
185                digitalWrite(ledPin3, LOW);//выключаем кнопки
186                digitalWrite(ledPin2, LOW);//выключаем кнопки
187                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
188                last_time = millis();               
189                for (int o = 0; o < LED_COUNT; o++)
190                {
191                strip.setPixelColor(o, strip.Color(0, 0, 0));
192                strip.show();
193                }                                                               
194                for (int o = 0; o < 72; o++)
195                {
196                strip.setPixelColor(o, strip.Color(255, 0, 0));
197                strip.show();
198                }
199     
200                }
201 
202    if (customKey == '5'){//если что-то нажато
203                Serial.println(customKey);//выводим нажатый символ в монитор порта
204                Mp3Player.controller->volume (50);
205                Mp3Player.controller->playSDSong ("0005.mp3");
206                Serial.println("Play the next song");
207                digitalWrite(ledPin7, LOW);//выключаем кнопки
208                digitalWrite(ledPin6, LOW);//выключаем кнопки
209                digitalWrite(ledPin5, HIGH);//выключаем кнопки
210                digitalWrite(ledPin4, LOW);//выключаем кнопки
211                digitalWrite(ledPin3, LOW);//выключаем кнопки
212                digitalWrite(ledPin2, LOW);//выключаем кнопки
213                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
214                last_time = millis();               
215                for (int o = 0; o < LED_COUNT; o++)
216                {
217                strip.setPixelColor(o, strip.Color(0, 0, 0));
218                strip.show();
219                }                                                                               
220                for (int o = 0; o < 90; o++)
221                {
222                strip.setPixelColor(o, strip.Color(0, 255, 0));
223                strip.show();
224                }
225     
226                }
227 
228    if (customKey == '6'){//если что-то нажато
229                Serial.println(customKey);//выводим нажатый символ в монитор порта
230                Mp3Player.controller->volume (50);
231                Mp3Player.controller->playSDSong ("0006.mp3");
232                Serial.println("Play the next song");
233                digitalWrite(ledPin7, LOW);//выключаем кнопки
234                digitalWrite(ledPin6, HIGH);//выключаем кнопки
235                digitalWrite(ledPin5, LOW);//выключаем кнопки
236                digitalWrite(ledPin4, LOW);//выключаем кнопки
237                digitalWrite(ledPin3, LOW);//выключаем кнопки
238                digitalWrite(ledPin2, LOW);//выключаем кнопки
239                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
240                last_time = millis();                
241                for (int o = 0; o < LED_COUNT; o++)
242                {
243                strip.setPixelColor(o, strip.Color(0, 0, 0));
244                strip.show();
245                }                                                                              
246                for (int o = 0; o < 119; o++)
247                {
248                strip.setPixelColor(o, strip.Color(0, 0, 255));
249                strip.show();
250                }
251     
252                }
253 
254    if (customKey == '7'){//если что-то нажато
255                Serial.println(customKey);//выводим нажатый символ в монитор порта
256                Mp3Player.controller->volume (50);
257                Mp3Player.controller->playSDSong ("0007.mp3");
258                Serial.println("Play the next song");
259                digitalWrite(ledPin7, HIGH);//выключаем кнопки
260                digitalWrite(ledPin6, LOW);//выключаем кнопки
261                digitalWrite(ledPin5, LOW);//выключаем кнопки
262                digitalWrite(ledPin4, LOW);//выключаем кнопки
263                digitalWrite(ledPin3, LOW);//выключаем кнопки
264                digitalWrite(ledPin2, LOW);//выключаем кнопки
265                digitalWrite(ledPin1, LOW);//подсвечиваем кнопку
266                last_time = millis();                
267                for (int o = 0; o < LED_COUNT; o++)
268                {
269                strip.setPixelColor(o, strip.Color(0, 0, 0));
270                strip.show();
271                }                                                                              
272                for (int o = 0; o < 119; o++)
273                {
274                strip.setPixelColor(o, strip.Color(0, 0, 255));
275                strip.show();
276                }
277     
278                }
279 
280 
281    if (Serial.available()) {
282        char chr = '\0';
283        while (chr != '\n') { // Blockly read data from serial monitor
284            chr = Serial.read();
285            // Serial.print(chr);
286            recv_cmd[len++] = chr;
287        }
288    }
289 
290    if (len > 0) {
291        // Print reveiced data
292        // Serial.print("Received cmd: ");
293        // for(i = 0; i < len; i++) {
294        //     Serial.print(recv_cmd[i]);
295        //     Serial.print(" ");
296        // }
297        // Serial.println();
298 
299        switch (recv_cmd[0]) {
300            case 'p':
301                Mp3Player.controller->pause_or_play();
302                Serial.println("Pause or Resume the MP3 player");
303                break;
304            case 'n':
305                Mp3Player.controller->next();
306                Serial.println("Play the next song");
307                break;
308            case 'l':
309                Mp3Player.controller->previous();
310                Serial.println("Play the previous song");
311                break;
312            case '+':
313                ShowSerial.print("Volume Raise: ");
314                Mp3Player.controller->volumeUp();
315                break;
316            case '-':
317                ShowSerial.println("Volume down: ");
318                Mp3Player.controller->volumeDown();
319                break;
320            default:
321                printMenu();
322                break;
323        }
324 
325    }
326    
327 
328}
329 
330void printMenu(void) {
331    ShowSerial.println("MP3 Command List:");
332    ShowSerial.println("-----------------");
333    ShowSerial.println("'+' or '-'  : raise/lower volume");
334    ShowSerial.println("'p'         : play or pause");
335    ShowSerial.println("'n'         : next song");
336    ShowSerial.println("'l'         : next song");
337    ShowSerial.println("Any other key to show this menu");
338    ShowSerial.println();
339}

 

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

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