И снова NRF24L01

Suppchik
Offline
Зарегистрирован: 21.03.2018

После долгих мучений nrf заводится работает только на некоторых каналах, хотя все выбранные каналы чистые, но это пол беды, после включения они отваливаются и перестают передавить\принимать данные кондеры стоят керамика на 0.47 и полярник на 220

Передатчик



#include <SPI.h>
// библиотека для работы с SD-картами
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include "nRF24L01.h"     // библиотека радиомодуля
#include "RF24.h"         // ещё библиотека радиомодуля
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress i247={0x28, 0xFF ,0xDD ,0x02 ,0x01 ,0x17 ,0x04 ,0xB5};
DeviceAddress o247={0x28 ,0xFF ,0xD3 ,0x40 ,0x01 ,0x17 ,0x05 ,0xAE};

DeviceAddress i248={0x28 ,0xFF ,0xF0 ,0x0F ,0x01 ,0x17 ,0x05 ,0x62};
DeviceAddress o248={0x28 ,0xFF ,0x3B ,0x1A ,0x01 ,0x17 ,0x05 ,0x89};

DeviceAddress i250={0x28 ,0xFF ,0x8C ,0x03 ,0x01 ,0x17 ,0x04 ,0x62};
DeviceAddress o250={0x28 ,0xFF ,0x04 ,0xBF ,0x00 ,0x17 ,0x05 ,0xE1};

int data[6];

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //открываем порт для связи с ПК

  sensors.begin();// открываем последовательный порт на скорости 9600 бод

   sensors.setResolution(i247, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o247, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(i248, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o248, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(i250, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o250, TEMPERATURE_PRECISION);
  delay(50);
        
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x5f);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик

Serial.println("SETTING DONE");
}

void loop() {
  // put your main code here, to run repeatedly:

  Serial.println("LOOP");
   sensors.requestTemperatures();
delay(100);

   data[0] = sensors.getTempC(i247);
   data[1] = sensors.getTempC(o247);
   
   data[2] = sensors.getTempC(i248);
   data[3] = sensors.getTempC(o248);
   
   data[4] = sensors.getTempC(i250);
   data[5] = sensors.getTempC(o250);
  for(int i=0;i<6;i++)
  {
   Serial.println(data[i]);
  }
radio.flush_tx();
radio.write(&data, sizeof(data));
}

 

Приемник


#include <SPI.h>
// библиотека для работы с SD-картами
#include "nRF24L01.h"
#include "RF24.h"
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <ModbusRtu.h>
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

int data[6];
RF24 radio(9,10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
uint32_t startTime = millis(), currentMillis,previousMillis=0,cooldown=15000;

//n1=i235,n18=o235
//n0=i237,n16=o237
//n15=i242,n8=o242
//n17=i-srednetemp;n2=o-srende;
//n3=osred1,n5=osred2
//n7=o234,n19=i234
//n4-o244,n10-i244
//n12=o241,n14=o240
//n6-n11-245
/*
  
 0x28, 0xFF, 0x38, 0x71, 0x00, 0x17, 0x05, 0x68,  r237 isparitelb
 0x28, 0xFF, 0x63, 00x0, 0x01, 0x17, 0x03, 0xDC, r237 obiem 
  
 0x28, 0xFF, 0xCF, 0x37, 0x01, 0x17, 0x04, 0x83,  r236 obiem
 0x28, 0xFF, 0x94, 0xDD, 0x00, 0x17, 0x05, 0xC1,  r236 isparitelb

0x28, 0xFF, 0xAB, 0x07, 0x01, 0x17, 0x04, 0xC5,   without  isparitelb sred temperatur
0x28, 0xFF, 0xF4, 0x01, 0x01, 0x17, 0x04, 0x36,   without obiem sred temperatur

0x28, 0xFF, 0x2C, 0x23, 0x01, 0x17, 0x03, 0xA2,   polka holodilnik n2 obiem
0x28, 0xFF, 0xEA, 0x1C, 0x01, 0x17, 0x05, 0x13,   polka holodilnik n1 obiem

0x28, 0xFF, 0xB6, 0x56, 0x01, 0x17, 0x03, 0x81,   r245 obiem
0x28, 0xFF, 00xD, 0xDE, 0x00, 0x17, 0x05, 00xD,   r245 isparitelb 

0x28, 0xFF, 0x9F, 0x17, 0x01, 0x17, 0x05, 0x38,   r234-isparitelb
0x28, 0xFF, 0x61, 0xC2, 0x00, 0x17, 0x05, 0x17,   r234-obiem

0x28, 0xFF, 0x7D, 0xBE, 0x00, 0x17, 0x03, 0x2D,   r235 isparitelb 
0x28, 0xFF, 0xC9, 0xAC, 0xD0, 0x16, 0x05, 0x42,   r235 obiem

0x28, 0xFF, 0xE2, 0xCA, 0x00, 0x17, 0x05, 0x8E,   r244 obiem
0x28, 0xFF, 00x5, 0xE0, 0x00, 0x17, 0x05, 0x6E,   r244 isparitelb  

0x28, 0xFF, 0xBD, 0xCF, 0xA4, 0x16, 0x05, 0x59,   r241 obierm
0x28, 0xFF, 0x43, 0x3E, 0x01, 0x17, 0x05, 0xA4,   r240 obiem

0x28, 0xFF, 0x11, 0x17, 0x01, 0x17, 0x04, 0x0F,   without number obiem nizkotemperatur
0x28, 0xFF, 0xA3, 0xBA, 0x00, 0x17, 0x03, 0xDF,   without isparitelb nizkotemperatur

 */

//235=1,18;-
//237=0,16;-
//242=15,8;-
//hz=17,2;-
//234=7,19;-
//244=4,10;-
//245=6,11;-
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress i237={0x28, 0xFF, 0x38, 0x71, 0x00, 0x17, 0x05, 0x68};
DeviceAddress o237={0x28, 0xFF, 0x63, 0x00, 0x01, 0x17, 0x03, 0xDC};
DeviceAddress i236={0x28, 0xFF, 0x94, 0xDD, 0x00, 0x17, 0x05, 0xC1};
DeviceAddress o236={0x28, 0xFF, 0xCF, 0x37, 0x01, 0x17, 0x04, 0x83};
DeviceAddress i245={0x28, 0xFF, 0x0D, 0xDE, 0x00, 0x17, 0x05, 0x0D};
DeviceAddress o245={0x28, 0xFF, 0xB6, 0x56, 0x01, 0x17, 0x03, 0x81};
DeviceAddress i234={0x28, 0xFF, 0x9F, 0x17, 0x01, 0x17, 0x05, 0x38};
DeviceAddress o234={0x28, 0xFF, 0x61, 0xC2, 0x00, 0x17, 0x05, 0x17};
DeviceAddress i235={0x28, 0xFF, 0x7D, 0xBE, 0x00, 0x17, 0x03, 0x2D};
DeviceAddress o235={0x28, 0xFF, 0xC9, 0xAC, 0xD0, 0x16, 0x05, 0x42};
DeviceAddress o241={0x28, 0xFF, 0xBD, 0xCF, 0xA4, 0x16, 0x05, 0x59};
DeviceAddress o240={0x28, 0xFF, 0x43, 0x3E, 0x01, 0x17, 0x05, 0xA4};
DeviceAddress i242={0x28, 0xFF, 0x11, 0x17, 0x01, 0x17, 0x04, 0x0F};
DeviceAddress o242={0x28, 0xFF, 0xA3, 0xBA, 0x00, 0x17, 0x03, 0xDF};
DeviceAddress i370={0x28, 0xFF, 0xAB, 0x07, 0x01, 0x17, 0x04, 0xC5};
DeviceAddress o370={0x28, 0xFF, 0xF4, 0x01, 0x01, 0x17, 0x04, 0x36};
DeviceAddress o239={0x28, 0xFF, 0x2C, 0x23, 0x01, 0x17, 0x03, 0xA2};
DeviceAddress o238={0x28, 0xFF, 0xEA, 0x1C, 0x01, 0x17, 0x05, 0x13};
DeviceAddress i244={0x28, 0xFF, 0xE2, 0xCA, 0x00, 0x17, 0x05, 0x8E};
DeviceAddress o244={0x28, 0xFF, 0x05, 0xE0, 0x00, 0x17, 0x05, 0x6E};


// data array for modbus network sharing
uint16_t au16data[44],timer=0;
int tempC[44];

/**
 *  Modbus object declaration
 *  u8id : node id = 0 for master, = 1..247 for slave
 *  u8serno : serial port (use 0 for Serial)
 *  u8txenpin : 0 for RS-232 and USB-FTDI 
 *               or any pin number > 1 for RS-485
 */
Modbus slave(4,0,2); // this is slave @1 and RS-232 or USB-FTDI

void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print("0x");
    Serial.print(deviceAddress[i],HEX);
    Serial.print(", ");
  }
  Serial.println(" ");
}

void setup() {
slave.begin(9600); // 19200 baud, 8-bits, even, 1-bit stop
   sensors.begin();// открываем последовательный порт на скорости 9600 бод
   sensors.setResolution(i237, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o237, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(i236, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o236, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(i245, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o245, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(i234, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o234, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(i235, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o235, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o241, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o240, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(i242, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o242, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(i370, TEMPERATURE_PRECISION); 
  delay(50);
  sensors.setResolution(o370, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o239, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o238, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(i244, TEMPERATURE_PRECISION);
  delay(50);
  sensors.setResolution(o244, TEMPERATURE_PRECISION);
  delay(50);
  
        radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0,15);     //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1,address[0]);      //хотим слушать трубу 0
  radio.setChannel(0x5f);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  
  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль

  }
void loop() {
 currentMillis = millis();
 
  if(currentMillis-startTime>cooldown)
  {
  
    startTime=millis();
  sensors.requestTemperatures();
  delay(1000);

   tempC[0] = sensors.getTempC(i237);
   tempC[1] = sensors.getTempC(o237);
   
   tempC[2] = sensors.getTempC(i236);
   tempC[3] = sensors.getTempC(o236);
   
   tempC[4] = sensors.getTempC(i245);
   tempC[5] = sensors.getTempC(o245);

   tempC[6] = sensors.getTempC(i234);
   tempC[7] = sensors.getTempC(o234);
   
   tempC[8] = sensors.getTempC(i235);
   tempC[9] = sensors.getTempC(o235);
   
   tempC[10] = sensors.getTempC(o241);
   tempC[11] = sensors.getTempC(o240);
   
   tempC[12] = sensors.getTempC(i242);
   tempC[13] = sensors.getTempC(o242);
   
   tempC[14] = sensors.getTempC(i370);
   tempC[15] = sensors.getTempC(o370);
   
   tempC[16] = sensors.getTempC(o239);
   tempC[17] = sensors.getTempC(o238);
   
   tempC[18] = sensors.getTempC(i244);
   tempC[19] = sensors.getTempC(o244);
  timer=0;
  /*tempC[20] = sensors.getTempC(tempsens21);
   tempC[21] = sensors.getTempC(tempsens22);
   tempC[22] = sensors.getTempC(tempsens23);
   tempC[23] = sensors.getTempC(tempsens24); 
   tempC[24] = sensors.getTempC(tempsens25);
   tempC[25] = sensors.getTempC(tempsens26);
   tempC[26] = sensors.getTempC(tempsens27);
   tempC[27] = sensors.getTempC(tempsens28);
   tempC[28] = sensors.getTempC(tempsens29);
   tempC[29] = sensors.getTempC(tempsens30);
   tempC[30] = sensors.getTempC(tempsens31);
   tempC[31] = sensors.getTempC(tempsens32);
   tempC[32] = sensors.getTempC(tempsens33);
   tempC[33] = sensors.getTempC(tempsens34);
   tempC[34] = sensors.getTempC(tempsens35);
   tempC[35] = sensors.getTempC(tempsens36);
   tempC[36] = sensors.getTempC(tempsens37);
   tempC[37] = sensors.getTempC(tempsens38);
   tempC[38] = sensors.getTempC(tempsens39);
   tempC[39] = sensors.getTempC(tempsens30);
   tempC[40] = sensors.getTempC(tempsens31);
   tempC[41] = sensors.getTempC(tempsens32);
   tempC[42] = sensors.getTempC(tempsens33);
   tempC[43] = sensors.getTempC(tempsens34); 
      */
      for(int i=0;i<20;i++)
      {
        au16data[i]=100+tempC[i];//i235
      // Serial.print("number= ");
      //  Serial.print(i);
       // Serial.print("  temp= ");
       // Serial.println(tempC[i]);
      }
   byte pipeNo, gotByte;                          
    if( radio.available(&pipeNo)){    // слушаем эфир со всех труб
      radio.read( &data, sizeof(data) );         // чиатем входящий сигнал

       
      for(int i=0;i<6;i++)
      {
      au16data[21+i]=100+data[i];
      }
      
   }
  }
 
  slave.poll( au16data, 30 );


}


///////////////////////////////////////

 

b707
Offline
Зарегистрирован: 26.05.2017

Афтар? Зачем вы отлаживаете связь на передаче двух десятков датчиков температуры? Выкиньте для начала все лишнее из скетча, передавайте, к примеру, одно целое число . Добейтесь устойчивой работы передатчика и приемника - и только потом нагружайте их кучей данных.

 

 

 

И еще замечание по коду - к радио отношения не имеет -

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

Suppchik
Offline
Зарегистрирован: 21.03.2018

Связь уже была отлажена, работала, НО через 8-10 часов радиомодуль отрубается

b707
Offline
Зарегистрирован: 26.05.2017

несколько замесаний по инициализации NRF :

- по скорости 250К в инете много нареканий на работу модулей, попробуйте сменить на что-то другое

- размер передаваемых данных и размер Payload желательно делать одинаковым. а у вас не совпадает

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

Suppchik
Offline
Зарегистрирован: 21.03.2018

По питанию ну просто не может быть проблем) 3.3 как в аптеке берется с кренки 3.3 и кондеры)

Со скоростью интересная версия) попробую

Чечако
Offline
Зарегистрирован: 15.06.2018

Suppchik пишет:

По питанию ну просто не может быть проблем) 

Вот эту вот фразу Вы лучше сразу забудьте. Сколько раз она звучала, и сколько раз в итоге оказывалась лишней - не передать. :) И проверьте питание в том числе, потому как NRF к его чистоте весьма критично относится.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Чечако пишет:

Suppchik пишет:

По питанию ну просто не может быть проблем) 

Вот эту вот фразу Вы лучше сразу забудьте. Сколько раз она звучала, и сколько раз в итоге оказывалась лишней - не передать. :) И проверьте питание в том числе, потому как NRF к его чистоте весьма критично относится.

Ну, гля, после этих слов и начинаются ГЛАВНЫЕ проблемы. А датчики и процессор работают...