2 ардуины с nrf24l01. Прием и передача друг другу значений.
- Войдите на сайт для отправки комментариев
Пт, 18/04/2014 - 01:23
Приветствую! Никак не удается заставить две ардуины с nrf24l01 передавать друг другу значения двух
потенциометров. Схемы идентичны, к каждой подключены по 2 потенциометра, и по 2 серво. Каждая
ардуина читает значения своих потенциометров и передает их другой, которая получив их, управляет
серво. Если делать одну ардуину только на передачу, другую только на прием, все работает.
В чем косяк мой? Код ниже (одинаковый для двух ардуин).
#include <Wire.h>
#include <Servo.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
Servo sensA;
Servo sensB;
int msg1[2]; //2 - колличество переменных для передачи
int msg2[2]; //2 - колличество переменных для приема
RF24 radio(9,10); //номера каналов приема и передачи
const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи
int sensor1 = A0; //считываем значение напряжения сенсора 1
int sensor2 = A1; //считываем значение напряжения сенсора 2
int sensor1_val=0; //переменная для хранения значения сенсор 1
int sensor2_val=0; //переменная для хранения значения сенсор 2
void setup(void)
{
radio.begin();
sensA.attach(5);
sensB.attach(6);
}
void loop(void)
{
//сбор и передача данных с 1 ардуины на 2
sensor1_val = analogRead(sensor1);
sensor2_val = analogRead(sensor2);
msg1[0] = sensor1_val; //составляем массив данных для отправки
msg1[1] = sensor2_val;
radio.openWritingPipe(pipe); // Открываем канал передачи
radio.write(msg1, sizeof(msg1)); //передаем данные
//теперь слушаем, что передает вторая ардуина первой..
radio.openReadingPipe(1,pipe); //открываем один из 6-ти каналов приема
radio.startListening(); //начинаем слушать эфир
if (radio.available())
{
bool done = false;
while (!done)
{
done = radio.read(msg2, sizeof(msg2));
}
}
int sensA_val = map(msg2[0], 0, 1023, 0, 180);
sensA.write(sensA_val);
int sensB_val = map(msg2[1], 0, 1023, 0, 180);
sensB.write(sensB_val);
}
Извиняюсь, текст в код при оформлении записался почему то.
Во первых открытие каналов надо вынести в setup ,а во вторых а где radio.stopListening() ,который переводит радиомодуль на передачу ? Вроде примеров на форуме предостаточно..Есть целая тема ,где множество ответов можно найти.
Форум курю сижу. Просто в голове еще не уложилось все. В частности понятно вроде, а в целом - еще не созрел.
#include <Wire.h> #include <Servo.h> #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <RF24_config.h> Servo sensA; Servo sensB; int msg1[2]; //2 - колличество переменных для передачи int msg2[2]; //2 - колличество переменных для приема RF24 radio(9,10); //номера каналов приема и передачи const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи int sensor1 = A0; //считываем значение напряжения сенсора 1 int sensor2 = A1; //считываем значение напряжения сенсора 2 int sensor1_val=0; //переменная для хранения значения сенсор 1 int sensor2_val=0; //переменная для хранения значения сенсор 2 void setup(void) { sensA.attach(5); sensB.attach(6); radio.begin(); radio.openWritingPipe(pipe); // Открываем канал передачи radio.openReadingPipe(1,pipe); //открываем один из 6-ти каналов приема radio.startListening(); //начинаем слушать эфир } void loop(void) { //сбор и передача данных с 1 ардуины на 2 sensor1_val = analogRead(sensor1); sensor2_val = analogRead(sensor2); msg1[0] = sensor1_val; //составляем массив данных для отправки msg1[1] = sensor2_val; radio.stopListening(); radio.write(msg1, sizeof(msg1)); //передаем данные radio.startListening(); //теперь слушаем, что передает вторая ардуина первой.. if (radio.available()) { bool done = false; while (!done) { done = radio.read(msg2, sizeof(msg2)); } } int sensA_val = map(msg2[0], 0, 1023, 0, 180); sensA.write(sensA_val); int sensB_val = map(msg2[1], 0, 1023, 0, 180); sensB.write(sensB_val); }Поправил код по рекомендациям с тем. Однако ничего не изменилось. Ардуины друг друга не видят.
Сдается мне с числом каналов напутал. Или с адресацией. Попробую поковырять код...
На прием и на передачу должны быть разные каналы ,хотя в теории и так может заработать.
У вас не указан канал ,но по умолчанию он всеравно выбран ,и, получается что выбран на обеих одинаково.
Хм. Нашелся такой трабл. В макете у меня две дуины, одна nano, вторая UNO (китайская makerduino UNO). Так вот на нано при работе светодиод L, подключенный к 13 выводу горит вполнакала, ибо нога SCK дергается. А на UNO вообще не горит. Откопал платку мини про, залил скетч, на ней светодиод замигаел.
Хотя когда пробовал однонаправленную связь (nano - передатчик, UNO - приемник) все работало. Похоже в UNO трабл какой то. Пока едут заказанные ардуины, попробую на про мини сгородить и проверить.
MaksMS, спасибо. Не подскажите, какой командой назначаются разные каналы? В 13 строке разве не это делается?
Канал назначается radio.setChannel(25); - это можно увидеть в исходных кодах библиотеки. в 13 строке идет иницилизация модуля используя данные выводы для подключения.
Здесь пример рабочий.
Спасибо, буду ждать ардуины, а пока матчастью займусь. zsm@nxt.ru, в этом примере одностороннее управление одной ардуиной другой. это у меня и так заработало. Я же хочу взаимного управления. Как на видео, только еще прикрутить 2 сервы к ардуине с резисторами а к ардуине с сервами прикрутить резисторы.
Пытался связать две ардуины . Тоже искал примеры . Не нашел . Кое как сваял из всего что нашел на форуме.
Ардуины слушают эфир , и по событию (нажатие кнопки, срабатывание датчика и т.д. ) включ передачу и после опять слушают эфир. Получился говнокод для первой ардуины:
#include <SPI.h> #include "RF24.h" int msg[1]; int RFlag=0; long previousMillis = 0; long interval = 40; RF24 radio(9,10); int LEDpin1 = 5; int LEDpin2 = 6; int LEDpin3 = 8; int buttonPin=7; int buttonAPin=2; int Val; // адреса каналов приема и передачи const uint64_t pipes[2] = { 0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; void setup(void){ radio.begin(); radio.setDataRate(RF24_250KBPS); // Скорость передачи radio.setChannel(100); // Номер канала от 0 до 127 radio.setRetries(15,15); // Кол-во попыток и время между попытками radio.openWritingPipe(pipes[0]); // Открываем канал передачи radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема radio.startListening(); // Начинаем слушать эфир pinMode(LEDpin1, OUTPUT); pinMode(LEDpin2, OUTPUT); pinMode(LEDpin3, OUTPUT); pinMode(buttonPin, INPUT); pinMode(buttonAPin, INPUT); } void loop(void){ if(digitalRead(buttonPin)==HIGH) { msg[0]=1; } if(digitalRead(buttonAPin)==HIGH) { msg[0]=2; } if(digitalRead(buttonPin)==LOW&&digitalRead(buttonAPin)==LOW) { RFlag=0; Val=0; } if((digitalRead(buttonPin)==HIGH&&RFlag==0)||(digitalRead(buttonAPin)==HIGH&&RFlag==0)){ radio.stopListening(); radio.write(msg, 1); radio.startListening(); Val++; if(Val>=20) { Val=21; RFlag=1; } } //**********************************************************************// else { if (radio.available()){ bool done = false; while (!done){ done = radio.read(msg, 1); if (msg[0] == 111){ delay(10); digitalWrite(LEDpin1, HIGH); } if (msg[0] == 112){ delay(10); digitalWrite(LEDpin2, HIGH); } if (msg[0] == 113){ delay(10); digitalWrite(LEDpin1,LOW); } if (msg[0] == 114){ delay(10); digitalWrite(LEDpin2,LOW); } if (msg[0] == 111){ delay(10); digitalWrite(LEDpin3, HIGH); } else{ digitalWrite(LEDpin3, LOW); } } } } }для второй ардуины:
#include <SPI.h> #include "RF24.h" int msg[1]; RF24 radio(9,10); // адреса каналов приема и передачи const uint64_t pipes[2] = { 0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; //кнопки подключены к этим пинам int buttonPin1 = 2; int buttonPin2 = 3; int buttonPin3 = 4; int buttonPin4 = 5; int ledPin=6; int ledRF=7; int RFlag1=0; int RFlag2=0; int RFlag3=0; int RFlag4=0; int Val; void setup(void){ radio.begin(); radio.setDataRate(RF24_250KBPS); // Скорость передачи radio.setChannel(100); // Номер канала от 0 до 127 radio.setRetries(15,15); // Кол-во попыток и время между попытками radio.openWritingPipe(pipes[1]); // Открываем канал передачи radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема radio.startListening(); // Начинаем слушать эфир pinMode(ledPin,OUTPUT); pinMode(ledRF,OUTPUT); pinMode(buttonPin1,INPUT); pinMode(buttonPin2,INPUT); pinMode(buttonPin3,INPUT); pinMode(buttonPin4,INPUT); } void loop(void){ //пока кнопка (buttonPin1)нажата отправляем пакет (111)в Arduino №2 if (digitalRead(buttonPin1) == HIGH&&RFlag1==0){ msg[0] = 111; radio.stopListening(); radio.write(msg, 1); radio.startListening(); Val++; if(Val>=20) { Val=21; RFlag1=1; } } else if (digitalRead(buttonPin2) == HIGH&&RFlag2==0){ msg[0] = 112; radio.stopListening(); radio.write(msg, 1); radio.startListening(); Val++; if(Val>=20) { Val=21; RFlag2=1; } } else if (digitalRead(buttonPin3) == HIGH&&RFlag3==0){ msg[0] = 113; radio.stopListening(); radio.write(msg, 1); radio.startListening(); Val++; if(Val>=20) { Val=21; RFlag3=1; } } else if (digitalRead(buttonPin4) == HIGH&&RFlag4==0){ msg[0] = 114; radio.stopListening(); radio.write(msg, 1); radio.startListening(); Val++; if(Val>=20) { Val=21; RFlag4=1; } } else{ radio.available(); bool done = false; while (!done) { done = radio.read(msg, 1); unsigned long started_waiting_at = millis(); bool timeout = false; while ( ! radio.available() && ! timeout ) if (millis() - started_waiting_at > 100 ) timeout = true; if ( timeout ) { digitalWrite(ledRF,HIGH); } else{ digitalWrite(ledRF,LOW); } if(msg[0]==1) { digitalWrite(ledPin,HIGH); } else if(msg[0]==2) { digitalWrite(ledPin,LOW); } } } if(digitalRead(buttonPin1)==LOW&&digitalRead(buttonPin2)==LOW&&digitalRead(buttonPin3)==LOW&&digitalRead(buttonPin4)==LOW) { Val=0; RFlag1=0; RFlag2=0; RFlag3=0; RFlag4=0; } }У меня работает. Код не откоментирован ,пробный и , 99 процентов не правильный . Но для мои целей подошел.
Но у тебя другие цели. Тебе нужно передавать данные с аналоговых входов,которые изменяются постоянно..
const uint64_t pipes[2] = { 0xF0F0F0F000LL, 0xF0F0F0F0FFLL};4ERTIK, спасибо за пример. В примере все понятно, только вот пояснил бы кто, запись выше. Что мы физически делаем этой командой и чем она отличается от 14 строки моего примера, где в массиве только одно значение. Где об этом можно почитать подробней?
адреса каналов приема и передачи, а у тебя указан только канал приема( гуру поправят если я не прав).
#include <Wire.h> #include <Servo.h> #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <RF24_config.h> Servo sensA; Servo sensB; int msg1[2]; //2 - колличество переменных для передачи int msg2[2]; //2 - колличество переменных для приема RF24 radio(9,10); //номера каналов приема и передачи const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; // адреса каналов приема и передачи int sensor1 = A0; //считываем значение напряжения сенсора 1 int sensor2 = A1; //считываем значение напряжения сенсора 2 int sensor1_val=0; //переменная для хранения значения сенсор 1 int sensor2_val=0; //переменная для хранения значения сенсор 2 void setup(void) { sensA.attach(5); sensB.attach(6); radio.begin(); radio.setDataRate(RF24_250KBPS); // Скорость передачи radio.setChannel(100); // Номер канала от 0 до 127 radio.setRetries(15,15); // Кол-во попыток и время между попытками radio.setPALevel(RF24_PA_MAX); //выходная мощность radio.openWritingPipe(pipes[0]); // Открываем канал передачи radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема radio.startListening(); // Начинаем слушать эфир } void loop(void) { //сбор и передача данных с 1 ардуины на 2 sensor1_val = analogRead(sensor1); sensor2_val = analogRead(sensor2); msg1[0] = sensor1_val; //составляем массив данных для отправки msg1[1] = sensor2_val; radio.stopListening(); radio.write(msg1, sizeof(msg1)); //передаем данные radio.startListening(); //теперь слушаем, что передает вторая ардуина первой.. if (radio.available()) { bool done = false; while (!done) { done = radio.read(msg2, sizeof(msg2)); } } int sensA_val = map(msg2[0], 0, 1023, 0, 180); sensA.write(sensA_val); int sensB_val = map(msg2[1], 0, 1023, 0, 180); sensB.write(sensB_val); }Вот переписал код, сделал канал приема и передачи, добавил конфигурационные строки для NRF24. Вроде должно заработать, но вот проверить в ближайшее время не удасться (( жду модули с Китая.
мне вот интересно.. ну сугубо в иследовательских целях.. вы специально тупите или это врожденое?
тут на эту тему написаны килотонны постов..
тоесть установить простой пример в котором две ардуинки шлют пинги друг другу у вас рука не подымается?
чисто с технической точки зрения попробуйте мне обьяснить как ардуина может отправилять сигнал через РФ24 и не принимать его, или наоборот... я видимо туплю страшно и не могу себе представить такой ситуации..
Конечно туплю. Мало времени еще прошло с момента, когда первые 24 пришли из Китая. Не понимаю, как вы можете этого не понимать по моим постам выше.
Может отправлять и не принимать? На уровне моих пока еще скромных познаний, например не управлять по каким либо причинам выводом, переводящим модуль из приема в передачу. Скорей на уровне железа. Но и мегатонны кодов перелопатить новичку и все понять нелегко. Но процесс идет, я многое уже знаю, например то, что вас то вылечат, а мне с этим жить :) Удачи вам!
Но процесс идет, я многое уже знаю, например то, что вас то вылечат, а мне с этим жить :) Удачи вам!
Красиво "подъебнул" :)
Вы правы, но.... вы вот призываете других понять причины вашего "туплю...", есть ведь и обратная сторона. Почему так реагируют на "тупление".
Кто вам отвечает на форуме? Люди с 30-летним педагогическим стажем или обыкновенные "практики" (или считающие себя таковыми)? Обычные люди, которых раздражают повторения одного и того же. Да банально - плохое настроение может быть. Вы-то "затупили" один раз, а до вас сколько раз это сделали (по этой же теме)?
Да и банально, "знать" и "уметь учить" - не одно и тоже. Вы когда-нибудь пробовали учить езде на велосипеде или плаванию? То что тебе очевидно и ты даже не задумываешься.... вдруг видишь что челвок делает глупости которые тебе даже не пришли бы в голову ;) Первая естественная реакция (!) "ну что за д%№;%;".
И это все накладывается на то, что большинство отвечающих, даже мысленно, "корону учителя" - себе на голову не одевали. Просто общаются на заданную тему. В этом общении может быть и учебная инфа, и "сброс пара", и откровенный стеб (особенно если есть повод. хотя и не обязателен).
И ничего вы с этим не поделаете. Советы вида "проходите мимо" - дадут противоположный эффект ;) Уже были кто проверял это ;) Вообщем "стиснуть зубы, да терпеть..." (C). Судьба новичков :( Просеиваете "породу" форума, выбираете полезные для себя крупицы.
Кстати, на востоке, учитель часто, в отличае от нашего, вообще ничего не объясняет. Он сам задает вопрос и "нещадно пиздит за неправильный ответ" :) И какой "учебный подход" более правильный - бабка надвое гадала.
Многие начинает с "я новичок", "не пинайте меня", "учитывайте...". Как говорила мой школьный зауч "ваши подробности.." ;) В ответ на ЛЮБЫЕ объяснения "почему не сделал домашнее задание, не сдал куртку в гардероб и т.д. и т.п.". Большинству людей - фиолетово на причины вашего незнания. И я благодарен заучу с тем что она рано заставила меня осознать реальное отношение внешнего мира к индивидууму.
Никто же не обещал что "быть новичком" это психологически комфортно ;) . Ну а тут уже есть два пути. Либо "отказатся" и вернутся в привычную зону комфорта. Работать только с тем что уже умеешь и знаешь. Либо перестать быть новичком :) Стимул есть. Сделать эту область "зоной комфорта".
Только потом опять прийдется искать "как выйти из зоны комфорта". Если застрянешь в ней - деградация.
Вообщем "....оплеухи нужней поцелуев, поцелуям мы знаем цену..." (с) Дольский
leshak. Да у меня вообще никаких претензий. Всегда с благодарностью принимаю помощь и советы от более опытных специалистов. Психологию, настроение, 30 лет, просто фильтрую. Да и не подъебывал никого, просто хотел сказать, что не сижу тупо ответа жду, а ищу, читаю форум, учусь, экспериментирую с ардуинами. В программировании МК я пока новичек, но в том, что стану профессионалом не сомневаюсь. Деваться некуда, да и интересно.
А так, любой Форум интересная штука. Вопросы там задают одни новички, как только ты становишься профессионалом, начинаешь только отвечать.
Поэкспериментировал с кодом, как выяснилось работа RF затыкается сразу как в коде появляются строки выше. Если закомментить, односторонняя передача востанавливается. УНА оказалась рабочей.
Тут вы делаете три вещи. Осановку "слушания", передачу, и "старт".
Попробуйте выяснить что же именно мешает. Старт/стоп или "передача. Если write закоментить, а старт/стоп оставить, проблемы остаются?
Тут вы делаете три вещи. Осановку "слушания", передачу, и "старт".
Попробуйте выяснить что же именно мешает. Старт/стоп или "передача. Если write закоментить, а старт/стоп оставить, проблемы остаются?
гыыы, дружище, голова ему мешает и гордость непомерная с ленью попалам.. ему лень прочитать ветку про эти модули потому что она на 60 страниц. но там разобрано все до основания.. ему лень разобратся как работает SPI, и понять одну простую вещь что если модуль работает, то он работает всегда, и возможно просто версия его библиотеки кривая и как то криво обращается к модулю.. выбирай что именно ему мшеает или может все сразу?
Leshak, если закоментить все три строчки, работает в одном направлении. То есть можно управлять той дуиной, в которой закоментены эти строки. Если же раскоментить любую/любые из этих строк, управления нет ни туда ни обратно. Еще заметил что строчки с каналами (код выше) почему то в моем случае должны быть одинаковыми в обеих дуинах. Иначе управления нет. Такой же трабл встречал у кого то в ветке про RF24.
https://github.com/maniacbug/RF24 ,библиотеку отсюда брал.
блин ему гордость не позволяет даже примеры просто попробовать, которые идут с библиотекой.. он сразу свою прогу пихает и удивляется отчего это все так криво...
Это не гордость это детские комплексы :)
Leshak, если закоментить все три строчки, работает в одном направлении.
Вообщем-то я спрашивал что будет если закоментить эту одну строчку. write. Понять что мешает сам факт передачи или остановка/старт прослушки.
Вы же выполнили сразу несколько каких-то изменений. Из чего сделать какой-то вывод одназначный - невозможно.
Если закоментить write, а stop и start не коментить, то:
управления нет ни туда ни обратно.
то есть проблемы остаются
Ладно, думаю эту проблему мне нужно будет решить самому. Спасибо, leshak за помощь. Вам, Puhlyaviy, тоже спасибо.
мне вот интересно.. ну сугубо в иследовательских целях.. вы специально тупите или это врожденое?
В свои 47 могу позволить и тупить . Ну пробовал я разные примеры , боясь спросить здесь на форуме,ничего не получалось . Перечитал от первой до последней страницы тему Nrf24l01 .Заканчивая читать страницу- в голове была еще большая неразбериха. А БУКОВ там на много страниц . С NRF24 я разобрался как-то.... Да , может быть и тупо разобрался. Плеш или Флеш в голове уже не тот...Но понял я одно ...Помочь реально пытаются на этом форуме реально таким тупым как я такие как maksim , leshak и другие. А товарищ Puhlyaviy только остроту своего молодого языка показывает.Или уровень его подготовки не позволяет ему, кроме сарказма и подколов , ничего другого. Лично я на форуме не видел ни одного поста от Puhlyaviy с практической помощью...Может ошибаюсь..Но в подколах он первый... Герой .Ребята , может хорош подкалывать и колоть ?Ну не все здесь програмисты с высшим . Форум для всех.А для юмористов можно завести отдельный раздел.
Все заработало, когда добавил задержку после startListening в void loop. Так же причиной нестабильной работы был выбранный 10 канал, после изменения его на 100 проблемы сбоев исчезли (смотрите сканером наличие помех в канале). Еще у меня были перепутаны CSN и SCK в одном из модулей.
Еще у меня были перепутаны CSN и SCK в одном из модулей.
гыыыыы. где то я такое уже видел.. доктор, не подскажете?
пока доктор на мальдивах, я тоже расскажу, как меня китайцы подкололи. На приобретенном в DX шилде для Mega2560 на всех 72 площадках надписи +5 и GND были перепутаны местами (распаяно как "-+S", а написано как "+-S". Если учесть, что это был мой первый опыт работы с Arduino, подстава была жесткой :)
Почему с добавленой задержкой работает, а без нее нет? С delay вроде контроллер занят и не может (может ошибаюсь) выполнять других действий типа сохранений передачи и тп переменной?
Наверное потому, что после получения команды startListening сам модуль NRF чем-то занят (инициализация радиотракта, подстройка частоты приема/передачи, выбор свободноего канала и др.) И если сразу же отправить ему другие команды, то он их тупо проигнорирует, потому как буфер команд - это удел более дорогих модулей.
Здравствуйте. Нуждаюсь в помощи - не могу решить. Имею скеч на управление кнопками светодиодов. В оригинале в скече светодиоды горят до следующего нажатия на кнопку- Как исправить что бы светодиоды при нажатие светил всего 1 секунду и тухли.
Это оригинал. от - http://mybotic.com.my/webshaper/store/viewProd.asp?pkProductItem=414
#include "NRF24L01.h" //*************************************************** #define TX_ADR_WIDTH 5 //5 неподписанных символы Техас (RX) ширина адрес #define TX_PLOAD_WIDTH 23 // без знака символы Техас полезной нагрузки //define LED pin// определяем LED штифт #define LED1 5 #define LED2 6 #define LED3 7 //define button pin// определить кнопку штифт #define BUTTON1 A0 #define BUTTON2 A1 #define BUTTON3 A2 //*************************************************** unsigned char TX_ADDRESS[TX_ADR_WIDTH] = { 0xaa,0xbb,0xcc,0xdd,0xee }; // Define a static TX address// Определить статический адрес TX unsigned char rx_buf[TX_PLOAD_WIDTH] = {0}; // Инициализировать значение unsigned char tx_buf[TX_PLOAD_WIDTH] = {0};// Инициализировать значение //*************************************************** void setup() // недействительными установки { SPI_DIR = ( CE + SCK_pin + CSN + MOSI_pin); SPI_DIR &=~ ( IRQ + MISO_pin); init_io(); // Инициализировать IO порт unsigned char status=SPI_Read(STATUS); initialize_R_T(); //initialize LEDs// инициализировать светодиодов digitalWrite(LED1, LOW); digitalWrite(LED2, LOW);//индикатор 2 digitalWrite(LED3, LOW); } void loop()// недействительными цикл () { unsigned char Rx_szTemp[1] = {0}; // держать полученные данные //Start TX mode // Запуск режима TX if(digitalRead(BUTTON1) == 0) { RF_SendData("1"); // отправить '1' через модуль РФ } else if(digitalRead(BUTTON2) == 0)// иначе, если { RF_SendData("2"); //send '2' through RF module } else if(digitalRead(BUTTON3) == 0) { RF_SendData("3"); //send '3' through RF module } //RX mode// Режим приема RF_ReceiveData(&Rx_szTemp[0]); // получить данные от модуля РФ if(Rx_szTemp[0] == '1') // если = полученные данные '1' { digitalWrite(LED1, HIGH);// индикатор 1 ВКЛЮЧЕН digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); } else if(Rx_szTemp[0] == '2') // если = полученные данные '2' { digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH);// индикатор 2 ВКЛЮЧЕН digitalWrite(LED3, LOW); } else if(Rx_szTemp[0] == '3') // если = полученные данные '3' { digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH);// индикатор 3 ВКЛЮЧЕН } } //************************************************** // Function: init_io();// Функция: init_io (); // Description:// Описание: // flash led one time,chip enable(ready to TX or RX Mode),// Светодиодной вспышкой один раз, чип позволит (готовый TX RX или режим), // Spi disable,Spi clock line init high// Спи отключить, SPI часы линии инициализировать высокой //************************************************** void init_io(void)//недействительными init_io (недействительными) { SPI_PORT&=~CE; // Чип позволит SPI_PORT|=CSN; // Спи отключить SPI_PORT&=~SCK_pin; // Спи часы линии инициализировать высокой } /************************************************** * Function: SPI_RW();//Функция: SPI_RW (); * * Description:// Описание: * Writes one unsigned char to nRF24L01, and return the unsigned char read * from nRF24L01 during write, according to SPI protocol Пишет один неподписанный символ для NRF24L01, и вернуть неподписанные символ читать * От NRF24L01 во пишут, в соответствии с протоколом SPI **************************************************/ unsigned char SPI_RW(unsigned char Byte)//подписанные символ SPI_RW (неподписанные символ байт) { unsigned char i; //неподписанные символ я; for(i=0;i<8;i++) // выход 8-бит { if(Byte&0x80) //если (байт & 0x80) { SPI_PORT |=MOSI_pin; // Выход "неподписанные символ ', MSB для MOSI_pin } else //другой { SPI_PORT &=~MOSI_pin; } SPI_PORT|=SCK_pin; // Установить SCK_pin высокий .. Byte <<= 1; // Сдвиг следующий бит в MSB .. if(SPI_IN & MISO_pin) //если (SPI_IN & MISO_pin) { Byte |= 1; // Захватить текущее MISO_pin немного } SPI_PORT&=~SCK_pin; // ..то Установить SCK_pin низкий снова } return(Byte); // Возврат прочитать неподписанные символ } /**************************************************/ /************************************************** * Function: SPI_RW_Reg(); // Функция: SPI_RW_Reg (); * * Description:// Описание: * Writes value 'value' to register 'reg'// Записывает значение '' значение для регистрации '' рег /**************************************************/ unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)//неподписанные символ SPI_RW_Reg (неподписанные символ рег, символьное значение без знака) { unsigned char status;// неподписанных статус символ; SPI_PORT&=~CSN; // ДНС низкий, инициализировать сделка SPI status = SPI_RW(reg); // Выбрать регистр SPI_RW(value); // ..и Значение записи к нему .. SPI_PORT|=CSN; // ДНС высокой снова return(status); // Вернуть NRF24L01 статус неподписанные символ } /**************************************************/ /************************************************** * Function: SPI_Read();//Функция: SPI_Read_Buf (); * * Description://Описание: * Read one unsigned char from nRF24L01 register, 'reg'Читайте одну неподписанные символ из регистра NRF24L01, "рег" /**************************************************/ unsigned char SPI_Read(unsigned char reg)//неподписанные символ SPI_Read (неподписанные символ рег) { unsigned char reg_val;// неподписанные символ reg_val; SPI_PORT&=~CSN; // ДНС низкий, инициализировать SPI связь ... SPI_RW(reg); // Выбор зарегистрируйтесь, чтобы читать из .. reg_val = SPI_RW(0); // ..то Прочитать значение регистра SPI_PORT|=CSN; // ДНС высокий, прекратить общение SPI return(reg_val); // Возвращаемое значение регистра } /**************************************************/ /************************************************** * Function: SPI_Read_Buf();//Функция: SPI_Write_Buf (); * * Description://Описание: * Reads 'unsigned chars' #of unsigned chars from register 'reg' //Читает неподписанные символы 'неподписанных симв' #of из 'рег' регистра * Typically used to read RX payload, Rx/Tx address//Обычно используется для чтения RX полезной нагрузки, прием / передача адрес /**************************************************/ unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)//неподписанные символ SPI_Read_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт) { unsigned char status,i;//неподписанных статус символ, я; SPI_PORT&=~CSN; // Установить ДНС низкий, инициализации SPI tranaction status = SPI_RW(reg); // Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ for(i=0;i<bytes;i++) //для (я = 0; я <байт; я ++) { pBuf[i] = SPI_RW(0); // // Выполнить SPI_RW читать неподписанные символ из NRF24L01 } SPI_PORT|=CSN; // Установить ДНС высокой снова return(status); // Вернуть NRF24L01 статус неподписанные символ } /**************************************************/ /************************************************** * Function: SPI_Write_Buf();//Функция: SPI_Write_Buf (); * * Description://Описание: * Writes contents of buffer '*pBuf' to nRF24L01//Записывает содержимое буфера '*', чтобы pBuf NRF24L01 * Typically used to write TX payload, Rx/Tx address//Обычно используется, чтобы написать полезную нагрузку TX, Rx / Tx адрес /**************************************************/ unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)//неподписанные символ SPI_Write_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт) { unsigned char status,i;//неподписанных статус символ, я; SPI_PORT&=~CSN; // Установить ДНС низкий, инициализации SPI tranaction status = SPI_RW(reg); // Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ for(i=0;i<bytes; i++) // затем написать все неподписанные символ в буфере (* pBuf) { SPI_RW(*pBuf++); } SPI_PORT|=CSN; // Установить ДНС высокой снова return(status); // Вернуть NRF24L01 статус неподписанные символ } /**************************************************/ /************************************************** * Function: Initialize TX & RX mode;//Функция: Инициализировать режим TX & RX; * * Description://Описание: * This function initializes one nRF24L01 device to//Эта функция инициализирует один NRF24L01 устройство к * TX mode, set TX address, set RX address for auto.ack,//Режим Техас, установить TX-адрес, установите адрес RX для auto.ack, * fill TX payload, select RF channel, datarate & TX pwr.//Заполнить TX полезной нагрузки, выберите радиочастотный канал, DataRate & TX PWR. * PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX.//PWR_UP установлен, КПР (2 неподписанные символов) включена, и ПРИМ: TX. * * ToDo: One high pulse(>10us) on CE will now send this//ToDo: Один высокий пульс (> 10us) на CE теперь отправить это **************************************************/ void initialize_R_T(void)//недействительными initialize_R_T (недействительными) { SPI_PORT&=~CE; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Записывает TX_Address в NRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 же, как TX_Adr для Auto.Ack SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Включить Auto.Ack: Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Включить Pipe0 SPI_RW_Reg(WRITE_REG + RF_CH, 50); // Выбор радиочастотного канала 50 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x26); // TX_PWR: 0 дБм, DataRate: 250 Мбит, МШУ: HCURR SPI_PORT|=CE; } /************************************************** * Function: TX_Mode(); //Функция: TX_Mode (); * * Description: //Описание: * This function initializes one nRF24L01 device to //Эта функция инициализирует один NRF24L01 устройство к * TX mode, set TX address, set RX address for auto.ack, //Режим Техас, установить TX-адрес, установите адрес RX для auto.ack, * fill TX payload, select RF channel, datarate & TX pwr. //Заполнить TX полезной нагрузки, выберите радиочастотный канал, DataRate & TX PWR. * PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX. //PWR_UP установлен, КПР (2 неподписанные символов) включена, и ПРИМ: TX. * * ToDo: One high pulse(>10us) on CE will now send this //ToDo: Один высокий пульс (> 10us) на CE теперь отправить это * packet and expext an acknowledgment from the RX device. //Пакет и expext подтверждение от устройства RX. **************************************************/ void TX_Mode(void) //недействительными TX_Mode (недействительными) { SPI_PORT&=~CE; SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); // 500us + 86us, 10 Retrans ... SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // Установить PWR_UP немного, включите CRC (2 неподписанные знаков) и Прим: TX. MAX_RT & TX_DS включен .. SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); SPI_PORT|=CE; } /************************************************** * Function: RX_Mode();//Функция: RX_Mode (); * * Description://Описание: * This function initializes one nRF24L01 device to//Эта функция инициализирует один NRF24L01 устройство к * RX Mode, set RX address, writes RX payload width,//RX Режим установите RX адрес, пишет ширину RX полезной нагрузки, * select RF channel, datarate & LNA HCURR.//Выберите радиочастотный канал, DataRate & МШУ HCURR. * After init, CE is toggled high, which means that//После инициализации, CE переключается высокой, что означает, что * this device is now ready to receive a datapacket.//Это устройство готово для приема datapacket. /**************************************************/ void RX_Mode(void)//недействительными RX_Mode (недействительными) { SPI_PORT&=~CE; SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Выбор же RX ширину полезной нагрузки как TX шириной Payload SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //Установить PWR_UP немного, включите CRC (2 неподписанные символов) & Прим: RX. Включен RX_DR .. SPI_PORT|=CE; // Установить CE контактный высокой для того, чтобы устройство RX } //RF transmit data function// Функция передачи данных РФ void RF_SendData(char *TXdata) { TX_Mode(); // Включить режим Tx // activate Tx mode for(short i=0; i<23;i++)// для (короткий я = 0; я <23; я ++) { tx_buf[i] = (unsigned char)*(TXdata+i); // Сохранить данные в массив // store the data to an array } unsigned char status = SPI_Read(STATUS); // Читаем значение регистра статуса в // read register STATUS's value if(status&TX_DS) // если данные готовы получить (TX_DS) прервать // if receive data ready (TX_DS) interrupt { SPI_RW_Reg(FLUSH_TX,0); SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // Запись в TX_FIFO playload } if(status&MAX_RT) // если принимать данные готовые (MAX_RT) прервать это повтора чем SETUP_RETR { SPI_RW_Reg(FLUSH_TX,0); SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // Отключение режима Standy } SPI_RW_Reg(WRITE_REG+STATUS,status); // Ясно RX_DR или TX_DS или MAX_RT флаг прерывания delay(50); RX_Mode(); } //RF receive data function// РФ получить функцию передачи данных void RF_ReceiveData(unsigned char *RXdata)// недействительными RF_ReceiveData (неподписанные символ * RXdata) { RX_Mode(); // Включить режим RX unsigned char status = SPI_Read(STATUS); // Читаем значение регистра статуса в if(status&RX_DR) // если данные готовы получить (TX_DS) прервать { SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH); // Прочитать playload в rx_buf SPI_RW_Reg(FLUSH_RX,0); // Ясно RX_FIFO *RXdata = rx_buf[0]; // передать полученные данные в RXdata Serial.println(rx_buf[0]); } SPI_RW_Reg(WRITE_REG+STATUS,status); // Ясно RX_DR или TX_DS или MAX_RT флаг прерывания delay(50); TX_Mode(); }//RX mode// Режим приема RF_ReceiveData(&Rx_szTemp[0]); // получить данные от модуля РФ if(Rx_szTemp[0] == '1') // если = полученные данные '1' digitalWrite(LED1, HIGH);// индикатор 1 ВКЛЮЧЕН на 1сек delay(1000); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); } else if(Rx_szTemp[0] == '2') // если = полученные данные '2' { digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH);// индикатор 2 ВКЛЮЧЕН на 1сек delay(1000); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); } else if(Rx_szTemp[0] == '3') // если = полученные данные '3' { digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH);// индикатор 3 ВКЛЮЧЕН на 1 сек delay(1000); digitalWrite(LED3, LOW);Большое спасибо за терпение. Надеюсь на вашу помощь.
Где Вы головы. Нужна помощь.Выслушаю все. Помогите соедить в 1 -но целое две рабочие половинки. Ну не силен, не могу и что теперь.
приемник
#include<SPI.h> #include<nRF24L01.h> #include<RF24.h> const uint64_t pipe= {0xF0F0F0F0E1LL}; RF24 radio(A0,A1); //Обратите внимание тут другое подключение byte message = 1; byte red; unsigned long CTime01; unsigned long LTime01; void setup() { Serial.begin(9600); radio.begin(); delay(100); radio.enableDynamicPayloads(); radio.openReadingPipe(1,pipe); radio.openWritingPipe(pipe); //Открывем трубу для отправки radio.startListening(); } void loop() { if ( radio.available() ) { radio.read( &red,sizeof(red) ); Serial.println(String(red)); }; CTime01 = millis(); if (CTime01 >= (LTime01 +100)) //Периодичность отправки пакетов { Serial.println("----------write------------"); radio.stopListening(); //Перестаем слушать radio.write(&message, sizeof(message)); // Отправляем ответ radio.startListening(); LTime01 = CTime01; message++; } }Помогите соеденить две половинки в одно целое
Может это поможет
Читайте тему по модулю. Приемопередача организуется другим способом
Да - если сидеть в другом кабинете и с планшетом в руках - то такая помощь меня бы устроила.
Конкретный вопрос о конкретной помощи. И… да не сижу я там.
Помогите в чем косяк
Вы пишете - ошибка в строке 064. Но по этой строке прослеживаются и другие ошибки, сделанные ранее.
В 064 написано digitalRead(BUTTON1), а в строке 009 вы объявляли
intpinBUTTON1=A0,Далее, если А0 используете как цифровой пин, то он должен быть объявлен для ардуино УНО как 14, т.е. если номера цифровых пинов идут с 0 по 13, то А0=14, А1=15 и т.д.Далее, лучше было не использовать для объявления номеров пинов кнопок и диодов тип int, а объявить их через define, у вас и так код большой получается.Большое спасибо ,
В #34 вы писали, что скеч рабочий. Вы его работу проверяли? Если он рабочий, то вы сами сможете его подправить, чтобы светодиод гас через определенное время. Сначала напишите кусок кода на управление светодиодом без delay, проверите его работу и потом подправите ''рабочий код".
=
Спасибо - прислушался к вашим словам. Написал отдельно c millis , проверил. Все работает – теперь буду переносить на NFR24L01+. И спасибо за терпение к таким как Я.
В #34 вы писали, что скеч рабочий. Вы его работу проверяли? Если он рабочий, то вы сами сможете его подправить, чтобы светодиод гас через определенное время. Сначала напишите кусок кода на управление светодиодом без delay, проверите его работу и потом подправите ''рабочий код".
Рабочий вариант включил в NRF24l01+ но вылезают такие ошибки - в чем косяк?
#include "NRF24L01.h" //*************************************************** int ledPin1 = 5; // пин со светодиодом long OnTime1 = 1000; // время свечения светодиода, мс int ledState1 = LOW;//состояние светодиода #define BUTTON1 A0 // пин, к которому подключена кнопка unsigned long previousMillis1 = 0; int ledPin2 = 6; // пин со светодиодом long OnTime2 = 1000; // время свечения светодиода, мс int ledState2 = LOW;//состояние светодиода #define BUTTON2 A1 // пин, к которому подключена кнопка unsigned long previousMillis2 = 0; int ledPin3 = 7; // пин со светодиодом long OnTime3 = 1000; // время свечения светодиода, мс int ledState3 = LOW;//состояние светодиода #define BUTTON3 A2 // пин, к которому подключена кнопка unsigned long previousMillis3 = 0; //*************************************************** unsigned char TX_ADDRESS[TX_ADR_WIDTH] = { 0xaa,0xbb,0xcc,0xdd,0xee }; // Define a static TX address// Определить статический адрес TX unsigned char rx_buf[TX_PLOAD_WIDTH] = {0}; // Инициализировать значение unsigned char tx_buf[TX_PLOAD_WIDTH] = {0};// Инициализировать значение //*************************************************** void setup() // недействительными установки { SPI_DIR = ( CE + SCK_pin + CSN + MOSI_pin); SPI_DIR &=~ ( IRQ + MISO_pin); init_io(); // Инициализировать IO порт unsigned char status=SPI_Read(STATUS); initialize_R_T(); pinMode(ledPin1, OUTPUT);//устанавливаем вывод 5 как выход pinMode(ledPin2, OUTPUT);//устанавливаем вывод 6 как выход pinMode(ledPin3, OUTPUT);//устанавливаем вывод 7 как выход } void loop()// недействительными цикл () { unsigned char Rx_szTemp[1] = {0}; // держать полученные данные unsigned long currentMillis;//считываем время, прошедшее с момента запуска программы //Start TX mode // Запуск режима TX if(digitalRead(BUTTON1) == 0) { RF_SendData("1"); // отправить '1' через модуль РФ } else if(digitalRead(BUTTON2) == 0)// иначе, если { RF_SendData("2"); //send '2' through RF module } else if(digitalRead(BUTTON3) == 0) { RF_SendData("3"); //send '3' through RF module } //RX mode// Режим приема RF_ReceiveData(&Rx_szTemp[0]); // получить данные от модуля РФ if(Rx_szTemp[0] == '1') // если = полученные данные '1' { // если светодиод светится if (ledState1 == HIGH) { currentMillis = millis(); // проверяем сколько прошло времени, // если больше заданного - выключаем if (currentMillis-previousMillis1 >= OnTime1) { ledState1 = LOW;//выключун previousMillis1 = 0; digitalWrite(ledPin1,ledState1); } } // если кнопка нажата - включаем светодиод if (digitalRead(BUTTON1) == HIGH) { previousMillis1 = currentMillis; // запоминаем время ledState1 = HIGH; digitalWrite(ledPin1,ledState1); } else if(Rx_szTemp[0] == '2') // если = полученные данные '2' { // если светодиод светится if(ledState2 == HIGH) { // проверяем сколько прошло времени, // если больше заданного - выключаем if (currentMillis-previousMillis2 >= OnTime2) { ledState2 = LOW; previousMillis2 = 0; digitalWrite(ledPin2,ledState2); } } // если кнопка нажата - включаем светодиод if (digitalRead(BUTTON2) == HIGH) { previousMillis2 = currentMillis; // запоминаем время ledState2 = HIGH; digitalWrite(ledPin2,ledState2); } else if(Rx_szTemp[0] == '3') // если = полученные данные '3' { // если светодиод светится if(ledState3 == HIGH) { // проверяем сколько прошло времени, // если больше заданного - выключаем if (currentMillis-previousMillis3 >= OnTime3) { ledState3 = LOW; previousMillis3 = 0; digitalWrite(ledPin3,ledState3); } } // если кнопка нажата - включаем светодиод if (digitalRead(BUTTON3) == HIGH) { previousMillis3 = currentMillis; // запоминаем время ledState3 = HIGH; digitalWrite(ledPin3,ledState3); } } //************************************************** // Function: init_io();// Функция: init_io (); // Description:// Описание: // flash led one time,chip enable(ready to TX or RX Mode),// Светодиодной вспышкой один раз, чип позволит (готовый TX RX или режим), // Spi disable,Spi clock line init high// Спи отключить, SPI часы линии инициализировать высокой //************************************************** void init_io(void)//недействительными init_io (недействительными) { SPI_PORT&=~CE; // Чип позволит SPI_PORT|=CSN; // Спи отключить SPI_PORT&=~SCK_pin; // Спи часы линии инициализировать высокой } /************************************************** * Function: SPI_RW();//Функция: SPI_RW (); * * Description:// Описание: * Writes one unsigned char to nRF24L01, and return the unsigned char read * from nRF24L01 during write, according to SPI protocol Пишет один неподписанный символ для NRF24L01, и вернуть неподписанные символ читать * От NRF24L01 во пишут, в соответствии с протоколом SPI **************************************************/ unsigned char SPI_RW(unsigned char Byte)//подписанные символ SPI_RW (неподписанные символ байт) { unsigned char i; //неподписанные символ я; for(i=0;i<8;i++) // выход 8-бит { if(Byte&0x80) //если (байт & 0x80) { SPI_PORT |=MOSI_pin; // Выход "неподписанные символ ', MSB для MOSI_pin } else //другой { SPI_PORT &=~MOSI_pin; } SPI_PORT|=SCK_pin; // Установить SCK_pin высокий .. Byte <<= 1; // Сдвиг следующий бит в MSB .. if(SPI_IN & MISO_pin) //если (SPI_IN & MISO_pin) { Byte |= 1; // Захватить текущее MISO_pin немного } SPI_PORT&=~SCK_pin; // ..то Установить SCK_pin низкий снова } return(Byte); // Возврат прочитать неподписанные символ } /**************************************************/ /************************************************** * Function: SPI_RW_Reg(); // Функция: SPI_RW_Reg (); * * Description:// Описание: * Writes value 'value' to register 'reg'// Записывает значение '' значение для регистрации '' рег /**************************************************/ unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)//неподписанные символ SPI_RW_Reg (неподписанные символ рег, символьное значение без знака) { unsigned char status;// неподписанных статус символ; SPI_PORT&=~CSN; // ДНС низкий, инициализировать сделка SPI status = SPI_RW(reg); // Выбрать регистр SPI_RW(value); // ..и Значение записи к нему .. SPI_PORT|=CSN; // ДНС высокой снова return(status); // Вернуть NRF24L01 статус неподписанные символ } /**************************************************/ /************************************************** * Function: SPI_Read();//Функция: SPI_Read_Buf (); * * Description://Описание: * Read one unsigned char from nRF24L01 register, 'reg'Читайте одну неподписанные символ из регистра NRF24L01, "рег" /**************************************************/ unsigned char SPI_Read(unsigned char reg)//неподписанные символ SPI_Read (неподписанные символ рег) { unsigned char reg_val;// неподписанные символ reg_val; SPI_PORT&=~CSN; // ДНС низкий, инициализировать SPI связь ... SPI_RW(reg); // Выбор зарегистрируйтесь, чтобы читать из .. reg_val = SPI_RW(0); // ..то Прочитать значение регистра SPI_PORT|=CSN; // ДНС высокий, прекратить общение SPI return(reg_val); // Возвращаемое значение регистра } /**************************************************/ /************************************************** * Function: SPI_Read_Buf();//Функция: SPI_Write_Buf (); * * Description://Описание: * Reads 'unsigned chars' #of unsigned chars from register 'reg' //Читает неподписанные символы 'неподписанных симв' #of из 'рег' регистра * Typically used to read RX payload, Rx/Tx address//Обычно используется для чтения RX полезной нагрузки, прием / передача адрес /**************************************************/ unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)//неподписанные символ SPI_Read_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт) { unsigned char status,i;//неподписанных статус символ, я; SPI_PORT&=~CSN; // Установить ДНС низкий, инициализации SPI tranaction status = SPI_RW(reg); // Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ for(i=0;i<bytes;i++) //для (я = 0; я <байт; я ++) { pBuf[i] = SPI_RW(0); // // Выполнить SPI_RW читать неподписанные символ из NRF24L01 } SPI_PORT|=CSN; // Установить ДНС высокой снова return(status); // Вернуть NRF24L01 статус неподписанные символ } /**************************************************/ /************************************************** * Function: SPI_Write_Buf();//Функция: SPI_Write_Buf (); * * Description://Описание: * Writes contents of buffer '*pBuf' to nRF24L01//Записывает содержимое буфера '*', чтобы pBuf NRF24L01 * Typically used to write TX payload, Rx/Tx address//Обычно используется, чтобы написать полезную нагрузку TX, Rx / Tx адрес /**************************************************/ unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)//неподписанные символ SPI_Write_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт) { unsigned char status,i;//неподписанных статус символ, я; SPI_PORT&=~CSN; // Установить ДНС низкий, инициализации SPI tranaction status = SPI_RW(reg); // Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ for(i=0;i<bytes; i++) // затем написать все неподписанные символ в буфере (* pBuf) { SPI_RW(*pBuf++); } SPI_PORT|=CSN; // Установить ДНС высокой снова return(status); // Вернуть NRF24L01 статус неподписанные символ } /**************************************************/ /************************************************** * Function: Initialize TX & RX mode;//Функция: Инициализировать режим TX & RX; * * Description://Описание: * This function initializes one nRF24L01 device to//Эта функция инициализирует один NRF24L01 устройство к * TX mode, set TX address, set RX address for auto.ack,//Режим Техас, установить TX-адрес, установите адрес RX для auto.ack, * fill TX payload, select RF channel, datarate & TX pwr.//Заполнить TX полезной нагрузки, выберите радиочастотный канал, DataRate & TX PWR. * PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX.//PWR_UP установлен, КПР (2 неподписанные символов) включена, и ПРИМ: TX. * * ToDo: One high pulse(>10us) on CE will now send this//ToDo: Один высокий пульс (> 10us) на CE теперь отправить это **************************************************/ void initialize_R_T(void)//недействительными initialize_R_T (недействительными) { SPI_PORT&=~CE; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Записывает TX_Address в NRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 же, как TX_Adr для Auto.Ack SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Включить Auto.Ack: Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Включить Pipe0 SPI_RW_Reg(WRITE_REG + RF_CH, 50); // Выбор радиочастотного канала 50 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x26); // TX_PWR: 0 дБм, DataRate: 250 Мбит, МШУ: HCURR SPI_PORT|=CE; } /************************************************** * Function: TX_Mode(); //Функция: TX_Mode (); * * Description: //Описание: * This function initializes one nRF24L01 device to //Эта функция инициализирует один NRF24L01 устройство к * TX mode, set TX address, set RX address for auto.ack, //Режим Техас, установить TX-адрес, установите адрес RX для auto.ack, * fill TX payload, select RF channel, datarate & TX pwr. //Заполнить TX полезной нагрузки, выберите радиочастотный канал, DataRate & TX PWR. * PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX. //PWR_UP установлен, КПР (2 неподписанные символов) включена, и ПРИМ: TX. * * ToDo: One high pulse(>10us) on CE will now send this //ToDo: Один высокий пульс (> 10us) на CE теперь отправить это * packet and expext an acknowledgment from the RX device. //Пакет и expext подтверждение от устройства RX. **************************************************/ void TX_Mode(void) //недействительными TX_Mode (недействительными) { SPI_PORT&=~CE; SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); // 500us + 86us, 10 Retrans ... SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // Установить PWR_UP немного, включите CRC (2 неподписанные знаков) и Прим: TX. MAX_RT & TX_DS включен .. SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); SPI_PORT|=CE; } /************************************************** * Function: RX_Mode();//Функция: RX_Mode (); * * Description://Описание: * This function initializes one nRF24L01 device to//Эта функция инициализирует один NRF24L01 устройство к * RX Mode, set RX address, writes RX payload width,//RX Режим установите RX адрес, пишет ширину RX полезной нагрузки, * select RF channel, datarate & LNA HCURR.//Выберите радиочастотный канал, DataRate & МШУ HCURR. * After init, CE is toggled high, which means that//После инициализации, CE переключается высокой, что означает, что * this device is now ready to receive a datapacket.//Это устройство готово для приема datapacket. /**************************************************/ void RX_Mode(void)//недействительными RX_Mode (недействительными) { SPI_PORT&=~CE; SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Выбор же RX ширину полезной нагрузки как TX шириной Payload SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //Установить PWR_UP немного, включите CRC (2 неподписанные символов) & Прим: RX. Включен RX_DR .. SPI_PORT|=CE; // Установить CE контактный высокой для того, чтобы устройство RX } //RF transmit data function// Функция передачи данных РФ void RF_SendData(char *TXdata) { TX_Mode(); // Включить режим Tx // activate Tx mode for(short i=0; i<23;i++)// для (короткий я = 0; я <23; я ++) { tx_buf[i] = (unsigned char)*(TXdata+i); // Сохранить данные в массив // store the data to an array } unsigned char status = SPI_Read(STATUS); // Читаем значение регистра статуса в // read register STATUS's value if(status&TX_DS) // если данные готовы получить (TX_DS) прервать // if receive data ready (TX_DS) interrupt { SPI_RW_Reg(FLUSH_TX,0); SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // Запись в TX_FIFO playload } if(status&MAX_RT) // если принимать данные готовые (MAX_RT) прервать это повтора чем SETUP_RETR { SPI_RW_Reg(FLUSH_TX,0); SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // Отключение режима Standy } SPI_RW_Reg(WRITE_REG+STATUS,status); // Ясно RX_DR или TX_DS или MAX_RT флаг прерывания delay(50); RX_Mode(); } //RF receive data function// РФ получить функцию передачи данных void RF_ReceiveData(unsigned char *RXdata)// недействительными RF_ReceiveData (неподписанные символ * RXdata) { RX_Mode(); // Включить режим RX unsigned char status = SPI_Read(STATUS); // Читаем значение регистра статуса в if(status&RX_DR) // если данные готовы получить (TX_DS) прервать { SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH); // Прочитать playload в rx_buf SPI_RW_Reg(FLUSH_RX,0); // Ясно RX_FIFO *RXdata = rx_buf[0]; // передать полученные данные в RXdata Serial.println(rx_buf[0]); } SPI_RW_Reg(WRITE_REG+STATUS,status); // Ясно RX_DR или TX_DS или MAX_RT флаг прерывания delay(50); TX_Mode(); }Строка 104 лишняя. Кол-во открывающих скобок должно быть равно кол-ву закрывающих.
Ещё строка 128, вроде, тоже не в кассу. Дальше лень искать :)
Честно говоря –эти скобы и не влияют здесь, но ошибки такие как - в чем косяк? я на пути к победе ПОМОГИТЕ.
141//**************************************************142// Function: init_io();// Функция: init_io ();143// Description:// Описание:144// flash led one time,chip enable(ready to TX or RX Mode),// Светодиодной вспышкой один раз, чип позволит (готовый TX RX или режим),145// Spi disable,Spi clock line init high// Спи отключить, SPI часы линии инициализировать высокой146//**************************************************147voidinit_io(void)//недействительными init_io (недействительными)148{149150SPI_PORT&=~CE;// Чип позволит151SPI_PORT|=CSN;// Спи отключить152SPI_PORT&=~SCK_pin;// Спи часы линии инициализировать высокой153}154155/**************************************************156* Function: SPI_RW();//Функция: SPI_RW ();157*158* Description:// Описание:159* Writes one unsignedcharto nRF24L01, andreturnthe unsignedcharread160* from nRF24L01 during write, according to SPI protocol161Пишет один неподписанный символ для NRF24L01, и вернуть неподписанные символ читать162* От NRF24L01 во пишут, в соответствии с протоколом SPI163**************************************************/164unsignedcharSPI_RW(unsignedcharByte)//подписанные символ SPI_RW (неподписанные символ байт)165{166unsignedchari;//неподписанные символ я;167for(i=0;i<8;i++)// выход 8-бит168{169if(Byte&0x80)//если (байт & 0x80)170{171SPI_PORT |=MOSI_pin;// Выход "неподписанные символ ', MSB для MOSI_pin172}173else//другой174{175SPI_PORT &=~MOSI_pin;176}177SPI_PORT|=SCK_pin;// Установить SCK_pin высокий ..178Byte <<= 1;// Сдвиг следующий бит в MSB ..179if(SPI_IN & MISO_pin)//если (SPI_IN & MISO_pin)180{181Byte |= 1;// Захватить текущее MISO_pin немного182}183SPI_PORT&=~SCK_pin;// ..то Установить SCK_pin низкий снова184}185return(Byte);// Возврат прочитать неподписанные символ186}187/**************************************************/188189/**************************************************190* Function: SPI_RW_Reg(); // Функция: SPI_RW_Reg ();191*192* Description:// Описание:193* Writes value 'value' to register 'reg'// Записывает значение '' значение для регистрации '' рег194/**************************************************/195unsignedcharSPI_RW_Reg(unsignedcharreg, unsignedcharvalue)//неподписанные символ SPI_RW_Reg (неподписанные символ рег, символьное значение без знака)196{197unsignedcharstatus;// неподписанных статус символ;198199SPI_PORT&=~CSN;// ДНС низкий, инициализировать сделка SPI200status = SPI_RW(reg);// Выбрать регистр201SPI_RW(value);// ..и Значение записи к нему ..202SPI_PORT|=CSN;// ДНС высокой снова203204return(status);// Вернуть NRF24L01 статус неподписанные символ205}206/**************************************************/207208/**************************************************209* Function: SPI_Read();//Функция: SPI_Read_Buf ();210*211* Description://Описание:212* Read one unsigned char from nRF24L01 register, 'reg'Читайте одну неподписанные символ из регистра NRF24L01, "рег"213/**************************************************/214unsignedcharSPI_Read(unsignedcharreg)//неподписанные символ SPI_Read (неподписанные символ рег)215{216unsignedcharreg_val;// неподписанные символ reg_val;217218SPI_PORT&=~CSN;// ДНС низкий, инициализировать SPI связь ...219SPI_RW(reg);// Выбор зарегистрируйтесь, чтобы читать из ..220reg_val = SPI_RW(0);// ..то Прочитать значение регистра221SPI_PORT|=CSN;// ДНС высокий, прекратить общение SPI222223return(reg_val);// Возвращаемое значение регистра224}225/**************************************************/226227/**************************************************228* Function: SPI_Read_Buf();//Функция: SPI_Write_Buf ();229*230* Description://Описание:231* Reads 'unsigned chars' #of unsigned chars from register 'reg' //Читает неподписанные символы 'неподписанных симв' #of из 'рег' регистра232* Typically used to read RX payload, Rx/Tx address//Обычно используется для чтения RX полезной нагрузки, прием / передача адрес233/**************************************************/234unsignedcharSPI_Read_Buf(unsignedcharreg, unsignedchar*pBuf, unsignedcharbytes)//неподписанные символ SPI_Read_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт)235{236unsignedcharstatus,i;//неподписанных статус символ, я;237238SPI_PORT&=~CSN;// Установить ДНС низкий, инициализации SPI tranaction239status = SPI_RW(reg);// Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ240241for(i=0;i<bytes;i++)//для (я = 0; я <байт; я ++)242{243pBuf[i] = SPI_RW(0);// // Выполнить SPI_RW читать неподписанные символ из NRF24L01244}245246SPI_PORT|=CSN;// Установить ДНС высокой снова247248return(status);// Вернуть NRF24L01 статус неподписанные символ249}250/**************************************************/251252/**************************************************253* Function: SPI_Write_Buf();//Функция: SPI_Write_Buf ();254*255* Description://Описание:256* Writes contents of buffer '*pBuf' to nRF24L01//Записывает содержимое буфера '*', чтобы pBuf NRF24L01257* Typically used to write TX payload, Rx/Tx address//Обычно используется, чтобы написать полезную нагрузку TX, Rx / Tx адрес258/**************************************************/259unsignedcharSPI_Write_Buf(unsignedcharreg, unsignedchar*pBuf, unsignedcharbytes)//неподписанные символ SPI_Write_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт)260{261unsignedcharstatus,i;//неподписанных статус символ, я;262263SPI_PORT&=~CSN;// Установить ДНС низкий, инициализации SPI tranaction264status = SPI_RW(reg);// Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ265for(i=0;i<bytes; i++)// затем написать все неподписанные символ в буфере (* pBuf)266{267SPI_RW(*pBuf++);268}269SPI_PORT|=CSN;// Установить ДНС высокой снова270return(status);// Вернуть NRF24L01 статус неподписанные символ271}272/**************************************************/273274/**************************************************275* Function: Initialize TX & RX mode;//Функция: Инициализировать режим TX & RX;276*277* Description://Описание:278* This function initializes one nRF24L01 device to//Эта функция инициализирует один NRF24L01 устройство к279* TX mode, set TX address, set RX address for auto.ack,//Режим Техас, установить TX-адрес, установите адрес RX для auto.ack,280* fill TX payload, select RF channel, datarate & TX pwr.//Заполнить TX полезной нагрузки, выберите радиочастотный канал, DataRate & TX PWR.281* PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX.//PWR_UP установлен, КПР (2 неподписанные символов) включена, и ПРИМ: TX.282*283* ToDo: One high pulse(>10us) on CE will now send this//ToDo: Один высокий пульс (> 10us) на CE теперь отправить это284**************************************************/285voidinitialize_R_T(void)//недействительными initialize_R_T (недействительными)286{287SPI_PORT&=~CE;288289SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);// Записывает TX_Address в NRF24L01290SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);// RX_Addr0 же, как TX_Adr для Auto.Ack291292SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);// Включить Auto.Ack: Pipe0293SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);// Включить Pipe0294295SPI_RW_Reg(WRITE_REG + RF_CH, 50);// Выбор радиочастотного канала 50296SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x26);// TX_PWR: 0 дБм, DataRate: 250 Мбит, МШУ: HCURR297298SPI_PORT|=CE;299}300/**************************************************301* Function: TX_Mode(); //Функция: TX_Mode ();302*303* Description: //Описание:304* This function initializes one nRF24L01 device to //Эта функция инициализирует один NRF24L01 устройство к305* TX mode, set TX address, set RX address for auto.ack, //Режим Техас, установить TX-адрес, установите адрес RX для auto.ack,306* fill TX payload, select RF channel, datarate & TX pwr. //Заполнить TX полезной нагрузки, выберите радиочастотный канал, DataRate & TX PWR.307* PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX. //PWR_UP установлен, КПР (2 неподписанные символов) включена, и ПРИМ: TX.308*309* ToDo: One high pulse(>10us) on CE will now send this //ToDo: Один высокий пульс (> 10us) на CE теперь отправить это310* packet and expext an acknowledgment from the RX device. //Пакет и expext подтверждение от устройства RX.311**************************************************/312voidTX_Mode(void)//недействительными TX_Mode (недействительными)313{314SPI_PORT&=~CE;315316SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f);// 500us + 86us, 10 Retrans ...317SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);// Установить PWR_UP немного, включите CRC (2 неподписанные знаков) и Прим: TX. MAX_RT & TX_DS включен ..318SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);319320SPI_PORT|=CE;321}322323/**************************************************324* Function: RX_Mode();//Функция: RX_Mode ();325*326* Description://Описание:327* This function initializes one nRF24L01 device to//Эта функция инициализирует один NRF24L01 устройство к328* RX Mode, set RX address, writes RX payload width,//RX Режим установите RX адрес, пишет ширину RX полезной нагрузки,329* select RF channel, datarate & LNA HCURR.//Выберите радиочастотный канал, DataRate & МШУ HCURR.330* After init, CE is toggled high, which means that//После инициализации, CE переключается высокой, что означает, что331* this device is now ready to receive a datapacket.//Это устройство готово для приема datapacket.332/**************************************************/333voidRX_Mode(void)//недействительными RX_Mode (недействительными)334{335SPI_PORT&=~CE;336337SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);// Выбор же RX ширину полезной нагрузки как TX шириной Payload338SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//Установить PWR_UP немного, включите CRC (2 неподписанные символов) & Прим: RX. Включен RX_DR ..339340SPI_PORT|=CE;// Установить CE контактный высокой для того, чтобы устройство RX341}342343//RF transmit data function// Функция передачи данных РФ344voidRF_SendData(char*TXdata)345{346TX_Mode();// Включить режим Tx // activate Tx mode347348for(shorti=0; i<23;i++)// для (короткий я = 0; я <23; я ++)349{350tx_buf[i] = (unsignedchar)*(TXdata+i);// Сохранить данные в массив // store the data to an array351}352353unsignedcharstatus = SPI_Read(STATUS);// Читаем значение регистра статуса в // read register STATUS's value354355if(status&TX_DS)// если данные готовы получить (TX_DS) прервать // if receive data ready (TX_DS) interrupt356{357SPI_RW_Reg(FLUSH_TX,0);358SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);// Запись в TX_FIFO playload359}360if(status&MAX_RT)// если принимать данные готовые (MAX_RT) прервать это повтора чем SETUP_RETR361{362SPI_RW_Reg(FLUSH_TX,0);363SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);// Отключение режима Standy364}365SPI_RW_Reg(WRITE_REG+STATUS,status);// Ясно RX_DR или TX_DS или MAX_RT флаг прерывания366delay(50);367RX_Mode();368}369370//RF receive data function// РФ получить функцию передачи данных371voidRF_ReceiveData(unsignedchar*RXdata)// недействительными RF_ReceiveData (неподписанные символ * RXdata)372{373RX_Mode();// Включить режим RX374unsignedcharstatus = SPI_Read(STATUS);// Читаем значение регистра статуса в375if(status&RX_DR)// если данные готовы получить (TX_DS) прервать376{377SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);// Прочитать playload в rx_buf378SPI_RW_Reg(FLUSH_RX,0);// Ясно RX_FIFO379380*RXdata = rx_buf[0];// передать полученные данные в RXdata381Serial.println(rx_buf[0]);382}383SPI_RW_Reg(WRITE_REG+STATUS,status);// Ясно RX_DR или TX_DS или MAX_RT флаг прерывания384delay(50);385TX_Mode();386}#include "NRF24L01.h" //*************************************************** #define TX_ADR_WIDTH 5 // 5 unsigned chars TX(RX) address width #define TX_PLOAD_WIDTH 23 // unsigned chars TX payload const int ledPin1 = 5; // номер выхода, подключенного к светодиоду // Variables will change: int ledState1 = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis1 = 0; // храним время последнего переключения светодиода long interval1 = 1000; // интервал между включение/выключением светодиода (1секунда) #define BUTTON1 A0 const int ledPin2 = 6; // номер выхода, подключенного к светодиоду // Variables will change: int ledState2 = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis2 = 0; // храним время последнего переключения светодиода long interval2 = 1000; // интервал между #define BUTTON2 A1 const int ledPin3 = 7; // номер выхода, подключенного к светодиоду // Variables will change: int ledState3 = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis3 = 0; // храним время последнего переключения светодиода long interval3 = 1000; // интервал между #define BUTTON3 A2 //*************************************************** unsigned char TX_ADDRESS[TX_ADR_WIDTH] = { 0xaa,0xbb,0xcc,0xdd,0xee }; // Define a static TX address unsigned char rx_buf[TX_PLOAD_WIDTH] = {0}; // initialize value unsigned char tx_buf[TX_PLOAD_WIDTH] = {0}; //*************************************************** void setup() { SPI_DIR = ( CE + SCK_pin + CSN + MOSI_pin); SPI_DIR &=~ ( IRQ + MISO_pin); init_io(); // Initialize IO port unsigned char status=SPI_Read(STATUS); initialize_R_T(); // задаем режим выхода для порта, подключенного к светодиоду pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); } void loop() { // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); unsigned char Rx_szTemp[1] = {0}; //hold received data //Start TX mode if(digitalRead(BUTTON1) == 0) { RF_SendData("1"); //send '1' through RF module } else if(digitalRead(BUTTON2) == 0) { RF_SendData("2"); //send '2' through RF module } else if(digitalRead(BUTTON3) == 0) { RF_SendData("3"); //send '3' through RF module } //RX mode RF_ReceiveData(&Rx_szTemp[0]); //receive data from RF module if(Rx_szTemp[0] == '1') //if received data = '1' { //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis1 > interval1) { // сохраняем время последнего переключения previousMillis1 = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (ledState1 == LOW) ledState1 = HIGH; else ledState1 = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin1, ledState1); } else if(Rx_szTemp[0] == '2') //if received data = '2' { //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis2 > interval2) { // сохраняем время последнего переключения previousMillis2 = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (ledState2 == LOW) ledState2 = HIGH; else ledState2 = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin2, ledState2); } else if(Rx_szTemp[0] == '3') //if received data = '3' { //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis3 > interval3) { // сохраняем время последнего переключения previousMillis3 = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (ledState3 == LOW) ledState3 = HIGH; else ledState3 = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin3, ledState3); } //************************************************** // Function: init_io(); // Description: // flash led one time,chip enable(ready to TX or RX Mode), // Spi disable,Spi clock line init high //************************************************** void init_io(void) { SPI_PORT&=~CE; // chip enable SPI_PORT|=CSN; // Spi disable SPI_PORT&=~SCK_pin; // Spi clock line init high } /************************************************** * Function: SPI_RW(); * * Description: * Writes one unsigned char to nRF24L01, and return the unsigned char read * from nRF24L01 during write, according to SPI protocol **************************************************/ unsigned char SPI_RW(unsigned char Byte) { unsigned char i; for(i=0;i<8;i++) // output 8-bit { if(Byte&0x80) { SPI_PORT |=MOSI_pin; // output 'unsigned char', MSB to MOSI_pin } else { SPI_PORT &=~MOSI_pin; } SPI_PORT|=SCK_pin; // Set SCK_pin high.. Byte <<= 1; // shift next bit into MSB.. if(SPI_IN & MISO_pin) { Byte |= 1; // capture current MISO_pin bit } SPI_PORT&=~SCK_pin; // ..then set SCK_pin low again } return(Byte); // return read unsigned char } /**************************************************/ /************************************************** * Function: SPI_RW_Reg(); * * Description: * Writes value 'value' to register 'reg' /**************************************************/ unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value) { unsigned char status; SPI_PORT&=~CSN; // CSN low, init SPI transaction status = SPI_RW(reg); // select register SPI_RW(value); // ..and write value to it.. SPI_PORT|=CSN; // CSN high again return(status); // return nRF24L01 status unsigned char } /**************************************************/ /************************************************** * Function: SPI_Read(); * * Description: * Read one unsigned char from nRF24L01 register, 'reg' /**************************************************/ unsigned char SPI_Read(unsigned char reg) { unsigned char reg_val; SPI_PORT&=~CSN; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read register value SPI_PORT|=CSN; // CSN high, terminate SPI communication return(reg_val); // return register value } /**************************************************/ /************************************************** * Function: SPI_Read_Buf(); * * Description: * Reads 'unsigned chars' #of unsigned chars from register 'reg' * Typically used to read RX payload, Rx/Tx address /**************************************************/ unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) { unsigned char status,i; SPI_PORT&=~CSN; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read status unsigned char for(i=0;i<bytes;i++) { pBuf[i] = SPI_RW(0); // Perform SPI_RW to read unsigned char from nRF24L01 } SPI_PORT|=CSN; // Set CSN high again return(status); // return nRF24L01 status unsigned char } /**************************************************/ /************************************************** * Function: SPI_Write_Buf(); * * Description: * Writes contents of buffer '*pBuf' to nRF24L01 * Typically used to write TX payload, Rx/Tx address /**************************************************/ unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes) { unsigned char status,i; SPI_PORT&=~CSN; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read status unsigned char for(i=0;i<bytes; i++) // then write all unsigned char in buffer(*pBuf) { SPI_RW(*pBuf++); } SPI_PORT|=CSN; // Set CSN high again return(status); // return nRF24L01 status unsigned char } /**************************************************/ /************************************************** * Function: Initialize TX & RX mode; * * Description: * This function initializes one nRF24L01 device to * TX mode, set TX address, set RX address for auto.ack, * fill TX payload, select RF channel, datarate & TX pwr. * PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX. * * ToDo: One high pulse(>10us) on CE will now send this **************************************************/ void initialize_R_T(void) { SPI_PORT&=~CE; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0 SPI_RW_Reg(WRITE_REG + RF_CH, 50); // Select RF channel 50 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x26); // TX_PWR:0dBm, Datarate:250Mbps, LNA:HCURR SPI_PORT|=CE; } /************************************************** * Function: TX_Mode(); * * Description: * This function initializes one nRF24L01 device to * TX mode, set TX address, set RX address for auto.ack, * fill TX payload, select RF channel, datarate & TX pwr. * PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX. * * ToDo: One high pulse(>10us) on CE will now send this * packet and expext an acknowledgment from the RX device. **************************************************/ void TX_Mode(void) { SPI_PORT&=~CE; SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); // 500us + 86us, 10 retrans... SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // Set PWR_UP bit, enable CRC(2 unsigned chars) & Prim:TX. MAX_RT & TX_DS enabled.. SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); SPI_PORT|=CE; } /************************************************** * Function: RX_Mode(); * * Description: * This function initializes one nRF24L01 device to * RX Mode, set RX address, writes RX payload width, * select RF channel, datarate & LNA HCURR. * After init, CE is toggled high, which means that * this device is now ready to receive a datapacket. /**************************************************/ void RX_Mode(void) { SPI_PORT&=~CE; SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 unsigned chars) & Prim:RX. RX_DR enabled.. SPI_PORT|=CE; // Set CE pin high to enable RX device } //RF transmit data function void RF_SendData(char *TXdata) { TX_Mode(); // activate Tx mode for(short i=0; i<23;i++) { tx_buf[i] = (unsigned char)*(TXdata+i); // store the data to an array } unsigned char status = SPI_Read(STATUS); // read register STATUS's value if(status&TX_DS) // if receive data ready (TX_DS) interrupt { SPI_RW_Reg(FLUSH_TX,0); SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // write playload to TX_FIFO } if(status&MAX_RT) // if receive data ready (MAX_RT) interrupt, this is retransmit than SETUP_RETR { SPI_RW_Reg(FLUSH_TX,0); SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // disable standy-mode } SPI_RW_Reg(WRITE_REG+STATUS,status); // clear RX_DR or TX_DS or MAX_RT interrupt flag delay(50); RX_Mode(); } //RF receive data function void RF_ReceiveData(unsigned char *RXdata) { RX_Mode(); // activate RX mode unsigned char status = SPI_Read(STATUS); // read register STATUS's value if(status&RX_DR) // if receive data ready (TX_DS) interrupt { SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH); // read playload to rx_buf SPI_RW_Reg(FLUSH_RX,0); // clear RX_FIFO *RXdata = rx_buf[0]; //pass the received data to RXdata Serial.println(rx_buf[0]); } SPI_RW_Reg(WRITE_REG+STATUS,status); // clear RX_DR or TX_DS or MAX_RT interrupt flag delay(50); TX_Mode(); }в строке 112 скобка открывается, а закрывающей нигде далее нету.