2 ардуины с nrf24l01. Прием и передача друг другу значений.

lee
Offline
Зарегистрирован: 13.03.2014
Приветствую! Никак не удается заставить две ардуины с 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);
}

 

lee
Offline
Зарегистрирован: 13.03.2014

Извиняюсь, текст в код при оформлении записался почему то.

MaksMS
Offline
Зарегистрирован: 11.03.2013

Во первых открытие каналов надо вынести в setup ,а во вторых а где radio.stopListening() ,который переводит радиомодуль на передачу ? Вроде примеров на форуме предостаточно..Есть целая тема ,где множество ответов можно найти. 

lee
Offline
Зарегистрирован: 13.03.2014

Форум курю сижу. Просто в голове еще не уложилось все. В частности понятно вроде, а в целом - еще не созрел.

lee
Offline
Зарегистрирован: 13.03.2014
#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);
}

Поправил код по рекомендациям с тем. Однако ничего не изменилось. Ардуины друг друга не видят.

 

lee
Offline
Зарегистрирован: 13.03.2014

Сдается мне с числом каналов напутал. Или с адресацией. Попробую поковырять код...

MaksMS
Offline
Зарегистрирован: 11.03.2013

На прием и на передачу должны быть разные каналы ,хотя в теории и так может заработать.

У вас не указан канал ,но по умолчанию он всеравно выбран ,и, получается что выбран на обеих одинаково.

lee
Offline
Зарегистрирован: 13.03.2014

Хм. Нашелся такой трабл. В макете у меня две дуины, одна nano, вторая UNO (китайская makerduino UNO). Так вот на нано при работе светодиод L, подключенный к 13 выводу горит вполнакала, ибо нога SCK дергается. А на UNO вообще не горит. Откопал платку мини про, залил скетч, на ней светодиод замигаел.

Хотя когда пробовал однонаправленную связь (nano - передатчик, UNO - приемник) все работало. Похоже в UNO трабл какой то. Пока едут заказанные ардуины, попробую на про мини сгородить и проверить.

MaksMS, спасибо. Не подскажите, какой командой назначаются разные каналы? В 13 строке разве не это делается?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Канал назначается  radio.setChannel(25);  - это можно увидеть в исходных кодах библиотеки. в 13 строке идет иницилизация модуля используя данные выводы для подключения.

zsm@nxt.ru
Offline
Зарегистрирован: 27.05.2013

Здесь пример рабочий.

 

lee
Offline
Зарегистрирован: 13.03.2014

Спасибо, буду ждать ардуины, а пока матчастью займусь. zsm@nxt.ru, в этом примере одностороннее управление одной ардуиной другой. это у меня и так заработало. Я же хочу взаимного управления. Как на видео, только еще прикрутить 2 сервы к ардуине с резисторами а к ардуине с сервами прикрутить резисторы.

4ERTIK
Offline
Зарегистрирован: 24.03.2013

Пытался связать две ардуины . Тоже искал примеры . Не нашел . Кое как сваял из всего что нашел на форуме.

Ардуины слушают эфир , и по событию (нажатие кнопки, срабатывание датчика и т.д. ) включ передачу и после опять слушают эфир. Получился говнокод для первой ардуины:

#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 процентов не правильный . Но для мои целей подошел.

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

lee
Offline
Зарегистрирован: 13.03.2014
 
const uint64_t pipes[2] = { 0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; 

4ERTIK, спасибо за пример. В примере все понятно, только вот пояснил бы кто, запись выше. Что мы физически делаем этой командой и чем она отличается от 14 строки моего примера, где в массиве только одно значение. Где об этом можно почитать подробней?

 

4ERTIK
Offline
Зарегистрирован: 24.03.2013

адреса каналов приема и передачи, а у тебя указан только канал приема( гуру поправят если я не прав).

lee
Offline
Зарегистрирован: 13.03.2014
#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. Вроде должно заработать, но вот проверить в ближайшее время не удасться (( жду модули с Китая.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

мне вот интересно.. ну сугубо в иследовательских целях.. вы специально тупите или это врожденое?

тут на эту тему написаны килотонны постов..

тоесть установить простой пример в котором две ардуинки шлют пинги друг другу у вас рука не подымается?

чисто с технической точки зрения попробуйте мне обьяснить как ардуина может отправилять сигнал через  РФ24 и не принимать его, или наоборот... я видимо туплю страшно и не могу себе представить такой ситуации..

lee
Offline
Зарегистрирован: 13.03.2014

Конечно туплю. Мало времени еще прошло с момента, когда первые 24 пришли из Китая. Не понимаю, как вы можете этого не понимать по моим постам выше.

Может отправлять и не принимать? На уровне моих пока еще скромных познаний, например не управлять по каким либо причинам выводом, переводящим модуль из приема в передачу. Скорей на уровне железа. Но и мегатонны кодов перелопатить новичку и все понять нелегко. Но процесс идет, я многое уже знаю, например то, что вас то вылечат, а мне с этим жить :) Удачи вам!

 

leshak
Offline
Зарегистрирован: 29.09.2011

lee пишет:

Но процесс идет, я многое уже знаю, например то, что вас то вылечат, а мне с этим жить :) Удачи вам!

Красиво "подъебнул" :)  

Вы правы, но.... вы вот призываете других понять причины вашего "туплю...", есть ведь и обратная сторона. Почему так реагируют на "тупление". 

Кто вам отвечает на форуме?  Люди с 30-летним педагогическим стажем или обыкновенные "практики" (или считающие себя таковыми)? Обычные люди, которых раздражают повторения одного и того же. Да банально - плохое настроение может быть. Вы-то "затупили" один раз, а до вас сколько раз это сделали (по этой же теме)?

Да и банально, "знать" и "уметь учить" - не одно и тоже. Вы когда-нибудь пробовали учить езде на велосипеде или плаванию?  То что тебе очевидно и ты даже не задумываешься.... вдруг видишь что челвок делает глупости которые тебе даже не пришли бы в голову ;) Первая естественная реакция (!)  "ну что за д%№;%;".

И это все накладывается на то, что большинство отвечающих, даже мысленно, "корону учителя" - себе на голову не одевали. Просто общаются на заданную тему. В этом общении может быть и учебная инфа, и "сброс пара", и откровенный стеб (особенно если есть повод. хотя и не обязателен).

И ничего вы с этим не поделаете. Советы вида "проходите мимо" - дадут противоположный эффект ;)  Уже были кто проверял это ;) Вообщем "стиснуть зубы, да терпеть..."  (C). Судьба новичков :( Просеиваете "породу" форума, выбираете полезные для себя крупицы.

Кстати, на востоке, учитель часто, в отличае от нашего, вообще ничего не объясняет. Он сам задает вопрос и "нещадно пиздит за неправильный ответ"  :) И какой "учебный подход" более правильный - бабка надвое гадала. 

Многие начинает с "я новичок", "не пинайте меня", "учитывайте...". Как говорила мой школьный зауч "ваши подробности.." ;) В ответ на ЛЮБЫЕ объяснения "почему не сделал домашнее задание, не сдал куртку в гардероб и т.д. и т.п.".  Большинству людей - фиолетово на причины вашего незнания. И я благодарен заучу с тем что она рано заставила меня осознать реальное отношение внешнего мира к индивидууму.

Никто же не обещал что "быть новичком" это психологически комфортно ;) . Ну а тут уже есть два пути. Либо "отказатся" и вернутся в привычную зону комфорта. Работать только с тем что уже умеешь и знаешь. Либо перестать быть новичком :) Стимул есть. Сделать эту область "зоной комфорта".

Только потом опять прийдется искать "как выйти из зоны комфорта". Если застрянешь в ней  - деградация. 

Вообщем "....оплеухи нужней поцелуев, поцелуям мы знаем цену..." (с) Дольский

lee
Offline
Зарегистрирован: 13.03.2014

leshak. Да у меня вообще никаких претензий. Всегда с благодарностью принимаю помощь и советы от более опытных специалистов. Психологию, настроение, 30 лет, просто фильтрую. Да и не подъебывал никого, просто хотел сказать, что не сижу тупо ответа жду, а ищу, читаю форум, учусь, экспериментирую с ардуинами. В программировании МК я пока новичек, но в том, что стану профессионалом не сомневаюсь. Деваться некуда, да и интересно.

А так, любой Форум интересная штука. Вопросы там задают одни новички, как только ты становишься профессионалом, начинаешь только отвечать.

 

lee
Offline
Зарегистрирован: 13.03.2014
 radio.stopListening();     //Переводим модуль в режим передачи
 radio.write(msg1, sizeof(msg1)); //передаем...
 radio.startListening(); //переходим опять в режим приема 

Поэкспериментировал с кодом, как выяснилось работа RF затыкается сразу как в коде появляются строки выше. Если закомментить, односторонняя передача востанавливается. УНА оказалась рабочей.

 

leshak
Offline
Зарегистрирован: 29.09.2011

Тут вы делаете три вещи. Осановку "слушания", передачу, и "старт".

Попробуйте выяснить что же именно мешает. Старт/стоп или "передача. Если write закоментить, а старт/стоп оставить, проблемы остаются?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

leshak пишет:

Тут вы делаете три вещи. Осановку "слушания", передачу, и "старт".

Попробуйте выяснить что же именно мешает. Старт/стоп или "передача. Если write закоментить, а старт/стоп оставить, проблемы остаются?

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

lee
Offline
Зарегистрирован: 13.03.2014
  radio.openWritingPipe(pipes[0]); // Открываем канал передачи
  radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема

Leshak, если закоментить все три строчки, работает в одном направлении. То есть можно управлять той дуиной, в которой закоментены эти строки. Если же раскоментить любую/любые из этих строк, управления нет ни туда ни обратно. Еще заметил что строчки с каналами (код выше) почему то в моем случае должны быть одинаковыми  в обеих дуинах. Иначе управления нет. Такой же трабл встречал у кого то в ветке про RF24.

https://github.com/maniacbug/RF24 ,библиотеку отсюда брал.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

lee
Offline
Зарегистрирован: 13.03.2014

Это не гордость это детские комплексы :)

leshak
Offline
Зарегистрирован: 29.09.2011

lee пишет:

  radio.openWritingPipe(pipes[0]); // Открываем канал передачи
  radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема

Leshak, если закоментить все три строчки, работает в одном направлении. 

Вообщем-то я спрашивал что будет если закоментить эту одну строчку. write. Понять что мешает сам факт передачи или остановка/старт прослушки.

Вы же выполнили сразу несколько каких-то изменений. Из чего сделать какой-то вывод одназначный - невозможно.

lee
Offline
Зарегистрирован: 13.03.2014

lee пишет:

 Если же раскоментить любую/любые из этих строк, управления нет ни туда ни обратно. 

Если закоментить write, а stop и start не коментить, то:

lee пишет:

управления нет ни туда ни обратно.

то есть проблемы остаются

lee
Offline
Зарегистрирован: 13.03.2014

Ладно, думаю эту проблему мне нужно будет решить самому. Спасибо, leshak за помощь. Вам, Puhlyaviy, тоже спасибо.

4ERTIK
Offline
Зарегистрирован: 24.03.2013

Puhlyaviy пишет:

мне вот интересно.. ну сугубо в иследовательских целях.. вы специально тупите или это врожденое?

В свои 47 могу позволить и тупить . Ну пробовал я разные примеры , боясь спросить здесь на форуме,ничего не получалось . Перечитал от первой до последней страницы тему Nrf24l01 .Заканчивая читать  страницу- в голове была еще большая неразбериха. А БУКОВ там на много страниц . С NRF24 я разобрался как-то.... Да , может быть и тупо разобрался. Плеш или Флеш в голове уже не тот...Но понял я одно ...Помочь реально пытаются на этом форуме реально таким тупым как я  такие как maksim , leshak и другие. А товарищ Puhlyaviy только остроту своего молодого языка показывает.Или уровень его подготовки не позволяет ему, кроме сарказма и подколов , ничего другого. Лично я на форуме не видел ни одного поста от Puhlyaviy с практической помощью...Может ошибаюсь..Но в подколах он первый... Герой .Ребята , может хорош подкалывать и колоть ?Ну не все здесь програмисты с высшим . Форум для всех.А для юмористов можно завести отдельный раздел.

lee
Offline
Зарегистрирован: 13.03.2014
  radio.startListening(); 
  delay(20);

Все заработало, когда добавил задержку после startListening в void loop. Так же причиной нестабильной работы был выбранный 10 канал, после изменения его на 100 проблемы сбоев исчезли (смотрите сканером наличие помех в канале). Еще у меня были перепутаны CSN и SCK в одном из модулей.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

lee пишет:

Еще у меня были перепутаны CSN и SCK в одном из модулей.

гыыыыы. где то я такое уже видел.. доктор, не подскажете?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

пока доктор на мальдивах, я тоже расскажу, как меня китайцы подкололи. На приобретенном в DX шилде для Mega2560 на всех 72 площадках надписи +5 и GND были перепутаны местами (распаяно как "-+S", а написано как "+-S". Если учесть, что это был мой первый опыт работы с Arduino, подстава была жесткой :)

lee
Offline
Зарегистрирован: 13.03.2014

Почему с добавленой задержкой работает, а без нее нет? С delay вроде контроллер занят и не может (может ошибаюсь) выполнять других действий типа сохранений передачи и тп переменной?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Наверное потому, что после получения команды startListening сам модуль NRF чем-то занят (инициализация радиотракта, подстройка частоты приема/передачи, выбор свободноего канала и др.) И если сразу же отправить ему другие команды, то он их тупо проигнорирует, потому как буфер команд - это удел более дорогих модулей.

tika
Offline
Зарегистрирован: 22.07.2015

Здравствуйте. Нуждаюсь в помощи - не могу решить. Имею скеч на управление кнопками светодиодов. В оригинале в скече светодиоды горят до следующего нажатия на кнопку- Как исправить что бы светодиоды при нажатие светил всего 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(); 
}

 А нужно добавить такой вариант. но так не работает со строки 058
 
    
//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);
   

 

Большое спасибо за терпение. Надеюсь на вашу помощь.

tika
Offline
Зарегистрирован: 22.07.2015

Где Вы головы. Нужна помощь.Выслушаю все. Помогите соедить в 1 -но целое две рабочие половинки. Ну не силен, не могу и что теперь.

приемник

#
Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015
Для тестирования двусторонней передачи написал такой скетч.
Замечания:
1. У меня идентичные модули и потому частичная инициализация.
2. Пришлось припаять конденсатор 220Мф, а то без него UNO не хотел работать на прием.
3. Две линии перенес на А0 и А1.
Слушать через COM порт
 
Этот скетч надо залить без изменений на две Ардуинки.
#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++;
    }
}

 

 

tika
Offline
Зарегистрирован: 22.07.2015

 

Помогите соеденить две половинки в одно целое

Может это поможет


Megawollt
Offline
Зарегистрирован: 06.12.2015

Читайте тему по модулю. Приемопередача организуется другим способом

tika
Offline
Зарегистрирован: 22.07.2015

Да - если сидеть в другом кабинете и с планшетом в руках - то такая помощь меня бы устроила.

Конкретный  вопрос  о конкретной помощи. И… да не сижу я там.

tika
Offline
Зарегистрирован: 22.07.2015

Помогите в чем косяк


Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Вы пишете - ошибка в строке 064. Но по этой строке прослеживаются и другие ошибки, сделанные ранее.

В 064 написано digitalRead(BUTTON1),   а в строке 009 вы объявляли int pinBUTTON1=A0,

Далее, если А0 используете как цифровой пин, то он должен быть объявлен для ардуино УНО как 14, т.е. если номера цифровых пинов идут с 0 по 13, то А0=14, А1=15 и т.д. 

Далее, лучше было не использовать для объявления номеров пинов кнопок и диодов тип int, а объявить их через define, у вас и так код большой получается.

 

 

tika
Offline
Зарегистрирован: 22.07.2015

Большое спасибо ,

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

В #34 вы писали, что скеч рабочий. Вы его работу проверяли? Если он рабочий, то вы сами сможете его подправить, чтобы светодиод гас через определенное время. Сначала напишите кусок кода на управление светодиодом без delay, проверите его работу и потом подправите ''рабочий код".

tika
Offline
Зарегистрирован: 22.07.2015

=

tika
Offline
Зарегистрирован: 22.07.2015

Спасибо - прислушался к вашим словам. Написал отдельно c millis , проверил. Все работает – теперь буду переносить  на NFR24L01+. И спасибо за терпение к таким как Я.

tika
Offline
Зарегистрирован: 22.07.2015

Navigator пишет:

В #34 вы писали, что скеч рабочий. Вы его работу проверяли? Если он рабочий, то вы сами сможете его подправить, чтобы светодиод гас через определенное время. Сначала напишите кусок кода на управление светодиодом без delay, проверите его работу и потом подправите ''рабочий код".

Рабочий вариант включил в NRF24l01+ но вылезают такие ошибки - в чем косяк?

 
Build options changed, rebuilding all
_0000.ino: In function 'void loop()':
_0000.ino:148:1: error: a function-definition is not allowed here before '{' token
_0000.ino:165:1: error: a function-definition is not allowed here before '{' token
_0000.ino:386:5: error: expected '}' at end of input
_0000.ino:386:5: error: expected '}' at end of input
_0000.ino:386:5: error: expected '}' at end of input
Ошибка компиляции.
 

 

#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(); 
    }

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Строка 104 лишняя. Кол-во открывающих скобок должно быть равно кол-ву закрывающих.

Ещё строка 128, вроде, тоже не в кассу. Дальше лень искать :)

tika
Offline
Зарегистрирован: 22.07.2015

Честно говоря –эти скобы и не влияют здесь, но ошибки такие как - в  чем косяк? я на пути к победе ПОМОГИТЕ.

 
Build options changed, rebuilding all
_0010.ino: In function 'void loop()':
_0010.ino:148:1: error: a function-definition is not allowed here before '{' token
_0010.ino:165:1: error: a function-definition is not allowed here before '{' token
_0010.ino:386:5: error: expected '}' at end of input
_0010.ino:386:5: error: expected '}' at end of input
_0010.ino:386:5: error: expected '}' at end of input
_0010.ino:386:5: error: expected '}' at end of input
_0010.ino:386:5: error: expected '}' at end of input
Ошибка компиляции.
 
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 //**************************************************
147 void init_io(void)//недействительными init_io (недействительными)
148 {
149  
150   SPI_PORT&=~CE;            // Чип позволит
151   SPI_PORT|=CSN;            // Спи отключить   
152   SPI_PORT&=~SCK_pin;           // Спи часы линии инициализировать высокой
153 }
154  
155 /**************************************************
156  * Function: SPI_RW();//Функция: SPI_RW ();
157  *
158  * Description:// Описание:
159  * Writes one unsigned char to nRF24L01, and return the unsigned char read
160  * from nRF24L01 during write, according to SPI protocol
161    Пишет один неподписанный символ для NRF24L01, и вернуть неподписанные символ читать
162  * От NRF24L01 во пишут, в соответствии с протоколом SPI
163  **************************************************/
164 unsigned char SPI_RW(unsigned char Byte)//подписанные символ SPI_RW (неподписанные символ байт)
165 {
166   unsigned char i;                      //неподписанные символ я;
167   for(i=0;i<8;i++)                      // выход 8-бит
168   {
169     if(Byte&0x80)                       //если (байт & 0x80)
170     {
171       SPI_PORT |=MOSI_pin;    // Выход "неподписанные символ ', MSB для MOSI_pin
172     }
173     else                     //другой       
174     {
175       SPI_PORT &=~MOSI_pin;
176     }
177     SPI_PORT|=SCK_pin;                     // Установить SCK_pin высокий ..
178     Byte <<= 1;                         // Сдвиг следующий бит в MSB ..
179     if(SPI_IN & MISO_pin) //если (SPI_IN & MISO_pin)
180     {
181       Byte |= 1;                // Захватить текущее MISO_pin немного
182     }
183     SPI_PORT&=~SCK_pin;                    // ..то Установить SCK_pin низкий снова
184   }
185   return(Byte);                    // Возврат прочитать неподписанные символ
186 }
187 /**************************************************/
188  
189 /**************************************************
190  * Function: SPI_RW_Reg(); // Функция: SPI_RW_Reg ();
191  *
192  Description:// Описание:
193  * Writes value 'value' to register 'reg'// Записывает значение '' значение для регистрации '' рег
194 /**************************************************/
195 unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)//неподписанные символ SPI_RW_Reg (неподписанные символ рег, символьное значение без знака)
196 {
197   unsigned char status;// неподписанных статус символ;
198  
199   SPI_PORT&=~CSN;                   // ДНС низкий, инициализировать сделка SPI
200   status = SPI_RW(reg);             // Выбрать регистр
201   SPI_RW(value);                    // ..и Значение записи к нему ..
202   SPI_PORT|=CSN;                    // ДНС высокой снова
203  
204   return(status);                   // Вернуть NRF24L01 статус неподписанные символ
205 }
206 /**************************************************/
207  
208 /**************************************************
209  * Function: SPI_Read();//Функция: SPI_Read_Buf ();
210  *
211  Description://Описание:
212  * Read one unsigned char from nRF24L01 register, 'reg'Читайте одну неподписанные символ из регистра NRF24L01, "рег"
213 /**************************************************/
214 unsigned char SPI_Read(unsigned char reg)//неподписанные символ SPI_Read (неподписанные символ рег)
215 {
216   unsigned char reg_val;// неподписанные символ reg_val;
217  
218   SPI_PORT&=~CSN;                // ДНС низкий, инициализировать SPI связь ...
219   SPI_RW(reg);                   // Выбор зарегистрируйтесь, чтобы читать из ..
220   reg_val = SPI_RW(0);           // ..то Прочитать значение регистра
221   SPI_PORT|=CSN;                 // ДНС высокий, прекратить общение SPI
222  
223   return(reg_val);               // Возвращаемое значение регистра
224 }
225 /**************************************************/
226  
227 /**************************************************
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 /**************************************************/
234 unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)//неподписанные символ SPI_Read_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт)
235 {
236   unsigned char status,i;//неподписанных статус символ, я;
237  
238   SPI_PORT&=~CSN;                   // Установить ДНС низкий, инициализации SPI tranaction
239   status = SPI_RW(reg);             // Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ
240  
241   for(i=0;i<bytes;i++)             //для (я = 0; я <байт; я ++)
242   {
243     pBuf[i] = SPI_RW(0);    // // Выполнить SPI_RW читать неподписанные символ из NRF24L01
244   }
245  
246   SPI_PORT|=CSN;                   // Установить ДНС высокой снова
247  
248   return(status);                  // Вернуть NRF24L01 статус неподписанные символ
249 }
250 /**************************************************/
251  
252 /**************************************************
253  * Function: SPI_Write_Buf();//Функция: SPI_Write_Buf ();
254  *
255  Description://Описание:
256  * Writes contents of buffer '*pBuf' to nRF24L01//Записывает содержимое буфера '*', чтобы pBuf NRF24L01
257  * Typically used to write TX payload, Rx/Tx address//Обычно используется, чтобы написать полезную нагрузку TX, Rx / Tx адрес
258 /**************************************************/
259 unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)//неподписанные символ SPI_Write_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт)
260 {
261   unsigned char status,i;//неподписанных статус символ, я;
262  
263   SPI_PORT&=~CSN;                   // Установить ДНС низкий, инициализации SPI tranaction
264   status = SPI_RW(reg);             //  Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ
265   for(i=0;i<bytes; i++)             // затем написать все неподписанные символ в буфере (* pBuf)
266   {
267     SPI_RW(*pBuf++);               
268   }
269   SPI_PORT|=CSN;                   // Установить ДНС высокой снова
270   return(status);                  // Вернуть NRF24L01 статус неподписанные символ
271 }
272 /**************************************************/
273  
274 /**************************************************
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  **************************************************/
285 void initialize_R_T(void)//недействительными initialize_R_T (недействительными)
286 {
287   SPI_PORT&=~CE;
288  
289   SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Записывает TX_Address в NRF24L01
290   SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 же, как TX_Adr для Auto.Ack
291  
292   SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Включить Auto.Ack: Pipe0
293   SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Включить Pipe0
294  
295   SPI_RW_Reg(WRITE_REG + RF_CH, 50);        // Выбор радиочастотного канала 50
296   SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x26);   // TX_PWR: 0 дБм, DataRate: 250 Мбит, МШУ: HCURR
297  
298   SPI_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  **************************************************/
312 void TX_Mode(void//недействительными TX_Mode (недействительными)
313 {
314   SPI_PORT&=~CE;
315  
316   SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); // 500us + 86us, 10 Retrans ...
317   SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     // Установить PWR_UP немного, включите CRC (2 неподписанные знаков) и Прим: TX. MAX_RT & TX_DS включен ..
318   SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
319  
320   SPI_PORT|=CE;
321 }
322  
323 /**************************************************
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 /**************************************************/
333 void RX_Mode(void)//недействительными RX_Mode (недействительными)
334 {
335   SPI_PORT&=~CE;
336   
337   SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Выбор же RX ширину полезной нагрузки как TX шириной Payload
338   SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     //Установить PWR_UP немного, включите CRC (2 неподписанные символов) & Прим: RX. Включен RX_DR ..
339   
340   SPI_PORT|=CE;                             // Установить CE контактный высокой для того, чтобы устройство RX
341 }
342  
343 //RF transmit data function// Функция передачи данных РФ
344 void RF_SendData(char *TXdata)
345 {
346     TX_Mode();  // Включить режим Tx                                                // activate Tx mode
347     
348     for(short i=0; i<23;i++)// для (короткий я = 0; я <23; я ++)
349     {
350       tx_buf[i] = (unsigned char)*(TXdata+i);  // Сохранить данные в массив                                   // store the data to an array
351     }     
352       
353     unsigned char status = SPI_Read(STATUS);   // Читаем значение регистра статуса в                // read register STATUS's value
354     
355     if(status&TX_DS)    // если данные готовы получить (TX_DS) прервать                                       // if receive data ready (TX_DS) interrupt
356     {
357       SPI_RW_Reg(FLUSH_TX,0);                                 
358       SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);       // Запись в TX_FIFO playload
359     }
360     if(status&MAX_RT)                                         // если принимать данные готовые (MAX_RT) прервать это повтора чем SETUP_RETR
361     {
362       SPI_RW_Reg(FLUSH_TX,0);
363       SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);      // Отключение режима Standy
364     }
365     SPI_RW_Reg(WRITE_REG+STATUS,status);                     // Ясно RX_DR или TX_DS или MAX_RT флаг прерывания
366     delay(50);
367     RX_Mode();   
368 }
369  
370 //RF receive data function// РФ получить функцию передачи данных
371 void RF_ReceiveData(unsigned char *RXdata)// недействительными RF_ReceiveData (неподписанные символ * RXdata)
372 {
373     RX_Mode();      // Включить режим RX                                               
374     unsigned char status = SPI_Read(STATUS);  // Читаем значение регистра статуса в
375     if(status&RX_DR)                                                 // если данные готовы получить (TX_DS) прервать
376     {
377       SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);             // Прочитать playload в rx_buf
378       SPI_RW_Reg(FLUSH_RX,0);                                        // Ясно RX_FIFO                              
379       
380       *RXdata = rx_buf[0];                                           // передать полученные данные в RXdata
381       Serial.println(rx_buf[0]);
382     }
383     SPI_RW_Reg(WRITE_REG+STATUS,status);                             // Ясно RX_DR или TX_DS или MAX_RT флаг прерывания
384     delay(50);
385     TX_Mode();
386     }

 

tika
Offline
Зарегистрирован: 22.07.2015
Народ уже 3-й вариант и ошибка таже-в чем косак?
 
 
_222.ino: In function 'void loop()':
_222:128: error: a function-definition is not allowed here before '{' token
_222:142: error: a function-definition is not allowed here before '{' token
_222:363: error: expected `}' at end of input
_222:363: error: expected `}' at end of input
_222:363: error: expected `}' at end of input
_222:363: error: expected `}' at end of input
 
#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(); 
}

 

 
 

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

в строке 112 скобка открывается, а закрывающей нигде далее нету.