• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос NodeMCU v3 и модуль nRF24L01+

Gamak15km

New member
Добрый день! Уважаемые фррумчане подскажите пожалуйста куда копать. Столкнулся с проблемой сканирования частоты 2,4 ГГц по 127 каналам. Использую стандартный скетч из примера библиотеки rf24. Скетч модифицирован:

-закоментирована библиотека "printf.h" и все что с ней связано.
- изменена строка
Код:
printf("%x", min(0xf, values[i]));
на
Код:
printf("%x", min<int>(0xf, values[i]));
при сканировании всех 127 частот, контроллер перегружается.
Копия порта:
Код:
RF24/examples/scanner/
STATUS         = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0xe7e7e7e7e7 0xc2c2c2c2c2
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
TX_ADDR         = 0xe7e7e7e7e7
RX_PW_P0-6     = 0x00 0x00 0x00 0x00 0x00 0x00
EN_AA         = 0x00
EN_RXADDR     = 0x03
RF_CH         = 0x4c
RF_SETUP     = 0x07
CONFIG         = 0x0e
DYNPD/FEATURE     = 0x00 0x00
Data Rate     = 1MBPS
Model         = nRF24L01+
CRC Length     = 16 bits
PA Power     = PA_MAX
000000000000000011111111111111112222222222222222333333333333333344444444444444445555555555555555666666666666666677777777777777
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffdc0 end: 3fffffc0 offset: 01b0
3fffff70:  4010019c 0000005b 3ffee4f8 40202f2c 
3fffff80:  3ffe8579 0000007e 0000005b 4020253b 
3fffff90:  feefeffe feefeffe feefeffe 3ffee590 
3fffffa0:  3fffdad0 00000000 3ffee560 40203960 
3fffffb0:  feefeffe feefeffe 3ffe84f4 40100a05 
<<<stack<<<
Если указать не верную скорость порта, то циклично выдается данное сообщение:
Код:
 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v951aeffa
~ld
Если начать сканировать менее 40 портов, то сканирование работает.

Загружаемый скетч:
Код:
#define D5 14  // SCK
#define D6 12  // MISO
#define D7 13  // MOSI
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
//#include "printf.h"

//
// Hardware configuration
//

// Set up nRF24L01 radio on SPI bus plus pins 7 & 8

RF24 radio(D4, D8);

//
// Channel info
//

const uint8_t num_channels = 126;
uint8_t values[num_channels];

//
// Setup
//

void setup(void)
{
  //
  // Print preamble
  //

  Serial.begin(9600);
  //printf_begin();
  Serial.println(F("\n\rRF24/examples/scanner/"));

  //
  // Setup and configure rf radio
  //

  radio.begin();
  radio.setAutoAck(false);

  // Get into standby mode
  radio.startListening();
  radio.stopListening();

  radio.printDetails();

  // Print out header, high then low digit
  int i = 0;
  while ( i < num_channels )
  {
    printf("%x", i >> 4);
    ++i;
  }
  Serial.println();
  i = 0;
  while ( i < num_channels )
  {
    printf("%x", i & 0xf);
    ++i;
  }
  Serial.println();
}

//
// Loop
//

const int num_reps = 100;

void loop(void)
{
  // Clear measurement values
  memset(values, 0, sizeof(values));

  // Scan all channels num_reps times
  int rep_counter = num_reps;
  while (rep_counter--)
  {
    int i = num_channels;
    while (i--)
    {
      // Select this channel
      radio.setChannel(i);

      // Listen for a little
      radio.startListening();
      delayMicroseconds(128);
      radio.stopListening();

      // Did we get a carrier?
      if ( radio.testCarrier() ) {
        ++values[i];
      }
    }
  }

  // Print out channel measurements, clamped to a single hex digit
  int i = 0;
  while ( i < num_channels )
  {
    printf("%x", min<int>(0xf, values[i]));
    ++i;
  }
  Serial.println();
}

// vim:ai:cin:sts=2 sw=2 ft=cppagjvjubnt
Мое предположение, что происходит переполнение памяти и контроллер уходит в рст, а что с этим делать и куда копать, в силу своей не компетенции,"самообучаемости" и новизны для меня, я незнаю. Помогите пожалуйста разобраться.
Заранее спасибо!
 

CodeNameHawk

Moderator
Команда форума
В loop долго не сидите. Один проход loop один канал.

Ну или попробуйте в цикле while (i--) добавить задержку delay(1) или yield() это нужно для того, что бы есп обработала WiFi.
 

Gamak15km

New member
В loop долго не сидите. Один проход loop один канал.

Ну или попробуйте в цикле while (i--) добавить задержку delay(1) или yield() это нужно для того, что бы есп обработала WiFi.
Спасибо! Скетч завелся! и с delay(1), и с yield() работает.
Подскажите пожалуйста где почитать информацию, связанную с данной ошибкой? хочется более глубже вникнуть в физику процесса. Литературы полно, но какая более подойдет для новичка не понятно!
 

nikolz

Well-known member
читайте документацию по SDK
--------------
есть два способа решить вашу проблему
1) самый простой - поставьте в цикл сканирования сброс WDT и проблемы не будет
2) сделайте сканирование по таймеру
 
Сверху Снизу