(NRF24L01) кто сталкивался с такой проблемой

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Данные передаются только при включении передатчика всего один раз. Насколько я понимаю они должны передаваться циклично

Код передатчика

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN  9
#define CSN_PIN 10
#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE);
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int dannye[3];

void setup()
{
  Serial.begin(9600);
  dht.begin();
  radio.begin();
  radio.openWritingPipe(pipe);
}

void loop()
{
  dannye[0]=dht.readHumidity();
  dannye[1]=dht.readTemperature();
  radio.write(dannye, sizeof(dannye) );
    //Serial.print("Humidity :");
    //Serial.println(dannye[0]);
    // Serial.print("Temperature :");
    // Serial.println(dannye[1]);
}

 

Код приемника

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN  9
#define CSN_PIN 10
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int dannye[3];

void setup()
{
Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  Serial.print("Listening");
}


void loop()
{
  if ( radio.available() )
  {
    bool done = false;
    while (!done)
    {
      done = radio.read( dannye, sizeof(dannye) );
      Serial.print("Humidity :");
      Serial.println(dannye[0]);
      Serial.print("Temperature :");
      Serial.println(dannye[1]);
   
     
}
  }
  }

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

В сериале выдает:



Listening

Humidity : 36

Temperature :25

mixail844
Offline
Зарегистрирован: 30.04.2012

В вашем коде приемника ,после изменения значения переменной done на !false оно не меняет обратно свое значиние,и поэтому цикл  while происходит всего 1 раз.

еще вот такая "безумная" идея : 

в программе приемнике : 

при 1-ом заходе в цикл loop() создаеться переменная bool done = false; в памяти она сидит под неким псевдонимом - допустим done'1.первый заход в цикл while,в теле которого done принимает значение !true и уже в следующий раз в цикл while не захдит.

при втором заходе в loop() опять инициализируеться bool done = false; но в этот раз она сидит в памяти под псевдонимом done'2.а поскольку условие цикла все еще работает с переменной done'1 то и условие цикла while выполняеться всего 1 раз.

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Прошу прощения не совсем разбираюсь в этом.  false изменить на true? 

Araris
Offline
Зарегистрирован: 09.11.2012

Попробуйте

void loop()
{
 if ( radio.available() ) 
 {
 radio.read( dannye, sizeof(dannye) ); 
 Serial.print("Humidity :");
 Serial.println(dannye[0]);
 Serial.print("Temperature :");
 Serial.println(dannye[1]);
 }
}

vankenshtein
Offline
Зарегистрирован: 15.04.2014

хорошо, попробую отпишусь. Спасибо за совет

toc
Offline
Зарегистрирован: 09.02.2013

vankenshtein, добавьте в код передатчика после отправки паузу 1 сек. Вряд ли вам нужна информация чаще.
или можно отправлять только если показания изменились.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

странно. а у меня в машинке управление работает, а код почти один в один как у тс, только указываю размер массива не используя sizeof, ну и массив у меня не int

бла бла бла

byte msg[3];

void setup(){ 
  radio.begin();
  radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир 
  myservo.attach(2);
  pinMode(dir, OUTPUT);
  pinMode(pwm, OUTPUT);
} 
void loop(){ 
  if (radio.available()){
    bool done = false;
    while (!done){
      done = radio.read(msg, 3);
      myservo.write(map(msg[0],0,180,71,131));
      if(msg[2]==0){
        digitalWrite(dir, msg[2]);
        analogWrite(pwm, msg[1]);
      }
      if(msg[2]==1){
        digitalWrite(dir, msg[2]);
        analogWrite(pwm, 255-msg[1]);
      }
    }
  }
}
бла бла бла

byte msg[3];

void setup() 
{ 
  radio.begin();
  radio.setRetries(1,1);
  radio.openWritingPipe(pipe); // Открываем канал передачи
  Inicialize(1);
  Led_On;
} 
 
void loop() 
{ 
  napr();
  sped();
  radio.write(msg, 3);
} 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а разница в следующем

Обратите внимание, что sizeof возвращает общее количество байтов. Поэтому, при работе с массивами более объемных типов данных (такими, как int), цикл будет выглядеть примерно так. Кроме того, не забывайте, что правильно объявленная строка заканчивается нулевым символом с ASCII-кодом 0.

?
for (i = 0; i < (sizeof(myInts)/sizeof(int)) - 1; i++) {
  // какие-либо операции с myInts[i]
}

у тс возвращается 6 а должно быть 3)) обращать надо внимание на типы данных

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Araris пишет:

Попробуйте

void loop()
{
 if ( radio.available() ) 
 {
 radio.read( dannye, sizeof(dannye) ); 
 Serial.print("Humidity :");
 Serial.println(dannye[0]);
 Serial.print("Temperature :");
 Serial.println(dannye[1]);
 }
}

 

попробовал, к сожалению не помогло

vankenshtein
Offline
Зарегистрирован: 15.04.2014

toc пишет:
vankenshtein, добавьте в код передатчика после отправки паузу 1 сек. Вряд ли вам нужна информация чаще. или можно отправлять только если показания изменились.

 

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

кому я написал. тс то пофиг))

vankenshtein
Offline
Зарегистрирован: 15.04.2014

простите я вас не понял, что такое тс?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

топикстартер. человек открывший тему. ты короче

vankenshtein
Offline
Зарегистрирован: 15.04.2014

jeka_tm пишет:

топикстартер. человек открывший тему. ты короче

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а ты читал мои посты?

вместо

int dannye[3];

надо

byte dannye[3];

и можно заодно отказаться от sizeof и указывать размер массива, так как мы точно его знаем

radio.write(dannye, 3 );
done = radio.read( dannye, 3);

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

спасибо большое, сейчас попробую

vankenshtein
Offline
Зарегистрирован: 15.04.2014
 
radio.write(dannye, 3 );  это в приемник
 
done = radio.read( dannye, 3);  это в передатчик
 
Правильно я вас понял? Ситуация изменилась, данные приходят дважды и потом тишина
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

наоборот)) ты все перепутал

все сделал как я написал? массиву тип данных изменил?

код как был изначально все оставить также, только изменить тип данных еще

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Передатчик

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN  9
#define CSN_PIN 10
#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPIN 2 
DHT dht(DHTPIN, DHTTYPE);
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
byte dannye[3];

void setup()
{
  Serial.begin(9600);
  dht.begin();
  radio.begin();
  radio.openWritingPipe(pipe); 
}

void loop() 
{
  dannye[0]=dht.readHumidity();
  dannye[1]=dht.readTemperature();
  radio.write(dannye, 3 );

  //  Serial.print("Humidity :");
    // Serial.println(dannye[0]); 
     // Serial.print("Temperature :");
    //  Serial.println(dannye[1]); 
}

 

 

Приемник

 

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN  9
#define CSN_PIN 10
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
byte dannye[3];

void setup() 
{
 Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  Serial.println("Listening.....");
}


void loop() 
{ 
  if ( radio.available() )
  {
    bool done = false;
    while (!done)
    { done = radio.read( dannye, 3);
      Serial.print("Humidity :");
      Serial.println(dannye[0]); 
      Serial.print("Temperature :");
      Serial.println(dannye[1]);
}
 }
  }

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

перепутал 

read в приемник, write в передатчик, тип данных изменил

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

и все равно не работает?

vankenshtein
Offline
Зарегистрирован: 15.04.2014

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

убери все про dht, и просто в цикле отправляй данные. данные принимай и в uart отправляй

надо исключить возможные глючные элементы

vankenshtein
Offline
Зарегистрирован: 15.04.2014

если расскоментировать строки   

//  Serial.print("Humidity :");
29
    // Serial.println(dannye[0]);
30
     // Serial.print("Temperature :");
31
    //  Serial.println(dannye[1]);

то в порте передатчика нормально выдает данные

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я уже предложил что сделать чтобы выявить проблему

vankenshtein
Offline
Зарегистрирован: 15.04.2014

вы правы что то с dht

void loop()
{
  dannye[0]=15;
  //dht.readHumidity();
  dannye[1]=10;
  //dht.readTemperature();
  radio.write(dannye, 3);
}

в приемнике сыпятся 10 и 15 все работает. Поискать другую библиотеку на dht?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

 

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

не подскажете в приемнике или передатчике?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

dht ))) там надо копать

передатчик

vankenshtein
Offline
Зарегистрирован: 15.04.2014

хорошо, спасибо большое за помощь. разберусь отпишу

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

убери все про радиомодуль и проверь отдельно dht, отсылай данные просто в uart

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014
#include <SPI.h>
//#include <nRF24L01.h>
//#include <RF24.h>
//#define CE_PIN  9
//#define CSN_PIN 10
#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE);
//const uint64_t pipe = 0xE8E8F0F0E1LL;
//RF24 radio(CE_PIN, CSN_PIN);
//byte dannye[3];
void setup()
{
  Serial.begin(9600);
  dht.begin();
 // radio.begin();
 // radio.openWritingPipe(pipe);
}
void loop()
{
 // dannye[0]
byte h=dht.readHumidity();
 // dannye[1]
byte t=dht.readTemperature();
  //radio.write(dannye, 3);
  Serial.print("Humidity:");
  Serial.println(h);
  Serial.print("Temperature:");
  Serial.println(t);
}

в сериале

Humidity:33
Temperature:29
Humidity:33
Temperature:29
Humidity:33
Temperature:29
Humidity:33
Temperature:29
Humidity:33
Temperature:29
Humidity:33
Temperature:29
 

Все работает нормально. В чем проблема?

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

не могу разобраться((

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

попробуй просто в передатчике добавить задержку ну например 1 секунду

void loop()
{
  dannye[0]=dht.readHumidity();
  dannye[1]=dht.readTemperature();
  radio.write(dannye, 3 );
  delay(1000);
}

а также ускорить uart

Serial.begin(115200);

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

vankenshtein
Offline
Зарегистрирован: 15.04.2014

а что за проблема была в dht?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так заработало или нет?

vankenshtein
Offline
Зарегистрирован: 15.04.2014

сейчас нету с собой ардуинок, завтра только

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну что ты за человек. арудина всегда должна быть с тобой, купи arduino micro, она размером меньше обычной флешки, и носи с собой

+10 к программированию ардуины сразу

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

но зато сразу +20 к программированию и +10 к харизме

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

))) и потом к проктологу

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

не изверги же. ладно там мини додумаются, а то вдруг кто додумается uno или mega запихать. нехорошо

но зато если посидишь на форуме поймешь кто как повышает свои навыки в программировании))

vankenshtein
Offline
Зарегистрирован: 15.04.2014

попробовал, не помогло(((

 

подключил барометр....... та же история(((

данные либо один раз, либо два раза приходят и все, может дело в библиотеке?

vankenshtein
Offline
Зарегистрирован: 15.04.2014

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хз. получается дело только в передатчике

в приемнике так делал?

Serial.begin(115200);

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

ога, не прокатило((

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

пока больше ничего в голову не приходит. либо дело в dht либе, либо может что то с типами данных

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Помогли люди добрые))) Выложу может комуто пригодится

Передатчик:

#include <SPI.h> // библиотека для SPI интерфейса
#include <RF24.h>// библиотека для беспроводного передатчика nRF24L01+
#include <RF24Network.h>
#include "DHT.h" // библиотека для работы с датчиком температуры и влажности DHT

DHT dht;        // инициализация датчика DHT22
#define dnt_pin 4
float humidity;        // влажность
float temperature;    // температура (в градусах цельсия)

//////Подключение nRF24L01+/////////////
/*
Передатчик    |    arduino nano v3
1  Gnd        |  Gnd (минус)
2  Vcc        |  + 3.3 В (только 3.3!!!!)
3  CE        |  D9
4  CSN        |  D10
5  SCK        |  D13
6  MOSI      |  D11
7  MISO      |  D12
8  IRQ        |  в данной программе не используется
*/
#define CE 9
#define CSN 10
//////Инициализация и первичная настройка nRF24L01+//////
RF24 radio(9, 10);
RF24Network network(radio);
const uint16_t this_node = 1; // Address of our node
const uint16_t other_node = 0; // Address of the other node

boolean query = false; // статус запроса на измерение температуры и влажности и передачу данных
int serial_command;    // команда, принятая через serial порт

struct payload_t
{
  float a;
  float b;
};

void setup()
{
  Serial.begin(9600);
  dht.setup(dnt_pin);      // data pin 4 // вход для датчика DHT22
  SPI.begin();
  radio.begin();          //настройка nRF24L01+
  network.begin(/*channel*/ 90, /*node address*/ this_node);
}

void read_sensor(){        //выполняем измерение температуры и влажности
  delay(dht.getMinimumSamplingPeriod());
  temperature = dht.getTemperature();
  humidity = dht.getHumidity();
  Serial.println("read seansor");
  Serial.print(temperature, 1);    // 1 - количество знаков после запятой
  Serial.print(" \t");            // табуляция, отступ
  Serial.println(humidity, 1);
}

void loop()
{

  read_sensor();
  // Pump the network regularly
  network.update();
  payload_t payload = {temperature, humidity};
  RF24NetworkHeader header(/*to node*/ other_node);
    bool ok = network.write(header,&payload,sizeof(payload));
    if (ok)
      Serial.println("ok.");
    else
      Serial.println("failed.");
}

 

 

Приемник:

#include <SPI.h> // библиотека для SPI интерфейса
#include <RF24.h>// библиотека для беспроводного передатчика nRF24L01+
#include <RF24Network.h>


//////Подключение nRF24L01+/////////////
/*
Передатчик    |    arduino nano v3
1  Gnd        |  Gnd (минус)
2  Vcc        |  + 3.3 В (только 3.3!!!!)
3  CE        |  D9
4  CSN        |  D10
5  SCK        |  D13
6  MOSI      |  D11
7  MISO      |  D12
8  IRQ        |  в данной программе не используется
*/
#define CE 9
#define CSN 10
//////Инициализация и первичная настройка nRF24L01+//////
RF24 radio(9, 10);
// Network uses that radio
RF24Network network(radio);

// Address of our node
const uint16_t this_node = 0;

// Address of the other node
const uint16_t other_node = 1;

//float humidity = 9999;        // влажность
//float temperature = 9999;    // температура (в градусах цельсия)
//int serial_command = 0;

// Structure of our payload
struct payload_t
{
  float a;
  float b;
};

void setup(){
  Serial.begin(9600);
  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 90, /*node address*/ this_node);
}

void loop(){
  // Pump the network regularly
  network.update();
  // Is there anything ready for us?
  while ( network.available() )
  {
    // If so, grab it and print it out
    RF24NetworkHeader header;
    payload_t payload;
    network.read(header,&payload,sizeof(payload));
    Serial.print("Received ....");
    Serial.print(" \t");
    Serial.print(payload.a);
    Serial.print(" \t");
    Serial.println(payload.b);
  }
}

Проверил, все работает

vankenshtein
Offline
Зарегистрирован: 15.04.2014

По поводу машинки, интересно) Какое железо стоит? какой регуль? можете весь скетч выложить?

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Вот мой скетч на машинку.

Передатчик:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN  9
#define CSN_PIN 10
#define JOYSTICK_X A0
#define JOYSTICK_Y A1
#define JOYSTICK_Z A2
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int joystick[4];
void setup()

{
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
}

void loop() 
{
  joystick[0] = analogRead(JOYSTICK_X);
  joystick[0] = map(joystick[0],0,1023,180,1);
  joystick[1] = analogRead(JOYSTICK_Y);
  joystick[2] = analogRead(JOYSTICK_Z);
  joystick[2] = map(joystick[2],0,1023,130,50);
  joystick[3] = digitalRead(2);
 
  radio.write( joystick, sizeof(joystick) );
}

 

 

Приемник:

 

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
Servo myservo;
Servo myservo2;
#define CE_PIN  9
#define CSN_PIN 10
int pwm = 0;
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int joystick[4];
#define LED_LIGHT  5
#define LED_PIN  3
#define LED_PIN1  2
#define  INTERVAL  200UL
void setup() 
{
 
  delay(1000);
 
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();;
  myservo.attach(4);
  myservo2.attach(8);
  pinMode (LED_PIN, OUTPUT); 
  pinMode(LED_PIN1, OUTPUT);
}


void loop() 
{
  if ( radio.available() )
  {
   
    bool done = false;
    while (!done)
    {
      done = radio.read( joystick, sizeof(joystick) );
     
      myservo.write(joystick[0]);
     
      myservo2.write(joystick[2]);
      
      if(joystick[2]<85)
{  
  static unsigned long previousMillis = 0; 
  if(millis() - previousMillis > INTERVAL) {
    // сохраняем время последнего переключения
    previousMillis = millis();  
     
    // меняем состояние выхода светодиода на противоположное текущему. 
    // если горит - тушим, не горит - зажигаем.
    digitalWrite(LED_PIN,!digitalRead(LED_PIN));
  }
}
else if (joystick[2]>95)
{
  static unsigned long previousMillis = 0; 
  if(millis() - previousMillis > INTERVAL) {
    // сохраняем время последнего переключения
    previousMillis = millis();  
     
    // меняем состояние выхода светодиода на противоположное текущему. 
    // если горит - тушим, не горит - зажигаем.
    digitalWrite(LED_PIN1,!digitalRead(LED_PIN1));
  }
}
    else
  {   
    digitalWrite(LED_PIN1, LOW);
    digitalWrite(LED_PIN, LOW);
  }  

    
      
      digitalWrite(LED_LIGHT, !joystick[3]);
     
     
   
  }
}
  }

При повороте руля мигают поворотки, и фары включаются с кнопки)) Вместо регуля стоит электроника от сервы по этому слабовато гоняет(2 вольта всего выдает). Планирую собрать схемку на полевиках

Radjah
Offline
Зарегистрирован: 06.08.2014

Я бы не местое ТС сделал не массив, а структуру и передавал бы её по радио. И именовать поля удобно, и в индексах не запутаешься.

У меня тоже были проблемы с отправкой. Я указал минимальную скорость в 250 килобит и жестко забил канал передачи.

А sizeof() на то и нужна, чтобы байты не считать. :)

vankenshtein
Offline
Зарегистрирован: 15.04.2014

спасибо, понял, исправим