jack61 - чтоб создать в этом разделе нормальный заказ - опишите подробно задачу. выложите код приемника и передатчика. И не ведите себя как маленький.
суть проблемы в том что удерживаю кнопку отхожу пока не потеряет связь ,отпускаю кнопку реле не отключается .удерживаю кнопку ,включается реле отключаю пульт реле остается работать Код (C++): #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно //RF24 radio(9,53); // ----------------передатчик ----------- byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб byte button5 = 5; byte button7 = 7; byte button6 = 6; byte button = 2; byte potent2 = 3; byte potent1 = 4; byte potent = 1; byte slider = 0; byte transmit_data[13]; // массив, хранящий передаваемые данные byte latest_data[13]; // массив, хранящий последние переданные данные boolean flag; // флажок отправки данных void setup() { Serial.begin(9600); //открываем порт для связи с ПК radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 10); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } void loop() { transmit_data[12] = map(analogRead(button5), 0, 1023, 0, 180); transmit_data[11] = map(analogRead(button7), 0, 1023, 0, 280); transmit_data[10] = map(analogRead(button6), 0, 1023, 0, 180); transmit_data[9] = map(analogRead(potent2), 0, 1023, 0, 280); transmit_data[8] = map(analogRead(potent2), 0, 1023, 280, 0); transmit_data[7] = map(analogRead(potent1), 0, 1023, 0, 280); transmit_data[6] = map(analogRead(potent1), 0, 1023, 280, 0); transmit_data[5] = map(analogRead(button), 0, 1023, 0, 280); transmit_data[4] = map(analogRead(button), 0, 1023, 280, 0); transmit_data[3] = map(analogRead(slider), 0, 1023, 0, 300); transmit_data[0] = map(analogRead(slider), 0, 1023, 300, 0); transmit_data[1] = map(analogRead(potent), 0, 1023, 0, 300); transmit_data[2] = map(analogRead(potent), 0, 1023, 300, 0); for (int i = 0; i < 3; i++) { // в цикле от 0 до числа каналов if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data flag = 1; // поднять флаг отправки по радио latest_data[i] = transmit_data[i]; // запомнить последнее изменение } } if (flag == 1) { radio.powerUp(); // включить передатчик radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио flag = 0; //опустить флаг radio.powerDown(); // выключить передатчик } } Код (C++): #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <Servo.h> RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно //RF24 radio(9,53); // --------------приемник----------- byte recieved_data[13]; // массив принятых данных byte relay61 = 6; byte relay51 = 5; byte relay = 2; byte relay1= 4; byte relay3 = 7; byte mosfet = 8; byte relay4 = 14; byte relay5 = 15; byte relay6 = 16; byte relay2 = 17; byte relay7 = 18; byte relay8 = 19; byte relay62 = 3; byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб void setup() { Serial.begin(9600); //открываем порт для связи с ПК pinMode(relay, OUTPUT); // настроить пин реле как выход pinMode(mosfet, OUTPUT); // настроить пин мосфета как выход pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); pinMode(relay5, OUTPUT); pinMode(relay6, OUTPUT); pinMode(relay7, OUTPUT); pinMode(relay8, OUTPUT); pinMode(relay61, OUTPUT); pinMode(relay51, OUTPUT); pinMode(relay62, OUTPUT); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 10); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0 radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop() {analogWrite(relay62, recieved_data[12]); byte pipeNo; while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб radio.read( &recieved_data, sizeof(recieved_data) ); analogWrite(relay, recieved_data[0]); //то бишь 0 или 1 analogWrite(relay3, recieved_data[1]); analogWrite(mosfet, recieved_data[2]); analogWrite(relay1, recieved_data[3]); analogWrite(relay5, recieved_data[4]); analogWrite(relay4, recieved_data[5]); analogWrite(relay6, recieved_data[6]); analogWrite(relay2, recieved_data[7]); analogWrite(relay7, recieved_data[8]); analogWrite(relay8, recieved_data[9]); digitalWrite(relay51, recieved_data[11]); analogWrite(relay61, recieved_data[10]); } }
jack61 - для начала разберитесь с ошибками в коде приемника и передатчика. Во-первых, что за контроллер у вас? В комментариях написано, что Уно, но что-то не похоже.Что за странные номера портов в приемнике - аналоговые порты с номерами от 2 до 19? - такого нет ни на Уно, ни на Меге. Во-вторых - посмотрите, как вы упаковываете данные в передатчике. Смотрим на строчки Код (C++): transmit_data[11] = map(analogRead(button7), 0, 1023, 0, 280); transmit_data[10] = map(analogRead(button6), 0, 1023, 0, 180); transmit_data[9] = map(analogRead(potent2), 0, 1023, 0, 280); transmit_data[8] = map(analogRead(potent2), 0, 1023, 280, 0); transmit_data[7] = map(analogRead(potent1), 0, 1023, 0, 280); transmit_data[6] = map(analogRead(potent1), 0, 1023, 280, 0); transmit_data[5] = map(analogRead(button), 0, 1023, 0, 280); transmit_data[4] = map(analogRead(button), 0, 1023, 280, 0); transmit_data[3] = map(analogRead(slider), 0, 1023, 0, 300); transmit_data[0] = map(analogRead(slider), 0, 1023, 300, 0); transmit_data[1] = map(analogRead(potent), 0, 1023, 0, 300); transmit_data[2] = map(analogRead(potent), 0, 1023, 300, 0); Слева у вас элементы массива. Массива типа байт. А справа вы пихаете в них числа диапазона 0.. 280 и 0..300. Вы в курсе какого размера байт? - 0..255! - у вас ни один параметр правильно не передается. В общем, похоже что этот код никуда не годится. Думаю, вам не править этот скетч надо, а заказывать написать приемник и передатчик с нуля. Формулируйте задачу - что именно вам надо передавать, причем описывайте именно задачу(например, радиоуправление роботом), а не код программирования - программировать, вы, похоже, не умеете.
МЕНЯ ПОЛНОСТЬЮ УСТРАИВАЕТ РАБОТА ПРИЕМНИКА И ПЕРЕДАТЧИКА .МНЕ НУЖНО ПРОСТО ЧТОБ ОН НЕ ВЫПОЛНЯЛ ПОСЛЕДНЮЮ ЗАДАЧУ ПРИ ПОТЕРИ СВЯЗИ .
а вот кричать не надо, это некрасиво. Какой МК - вы не ответили. Почему выбраны такие странные пины - тоже. Ну и наконец, если вы сами не видите, что у вас в коде написан бред - то хотя б прислушайтесь к тому, кто разбирается. В общем, если вы еще не поняли, почему никто не хочет с вами связываться - задумайтесь. До свиданья.
Чувак, представленный тобой код - говнище. Просто все стесняются об этом сказать. Добавить функционал, который ты просишь - невозможно. По одной простой причине - изначально не предусмотрено. Зачем передавать пакет в 32 байта? Сколько там реле? 20? На управление ими достаточно 3-х (ТРЕХ, КАРЛ!) байт. Какой МК, как подключены реле, где схема? Ну нет схемы - черт с ней. Я ВСЕГДА делаю так, даже тогда, когда МК совсем малипусенький не говоря уже о случае, когда ног за горизонт. Почему в отдельном файле, а не в main? А можно растабить это дело и сразу смотреть в два окна (у кого два монитора, как у меня на работе - так и совсем удобственно): А код твой надо переписать с НУЛЯ. В общем - у нас бригада из трех человек. И они пьют. И пьют за дорого. Финляндия как минимум. На дешман не зарятся.
По крайней мере один из бригады пьёт всё что пьёцца, по минимальной цене, ну, кроме Кагора, разумееца.
А этот код вообще работает?А то меня терзают смутные сомнения.... Кроме того что правильно заметил Филин Меня смутило вот это Код (C++): void loop() {analogWrite(relay62, recieved_data[12]); byte pipeNo; while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб radio.read( &recieved_data, sizeof(recieved_data) ); [B]analogWrite(relay, recieved_data[0]); //то бишь 0 или 1 analogWrite(relay3, recieved_data[1]); analogWrite(mosfet, recieved_data[2]); analogWrite(relay1, recieved_data[3]); analogWrite(relay5, recieved_data[4]); analogWrite(relay4, recieved_data[5]); analogWrite(relay6, recieved_data[6]); analogWrite(relay2, recieved_data[7]); analogWrite(relay7, recieved_data[8]); analogWrite(relay8, recieved_data[9]); digitalWrite(relay51, recieved_data[11]); analogWrite(relay61, recieved_data[10]);[/B] ШИМ управление релюхой?Как я понял с потенциометра/слайдера если верить коду приёмника.А зачем?И потом в коментах написано что УНО.УНО значит Мега 328.нету у Меги 328 столько ШИМ выходов.А токма 3-5-6-9-10-11.А в коде со 2 по 19.Не будет этот код работать от слова СОВСЕМ.Ну и конечно не только это.ЭТО-то что пежет глаз.
Похоже ТС нашел где то этот код, и пытается использовать, а как работает - не понимает. Там только три первых байта на изменение проверяются, а остальные, похоже, так просто таскаются.
зато его "все устраивает". Короче, есть такие люди, у которых не хватает не то что самому сделать - а даже стырить грамотно.