неправильно написал код на 6 кнопок

kentforth
Offline
Зарегистрирован: 28.12.2015

Народ, всем привет!

Делаю миди-контроллер на 6 кнопок

-Имеется 6 тактовых кнопок и 6 светодиодов.

Видимо из-за того,что я неправильно написал код светодиоды неправильно срабатывают. К примеру, как я хочу сделать: нажал на кнопку1 и отпустил-загорелся светодиод1, нажал ещё раз на кнопку1 и отпустил, светодиод1 погас. Каждая кнопка не джолжная влиять на другие светодиоды и их состояние. Сейчас же в этом скетче у меня одна кнопка влияет на светодиоды других кнопок.

Помогите разобраться в скетче

#include <MIDI.h>  // INclude MIDI library
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>
MIDI_CREATE_DEFAULT_INSTANCE();
int buttonPin1 = 2;
int buttonPin2 = 3;
int buttonPin3 = 4;
int buttonPin4 = 5;
int buttonPin5 = 6;
int buttonPin6 = 7;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int buttonState5 = 0;
int buttonState6 = 0;
int ledPin1 = 8;
int ledPin2 = 9;
int ledPin3 = 10;
int ledPin4 = 11;
int ledPin5 = 12;
int ledPin6 = 13;
boolean currentState1 = LOW;
boolean currentState2 = LOW;
boolean currentState3 = LOW;
boolean currentState4 = LOW;
boolean currentState5 = LOW;
boolean currentState6 = LOW;
boolean lastState1 = LOW;
boolean lastState2 = LOW;
boolean lastState3 = LOW;
boolean lastState4 = LOW;
boolean lastState5 = LOW;
boolean lastState6 = LOW;
boolean on=false;


void setup() {

  Serial.begin(31250);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
  pinMode(buttonPin6, INPUT);
  MIDI.begin();
  }

 void loop() {

  buttonState1 = digitalRead(buttonPin1);
  currentState1 = digitalRead(buttonPin1);

if (currentState1 == HIGH && lastState1 == LOW) { 
  MIDI.sendNoteOn(36,127,1);
  delay(20);
   MIDI.sendNoteOff(36,0,1);
 }
 if (buttonState1 == HIGH) {
    if(on==true){
      on=false;
    } else{
      on=true;
    }   
 }

if (on == true) {
  digitalWrite(ledPin1, HIGH);
    
}
  else if (currentState1 == LOW && lastState1 == HIGH) {
  digitalWrite(ledPin1, LOW);  
   MIDI.sendNoteOff(36,0,1);  
 }
   lastState1 = currentState1; 

  buttonState2 = digitalRead(buttonPin2);
  currentState2 = digitalRead(buttonPin2);

if (currentState2 == HIGH && lastState2 == LOW) { 
  MIDI.sendNoteOn(37,127,1);
  delay(20);
   MIDI.sendNoteOff(37,0,1);
 }
 if (buttonState2 == HIGH) {
    if(on==true){
      on=false;
    } else{
      on=true;
    }   
 }

if (on == true) {
  digitalWrite(ledPin2, HIGH);
    
}
  else if (currentState2 == LOW && lastState2 == HIGH) {
  digitalWrite(ledPin2, LOW);  
   MIDI.sendNoteOff(37,0,1);  
 }
   lastState2 = currentState2;  

  buttonState3 = digitalRead(buttonPin3);
  currentState3 = digitalRead(buttonPin3);

if (currentState3 == HIGH && lastState3 == LOW) { 
  MIDI.sendNoteOn(38,127,1);
  delay(20);
   MIDI.sendNoteOff(38,0,1);
 }
 if (buttonState3 == HIGH) {
    if(on==true){
      on=false;
    } else{
      on=true;
    }   
 }

if (on == true) {
  digitalWrite(ledPin3, HIGH);
    
}
  else if (currentState3 == LOW && lastState3 == HIGH) {
  digitalWrite(ledPin3, LOW);  
   MIDI.sendNoteOff(38,0,1);  
 }
   lastState3 = currentState3; 

  buttonState4 = digitalRead(buttonPin4);
  currentState4 = digitalRead(buttonPin4);

if (currentState4 == HIGH && lastState4 == LOW) { 
  MIDI.sendNoteOn(39,127,1);
  delay(20);
   MIDI.sendNoteOff(39,0,1);
 }
 if (buttonState4 == HIGH) {
    if(on==true){
      on=false;
    } else{
      on=true;
    }   
 }

if (on == true) {
  digitalWrite(ledPin4, HIGH);
    
}
  else if (currentState4 == LOW && lastState4 == HIGH) {
  digitalWrite(ledPin4, LOW);  
   MIDI.sendNoteOff(39,0,1);  
 }
   lastState4 = currentState4; 
 
  buttonState5 = digitalRead(buttonPin5);
  currentState5 = digitalRead(buttonPin5);

if (currentState5 == HIGH && lastState5 == LOW) { 
  MIDI.sendNoteOn(40,127,1);
  delay(20);
   MIDI.sendNoteOff(40,0,1);
 }
 if (buttonState5 == HIGH) {
    if(on==true){
      on=false;
    } else{
      on=true;
    }   
 }

if (on == true) {
  digitalWrite(ledPin5, HIGH);
    
}
  else if (currentState5 == LOW && lastState5 == HIGH) {
  digitalWrite(ledPin5, LOW);  
   MIDI.sendNoteOff(40,0,1);  
 }
   lastState5 = currentState5; 

  buttonState6 = digitalRead(buttonPin6);
  currentState6 = digitalRead(buttonPin6);

if (currentState6 == HIGH && lastState6 == LOW) { 
  MIDI.sendNoteOn(41,127,1);
  delay(20);
   MIDI.sendNoteOff(41,0,1);
 }
 if (buttonState6 == HIGH) {
    if(on==true){
      on=false;
    } else{
      on=true;
    }   
 }

if (on == true) {
  digitalWrite(ledPin6, HIGH);
    
}
  else if (currentState6 == LOW && lastState6 == HIGH) {
  digitalWrite(ledPin6, LOW);  
   MIDI.sendNoteOff(41,0,1);  
 }
   lastState6 = currentState6; 

 delay(200);
}

 

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
if (button[0].event_click_Up) {digitalWrite(10, !digitalRead(10));}
//...........
if (button[9].event_click_Up) {digitalWrite(19, !digitalRead(19));}

#367

!!! с этим delay(); работать не будет

T.Rook
Offline
Зарегистрирован: 05.03.2016

перменная "on" - одна на все каналы?

kentforth
Offline
Зарегистрирован: 28.12.2015

T.Rook пишет:

перменная "on" - одна на все каналы?

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

kentforth
Offline
Зарегистрирован: 28.12.2015

Клапауций 112 пишет:

if (button[0].event_click_Up) {digitalWrite(10, !digitalRead(10));}
//...........
if (button[9].event_click_Up) {digitalWrite(19, !digitalRead(19));}

#367

!!! с этим delay(); работать не будет

 

Где вы это взяли? у меня нет этого в коде

T.Rook
Offline
Зарегистрирован: 05.03.2016

kentforth пишет:

я не знаю вообще как она работает эта переменная,.... увидел где-то в другом проекте и тупо скопировал.

Это печалька :( Ну если не хотите/можете осознать как это работает , то просто размножьте "on" на "on1".."on6", аналогично другим переменным соответсвенно каналу. 

kentforth
Offline
Зарегистрирован: 28.12.2015

T.Rook пишет:

kentforth пишет:

я не знаю вообще как она работает эта переменная,.... увидел где-то в другом проекте и тупо скопировал.

Это печалька :( Ну если не хотите/можете осознать как это работает , то просто размножьте "on" на "on1".."on6", аналогично другим переменным соответсвенно каналу. 

в этом и есть видимо проблема, а можете написать код для этой перменной on для двух кнопок? остальные я додумаю как сделать

T.Rook
Offline
Зарегистрирован: 05.03.2016

kentforth пишет:

... а можете написать код для этой перменной on для двух кнопок? остальные я додумаю как сделать

Так написал же - "размножить аналогично другим переменным"

Раздел форума "Программирование" для тех, кто пытается познать и сделать сам. Можем обсудить что у Вас не получается в реализации совета данного в #5. Только так. Только вперед по дороге ЗНАНИЯ.

Если написать за Вас - то это в "ищу исполнителя".

 

kentforth
Offline
Зарегистрирован: 28.12.2015

T.Rook пишет:

kentforth пишет:

... а можете написать код для этой перменной on для двух кнопок? остальные я додумаю как сделать

Так написал же - "размножить аналогично другим переменным"

Раздел форума "Программирование" для тех, кто пытается познать и сделать сам. Можем обсудить что у Вас не получается в реализации совета данного в #5. Только так. Только вперед по дороге ЗНАНИЯ.

Если написать за Вас - то это в "ищу исполнителя".

 

 

Я не программист, и вообще далек от этого,скорее музыкант. Но как я пойму как должно быть,если изначально не знаю как должна строиться эта переменная,должно ли что-то в шапке написано,кроме того,что написано в секции loop,  если я хочу использовать эту переменную на несколько кнопок,а не на одну?

T.Rook
Offline
Зарегистрирован: 05.03.2016

kentforth пишет:

,скорее музыкант.

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

На каждый канал так:

в шапке:

boolean on1= false;

в loop в соответствующих местах:

if (on1==true){ on1=false;}

else {on1=true;}

Следующий ответ только по предоставлению кода в котором Вы пытались.

kentforth
Offline
Зарегистрирован: 28.12.2015

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

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

kentforth пишет:

Где вы это взяли? у меня нет этого в коде

пристрелите пианиста.