Nano 33 BLE Sense LED мигает 3/5 медленно/быстро после загрузки

Я успешно заставил свой Nano 33 BLE Sense считывать данные акселерометра и, при условии наличия разницы между текущими и последними показаниями, отправлять их через библиотеку EasyTransfer в модуль XBee по аппаратному последовательному каналу, который связывался с другим модулем, который публиковал показания в облаке AWS через Nano IoT. Затем я амбициозно решил добавить больше данных датчиков к полезной нагрузке, чтобы включить давление, температуру и влажность. Я добавил эти float в свою структуру данных (см. код ниже), а также логические флаги, чтобы указать, произошло ли событие (то есть считывание через порог), и если какой-либо из флагов был истинным, чтобы передать полезную нагрузку. Код компилируется нормально, загружается до завершения, но затем светодиод на Нано мигает 3 раза медленно и 5 раз быстро подряд. В прошлый раз у меня было такое, потому что я забыл оператор .begin (), но добавление этого параметра устранило проблему. Тем не менее, я просмотрел свой код и не вижу, что вызывает проблему на этот раз. Я запустил меньшие кодовые блоки, чтобы проверить, работают ли датчики так, как они работают. Помогите!!

#include <EasyTransfer.h>
#include <Arduino_LSM9DS1.h>
#include <Arduino_LPS22HB.h>
#include <Arduino_HTS221.h>

#define TX_PIN 6
#define RX_PIN 5

const float MOTION_TOLERANCE = 0.01;
const float PRESSURE_THRESHOLD = 1000.00;
const float TEMPERATURE_THRESHOLD = 20.00;
const float HUMIDITY_THRESHOLD = 50.00;
 
UART XBeeTx(digitalPinToPinName(TX_PIN), digitalPinToPinName(RX_PIN), NC, NC);

EasyTransfer ET;

struct SEND_DATA_STRUCTURE {

  String sensorLocation;
  bool motionEvent;
  float xAcc;
  float yAcc;
  float zAcc;
  bool pressureEvent;
  float pressure;
  bool temperatureEvent;
  float temperature;
  bool humidityEvent;
  float humidity;
    
};

SEND_DATA_STRUCTURE myData;

float xAccCurrent, yAccCurrent, zAccCurrent, xAccLast, yAccLast, zAccLast, pressureReading, temperatureReading, humidityReading;

// ================================================================
// ===                      INITIAL SETUP                       ===
// ================================================================

void setup() {

if(!IMU.begin()) {

  // Stop if IMU fails to initialise
  while(1);
  
}

if(!BARO.begin()) {

    // Stop if pressure sensor fails to initialise
  while(1);
  
}
if (!HTS.begin()) {

  // Stop if temp and humidity sensor fails to initialise
  while(1);
  
}

 // Accelerometer code
   IMU.setAccelFS(3);
   IMU.setAccelODR(5);
   IMU.setAccelOffset(0.003955, -0.010136, -0.013462);
   IMU.setAccelSlope (0.997163, 1.000438, 0.995678);


if (XBeeTx.available()) {
  
  XBeeTx.begin(9600);
  ET.begin(details(myData), &XBeeTx);
  
  }

   myData.sensorLocation = "Zone 1";

}


// ================================================================
// ===                    MAIN PROGRAM LOOP                     ===
// ================================================================

void loop() {

if (IMU.accelerationAvailable()) {
  
    IMU.readAcceleration(xAccCurrent, yAccCurrent, zAccCurrent);    

  }

 
if ((abs(xAccLast -xAccCurrent) > MOTION_TOLERANCE) || (abs(yAccLast -yAccCurrent) > MOTION_TOLERANCE) || (abs(zAccLast -zAccCurrent) > MOTION_TOLERANCE)) {
 
  myData.motionEvent = true;
  myData.xAcc = xAccCurrent;
  myData.yAcc = yAccCurrent;
  myData.zAcc = zAccCurrent;

  xAccLast = xAccCurrent;
  yAccLast = yAccCurrent;
  zAccLast = zAccCurrent;
    
}

pressureReading = BARO.readPressure(MILLIBAR);
if (pressureReading > PRESSURE_THRESHOLD) {

  myData.pressureEvent = true;
  myData.pressure = pressureReading;
  
}

temperatureReading = HTS.readTemperature();
if (temperatureReading > TEMPERATURE_THRESHOLD) {

  myData.temperatureEvent = true;
  myData.temperature = temperatureReading;
  
}

humidityReading = HTS.readHumidity();
if (humidityReading > HUMIDITY_THRESHOLD) {

  myData.humidityEvent = true;
  myData.humidity = humidityReading;
  
}

if (myData.motionEvent || myData.pressureEvent || myData.temperatureEvent || myData.humidityEvent) {


 ET.sendData();

 delay(1000);
 
 myData.motionEvent = false;
 myData.pressureEvent =false;
 myData.temperatureEvent = false;
 myData.humidityEvent =false;
  
}

}

, 👍1

Обсуждение

Добавьте серийные отпечатки, чтобы узнать, сколько времени занимает каждая часть кода, @Sim Son

Привет, я мог бы сделать, что плата блокируется, чтобы последовательный монитор не загружался. Странно, если я закомментирую if (XBeeTx.available()) и просто начну() XBeeTx и ET, то, кажется, все нормально, и я вижу по светодиодам Xbee, что данные передаются одним и принимаются другим. Поэтому не уверен, почему XBeeTx.available() не вызывает правильного результата - очевидно, что он доступен, иначе я не смог бы его запустить?, @RobM

К., у меня нет опыта работы с вашим оборудованием. Является ли 9600 правильной ценой бодрийяра?, @Sim Son

Вы уверены, что вызов .begin() после .available() правильный? Мне это кажется странным., @Sim Son

У меня нормально загружается код, и Xbees, очевидно, общается, но плата nano, похоже, не получает никаких данных. Глядя на документы GitHub для библиотеки EasyTransfer, там упоминается ограничение в 255 байтов для структуры (), поэтому я, возможно, столкнулся с этой проблемой, но у меня та же проблема, если моя структура-это просто строка и 3 плавающих. Миры в порядке с 3 поплавками, но добавление строки, похоже, вызывает проблему. странно!, @RobM

Также видел ссылку в Интернете на аналогичную (не ту же самую) проблему и замедление скорости передачи до 1200, казалось, решило это, поэтому я также рассмотрю это., @RobM

"Странное поведение" часто является признаком того, что существует проблема с использованием оперативной памяти, и если это работает, когда вы удаляете строку, сильно подозреваете то же самое. Особенно на микроконтроллере, где программное обеспечение гораздо более предсказуемо, относительно высока вероятность того, что нарушения оперативной памяти приведут не к сбою, а к непредсказуемому поведению. Но если это проблема с оперативной памятью, уменьшение скорости передачи данных должно сделать ее еще хуже, поскольку в динамическом буфере накапливается больше данных, поэтому я предполагаю, что это всего лишь фантомное исправление., @Sim Son