не могу получить данные по NRF24L01 с DHT22

dimasinnet
Offline
Зарегистрирован: 18.06.2013

взял коды с просторов интернета, и немного переделал под себ. Проблема в том, что приемник, не принимает(или передатчик не отдает) данные с датчика DHT22, причем передачик, когда подключен по USB в сериал данные шлет отлично. вот скетчи, подскажите если кто ошибку видит, заранее благодарен.

Приемник:

#include "SPI.h"
#include "nRF24L01.h"
#include "RF24.h" // https://github.com/maniacbug/RF24

const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"

RF24 radio(9, 10); // CE, CSN

void setup(){
  Serial.begin(9600);
  
  radio.begin();  
  delay(2);
  radio.setChannel(9); // канал (0-127)
  
    // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
    // RF24_250KBPS на nRF24L01 (без +) неработает.
    // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS);     
  
    // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);   
    
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу
}
 
//  radio.stopListening(); // останавливает приём (нужно перед началом передачи) 


void loop()   
{
  
  if (radio.available()){ // проверяем не пришло ли чего в буфер.
   int data[3];

    radio.read(&data, sizeof(data)); // читаем данные и указываем сколько байт читать
    
      Serial.print("Humidity (%): ");
      Serial.println(data[1]);
      Serial.print("Temperature (oC): ");
      Serial.println(data[0]);
       Serial.print("chislo: ");
      Serial.println(data[3]);
 
    } 
    else Serial.println("no data");// это уж сам дописал, именно это и пишется в сериале, зн нужные данные не получает
    delay(1000);
} 

Перредатчик:

 

#include "SPI.h"
#include "nRF24L01.h"
#include "RF24.h" // https://github.com/maniacbug/RF24


#include "DHT.h"
#define DHTPIN 7    // what pin we're connected to

const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"

RF24 radio(9, 10); // CE, CSN



#define DHTTYPE DHT22  


DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
  radio.begin();
  delay(2);
  radio.setChannel(9); // канал (0-127)
    
    // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
    // RF24_250KBPS на nRF24L01 (без +) неработает.
    // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS); 
   
    // мощьность передатчика, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);   

  radio.openWritingPipe(pipe); // открываем трубу на передачу.
  delay(1000);
}

void loop() {
  
  int data[3];   
  
  data[0] = int(dht.readHumidity()); // заполняем массив
  data[1] = int(dht.readTemperature());
  data[2] = int(5);
  delay(100);
  radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет
  
  Serial.print("Humidity (%): ");
  Serial.print(data[0]);
  Serial.print("   chislo:  ");
  Serial.print(data[2]);

  Serial.print("    Temperature (oC): ");
  Serial.println(data[1]);
  delay(1000);

}

 

Vладимир
Offline
Зарегистрирован: 27.01.2015

заремируй ВСЕ что связано с датчиками

и попробуй передать зарание( в ручную) заполненный масив

если не помогло убирай весь Serial который у тебя после отсылки данных стоит

------

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

на nrf24 и пин для этого есть

dimasinnet
Offline
Зарегистрирован: 18.06.2013

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

Даже пробовал NRFки отдельно запитывать.

Передатчик:

#include <SPI.h>
#include "RF24.h"
#include "DHT.h"

#define DHTPIN 7 
#define DHTTYPE DHT22 

DHT dht(DHTPIN, DHTTYPE);

RF24 radio(9, 10);

const uint64_t pipes = 0xF0F0F0F000LL;// адреса каналов приема и передачи

void setup(){
  
dht.begin();
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_250KBPS); // Скорость передачи
radio.setChannel(100); // Номер канала от 0 до 127
//radio.setRetries(15,15); // Кол-во попыток и время между попытками
radio.openWritingPipe(pipes); // Открываем канал передачи
//radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
//radio.startListening(); // Начинаем слушать эфир

}

void loop()
{
  
  int data[3];   
 
  data[0] = int(dht.readHumidity()); // заполняем массив
  data[1] = int(dht.readTemperature()); 
  data[2] = int(5);
  delay(1000);
  radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет
  
 /* Serial.print("Humidity (%): ");
  Serial.print(data[0]);
  Serial.print("   chislo:  ");
  Serial.print(data[2]);

  Serial.print("    Temperature (oC): ");
  Serial.println(data[1]);
  //delay(1000);*/
}

Приемник:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(9, 10);
volatile boolean flag_tx, flag_fail, flag_rx;

const uint64_t pipes = 0xF0F0F0F000LL;// адреса каналов приема и передачи

void setup()
{
  attachInterrupt(1, check_radio, FALLING); 
  Serial.begin(9600);
  radio.begin();

radio.setDataRate(RF24_250KBPS); // Скорость передачи
radio.setChannel(100); // Номер канала от 0 до 127
//radio.setRetries(15,15); // Кол-во попыток и время между попытками
//radio.openWritingPipe(pipes[0]); // Открываем канал передачи
radio.openReadingPipe(1, pipes); // Открываем один из 6-ти каналов приема
radio.startListening(); // Начинаем слушать эфир
}
void check_radio(){ // обработчик прерывания
  bool tx, fail, rx;
  radio.whatHappened(tx,fail,rx); // читаем регистр
  flag_tx = tx; // 1 если успешно отправили данные
  flag_fail = fail; // 1 если данные не отправленны   
  flag_rx = rx;  // 1 если пришли данные для чтения 
}

void loop(){

if (flag_rx){ // если пришли данные для чтения
     int data[3]; // забераем их и выводим на экран
     radio.read(&data, sizeof(data));     
       Serial.print(data[1]);
       Serial.println("   - temperatura");
       Serial.print(data[0]);
       Serial.println("   - Humi");
        Serial.print(data[2]);
       Serial.println("   - chislo");
       delay(1000);
  flag_rx = 0;
  }
  
  if (flag_fail){ // если данные не отправленны
    flag_fail = 0;

  }
   
  if (flag_tx){ // если данные отправленны 
  flag_tx = 0;
  
  } 

}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

100 лет назад перешёл на Serial.begin(115200) и  жалею что в ИДЕ больше нельзя ......

В Realterm  проверял - даже Serial.begin(921600) прекрасно работает.

dimasinnet
Offline
Зарегистрирован: 18.06.2013

Дмаю, здесь это не спасет...

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

radio.write возвращает bool с результатом выполения, попробуй добавить if на этот bool.

Я для передатчика всё равно пайп на чтение открывал, ибо не знаю, как там отчет о приёме ходит. :)

 

Ну и DHT22 чаще раза в 2 секунды опрашивать смысла нет.

dimasinnet
Offline
Зарегистрирован: 18.06.2013

переписал вообще все. сделал счетчик для опроса датчика, т.е. получаю их каждые 10 секунд, и только потом пишу в массив и отправляю этот массив. от руки заполняю массив цифрами, все приходит, как только пытаюсь запихнуть значения с датчика, все... тишина. приходит 2 раза, только при нажатии на резет на передатчике. пробовал слать с потенциометра данные, летят как миленькие, все пишет в сериал с приемника. Припаял кандеры на NRFки, проблему не решило. вот какой скетч на данный момент:

Приемник:

#include <SPI.h>
#include "RF24.h"

//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino

//SCK -> 13//MISO -> 12//MOSI -> 11
RF24 radio(9,10); //CSN -> 10//CE -> 9

const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала
int msg[2]; //объявляем массив

void setup()

{
radio.begin();
Serial.begin(9600);
radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема
radio.startListening(); // Начинаем слушать эфир
}
void loop()
{

if (radio.available()){

radio.read(&msg, sizeof(msg));

    Serial.print("Temperatura "); 
    Serial.print(msg[0]);
    Serial.print("    ");
    Serial.print("Vlagnost "); 
    Serial.print(msg[1]);
    Serial.print("    ");


}
}

Передатчик:

#include <SPI.h>
#include "DHT.h"
#include "RF24.h"

int msg[2];
int temp;
int humi;

#define DHTPIN 4 //Пин подключения DHT
#define DHTTYPE DHT11 //Прописываем тип датчика температуры
DHT dht(DHTPIN, DHTTYPE);
//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino

//SCK -> 13//MISO -> 12//MOSI -> 11

RF24 radio(9,10);//CSN -> 10//CE -> 9
unsigned long temp_old; //время последнего опроса датчика
unsigned long time_over; //Для переполнения счетчика
const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи


//------------------------------------Функция для опроса датчика с определенной переодичностью-------------------------------------

boolean get_temp(int t)//получаем температуру с периодичностью t(миллисекунды)
{
unsigned long m;
m=get_millis();
if (m-temp_old>t)//если период наступил
{

int temp_new;
int humi_new;
//temp_kitchen_new=sensors.getTempC(t2);
//temp_bath_new=sensors.getTempC(t1);
  temp_new=dht.readTemperature();//Читаем показания датчиков
  humi_new=dht.readHumidity();

if ((temp_new>10) & (temp_new<50)) temp=temp_new; if ((humi_new>10) & (humi_new<100)) humi=humi_new;

temp_old=m;
return true;
} else return false; //если период не наступил возвращаем false
}

//-----------------------------------------Т.к. мы работаем с счетчиками миллисекунд, то напишем функцию для обработки их переполнения.---------------------------------------------------

unsigned long get_millis()//избавляемся от переполнения
{
unsigned long m;
m=millis();
if(m<time_over)//если произошло переполнение то обнуляем все переменные времени
{
time_over=0;
temp_old=0;
}
return m;
}

//---------------------------------------------------

void setup(void)
{
dht.begin();
radio.begin();
Serial.begin(9600);
radio.openWritingPipe(pipe); // Открываем канал передачи
}

void loop(void){


if (get_temp(10000)==true) \\Если условия счетчика выполнились, заполняем массив
{
msg[0] = temp;
msg[1] = humi;

}

radio.write(&msg, sizeof(msg));//отправляем данные

//Serial.println(msg[0]);
//Serial.println(msg[1]);
delay(100);

}

ПС: Щас попробую для экспиримента даллас подключить, или датчик дыма

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

А не проще впиндюрить delay?

dimasinnet
Offline
Зарегистрирован: 18.06.2013

аааа, пендюрил... все одно. щас вон с youtube взял пример готовый, и библиотеки все по новой качнул по егоссылкам, у чела шлется все, у меня нет.. и NRFки менял и дуины менял. не работает... именно DHT 22 и DHT11, пробовал по командам 1,2,3,4 гасить и зажигать светодиоды - все работает(брал у Осипова примеры), массив заполненный рукой - шлет, с потенциометра - шлет, ХЗ что такое 

Самое интересное, они приходят 2 раза!!! когда на передатчике жмешь резет.

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

Я делал не через массив, а через структуру.

Клиент на UNO https://github.com/radjah/arduino/blob/master/RF24/temp_nw/client_SHT21/...

Сервер на NANO https://github.com/radjah/arduino/blob/master/ReadSHT2x_nosd_nolcd/ReadS...

С DHT тоже работало.

dimasinnet
Offline
Зарегистрирован: 18.06.2013

Огромное спасибо, мир не без добрых людей!:) щас попробую перепилить под себя.

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

Собственно вот. Только на передающей стороне дисплея уже нет, и туда я еще RTC добавил.

vovka1021
Offline
Зарегистрирован: 02.02.2016

Radjah пишет:

Собственно вот. Только на передающей стороне дисплея уже нет, и туда я еще RTC добавил.

можете дать скетч?