Убрать дребезг ноты

Hard_User
Offline
Зарегистрирован: 07.09.2018

Имеем передатчик и приемник.

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

когда кнопка отпускается нота тухнет.

Приемник

/*
  Тестирование производилось на Arduino IDE 1.6.11
  Дата тестирования 07.10.2016г.
*/
#include <SoftwareSerial.h>// import the serial library
#include <MIDI.h>  // INclude MIDI library
MIDI_CREATE_DEFAULT_INSTANCE();
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>
#include <SPI.h>                          // Подключаем библиотеку SPI
#include <nRF24L01.h>                     // Подключаем библиотеку nRF24L01 
#include <RF24.h>                         // Подключаем библиотеку RF24 
 
int data[1];                              // Создаём массив для приёма данных
RF24 radio(9,10);                         // Указываем номера выводов nRF24L01+ (CE, CSN)
int LED = 3;                              // Создаем переменную SW1 и указываем номер вывода
 
void setup(void){
    Serial.begin(31250);  // default midi speed rate
  delay(1000);          // Ждем 1с
  pinMode(LED,OUTPUT);        // Устанавливаем вывод 3 на выход
  radio.begin();                          // Инициируем работу nRF24L01+
  radio.setChannel(100);                  // Указываем канал передачи (от 0 до 126)
  radio.setDataRate (RF24_1MBPS);         // Указываем скорость передачи (250KBPS, 1MBPS, 2MBPS)
  radio.setPALevel(RF24_PA_HIGH);         // Указываем мощность передатчика (MIN=-18dBm, LOW=-12dBm, HIGH=-6dBm, MAX=0dBm)
  radio.openReadingPipe(1,0x0123456789LL);// Задаем идентификатором 0x1234567890LL для передачи данных данных 
  radio.startListening  ();
}
 
void loop(void)
{
  if (radio.available()){     // Если в буфере поступили данные
      radio.read(data, 1);      // Считываем данные с массива data и задаем количество считываемых байт                
      if(data[0] == 123){                 // Если в массиве data значение 123 
         digitalWrite(LED, HIGH);
         MIDI.sendNoteOn(36,127,1);}        // Включаем светодиод
                               // Ждем 10мс
   }
  else{           // Если в массиве data другое значение
      digitalWrite(LED, LOW);
      MIDI.sendNoteOff(36,0,1);// Выключаем светодиод
             // Ждем 10мс
   } 
   
}

Передатчик

/*
  Тестирование производилось на Arduino IDE 1.6.11
  Дата тестирования 07.10.2016г.
*/ 
 
#include <SPI.h>                        // Подключаем библиотеку SPI
#include <nRF24L01.h>                   // Подключаем библиотеку nRF24L01 
#include <RF24.h>                       // Подключаем библиотеку RF24 
 
int data[1];                            // Создаём массив для приёма данных
RF24 radio(9,10);                       // Указываем номера выводов nRF24L01+ (CE, CSN)
int button = 7;                         // Создаем переменную button и указываем номер вывода
 
void setup(void){
  pinMode(button, INPUT);    // Устанавливаем вывод 7 на вход
  radio.begin();                        // Инициируем работу nRF24L01+
  radio.setChannel(100);                // Указываем канал передачи (от 0 до 126)
  radio.setDataRate (RF24_1MBPS);       // Указываем скорость передачи (250KBPS, 1MBPS, 2MBPS)
  radio.setPALevel(RF24_PA_HIGH);       // Указываем мощность передатчика (MIN=-18dBm, LOW=-12dBm, HIGH=-6dBm, MAX=0dBm)
  radio.openWritingPipe(0x0123456789LL);// Задаем идентификатором 0x0123456789LL для передачи данных данных 
 }
 
 
void loop(void)
{
  if (digitalRead(button) == LOW){     // Считываем переменную "button", если HIGH идем дальше, если LOW зацикливаемся                     
  data[0] = 123;                        // Записываем значение 123 в массив data
  radio.write(data, 1);}                // Отправляем данные из массива data
}

сейчас слышен дикий дребезг.

Кто подскажет как его устаринить?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Hard_User, а сколько раз у Вас срабатывает передатчик на одно нажатие на кнопку?

Hard_User
Offline
Зарегистрирован: 07.09.2018

я как понял он беспрерывно шлет. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Как написали, так и шлет.

Hard_User
Offline
Зарегистрирован: 07.09.2018

вот ламаю голову как отправить один символ.

На блютузе было так: 

int button = 4;
int oldstate=4; 
void setup() {
  Serial.begin(9600);
  pinMode(button, INPUT);
}

void loop(){
  { 
if(digitalRead(button) == LOW)//если кнопка нажата ...   
{   
Serial.println('R');//отправляем 'R' в сериал попт  
   
while (digitalRead(button)!=HIGH) {delay(1);} // не выходим из цикла пока кнопка не отпущена. 
} 
 if(digitalRead(button) == HIGH)//если кнопка отжажата ... 
 { 
 Serial.println('N');//включаем светодиод 
 
} 
 
}}

  А на радио так не вихоит 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Hard_User, вот ведь интересно: у Вас даже переменная oldstate объявлена. И если бы Вы ее использовали ее по тому назначению, которое следует из ее названия, все у Вас было бы в порядке.

Но ведь не используете...

Вот смотрите, нажали Вы кнопку, контроллер считал с контакта LOW и отправил по радио команду. На этом цикл закончился. И, соответственно, начался новый цикл. Контроллер смотрит - а на кнопке снова LOW, значит надо еще посылать. И он будет делать это до тех пор, пока Вы не отпустите кнопку.

Вам это надо?

Подозреваю, что - нет.

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

А что такое нажатие? Это смена уровня на кнопке с HIGH на LOW. А отпускание - смена с LOW на HIGH.

Значит, нам надо отслеживать не текущее состояние кнопки, а факт ее перехода в другое состояние.

Т.е. есть у нас переменная oldstate. Кстати, ей бы лучше изначально присвоить значение, соответствующее отпущенной кнопки. Во избежание ложных срабатываний.

Терерь мы на каждом проходе цикла читаем состояние кнопки, сравниваем его с состоянием, записанным в oldstate, если состояние изменилось - следует соответствующая реакция, если нет - ничего не делам.

И заканчиваем цикл тем, что переносим новое состояние кнопки в переменную oldstate - тогда на следующем проходе цикла она уже вполне будет оправдывать свое название.

Hard_User
Offline
Зарегистрирован: 07.09.2018

извините за наглость можно хоть примерно это кодом изобразить. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Можно, я не возражаю.