Убрать дребезг ноты
- Войдите на сайт для отправки комментариев
Пт, 07/09/2018 - 23:47
Имеем передатчик и приемник.
идея в том что когда на передетчике срабатывает кнопка должна запускатся нота.
когда кнопка отпускается нота тухнет.
Приемник
/*
Тестирование производилось на 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
}
сейчас слышен дикий дребезг.
Кто подскажет как его устаринить?
Hard_User, а сколько раз у Вас срабатывает передатчик на одно нажатие на кнопку?
я как понял он беспрерывно шлет.
Как написали, так и шлет.
вот ламаю голову как отправить один символ.
На блютузе было так:
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');//включаем светодиод } }}А на радио так не вихоит
Hard_User, вот ведь интересно: у Вас даже переменная oldstate объявлена. И если бы Вы ее использовали ее по тому назначению, которое следует из ее названия, все у Вас было бы в порядке.
Но ведь не используете...
Вот смотрите, нажали Вы кнопку, контроллер считал с контакта LOW и отправил по радио команду. На этом цикл закончился. И, соответственно, начался новый цикл. Контроллер смотрит - а на кнопке снова LOW, значит надо еще посылать. И он будет делать это до тех пор, пока Вы не отпустите кнопку.
Вам это надо?
Подозреваю, что - нет.
Подозреваю, что надо, чтобы на нажатие кнопки отправлял один кода, а на отпускание - другой.
А что такое нажатие? Это смена уровня на кнопке с HIGH на LOW. А отпускание - смена с LOW на HIGH.
Значит, нам надо отслеживать не текущее состояние кнопки, а факт ее перехода в другое состояние.
Т.е. есть у нас переменная oldstate. Кстати, ей бы лучше изначально присвоить значение, соответствующее отпущенной кнопки. Во избежание ложных срабатываний.
Терерь мы на каждом проходе цикла читаем состояние кнопки, сравниваем его с состоянием, записанным в oldstate, если состояние изменилось - следует соответствующая реакция, если нет - ничего не делам.
И заканчиваем цикл тем, что переносим новое состояние кнопки в переменную oldstate - тогда на следующем проходе цикла она уже вполне будет оправдывать свое название.
извините за наглость можно хоть примерно это кодом изобразить.
Можно, я не возражаю.