Код работает, если я определяю константный байт NUM_SAMPLES = 30;, но если я определяю NUM_SAMPLES как непостоянную переменную, он не работает

Прежде всего, заранее спасибо за помощь.

Код считывает значения с датчика дальности и силы, сохраняет показания в буфере и распечатывает Json на терминале. Он вызывает функции Read_Range_Sensor() и Read_Loadcell() для считывания датчиков диапазона и усилия.

Буфер определяется как массив чисел с плавающей запятой с длиной NUM_SAMPLES, которая в настоящее время установлена на 15. В буфере хранятся показания обоих датчиков, которые добавляются в буфер, если разница между текущим и последним показаниями диапазона составляет более 1 мм.

После заполнения буфера показаниями NUM_SAMPLES код создает документ JSON с двумя массивами: range_array и force_array. Затем код сериализует документ JSON и выводит его на терминал. .

Соответствует коду:

void Print_Json_Array()
{
    Read_Range_Sensor();
    Read_Loadcell();

    //** Показания датчика буфера Instanzen--------------------
    const byte NUM_SAMPLES = 15;
   // байт NUM_SAMPLES = 15;
    Serial.println(NUM_SAMPLES); 

    float buffer_range[NUM_SAMPLES];
    float buffer_force[NUM_SAMPLES];

    String jsonString = "";
    StaticJsonDocument<2048> doc;
    static int scale_counter = 0;

    // Если разница между текущим и последним показаниями диапазона больше 1 мм
    if (abs(round_range - last_round_range) >= 1)
    {
      // Сохраняем текущий диапазон и форсируем показания в буфере
      buffer_range[scale_counter] = range_reading;
      buffer_force[scale_counter] = force_reading_newton;
      scale_counter++;
      last_round_range = round_range;

      // Если в буфере 15 отсчетов
      if (scale_counter >= NUM_SAMPLES)
      {
        // Создадим документ JSON и добавим массивы range и force
        doc["count_array"] = daten.zyklus;
        JsonArray rangeValues = doc.createNestedArray("range_array");
        JsonArray forceValues = doc.createNestedArray("force_array");

        for (int i = 0; i < NUM_SAMPLES; i++)
        {
          rangeValues.add(round_forcerange(buffer_range[i]));
          forceValues.add(round_forcerange(buffer_force[i]));
        }

        // Сериализация документа JSON
        serializeJson(doc, Serial);
        scale_counter = 0;
        serializeJson(doc, jsonString);
      }
    }
  }


Если я определяю NUM_SAMPLES как константный байт, NUM_SAMPLES = 15;. Код работает так, как ожидалось. Если я распечатаю созданный Json, я получу, например, такой результат:

{"count_array":41266,
"range_array":[10,20,30,40,50,60,70,80,90,100,200,300,400,500,600],
"force_array":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]}

Но мне нужно определить NUM_SAMPLES как непостоянную переменную. Что я могу изменить в другом месте кода.

Для этого я определил NUM_SAMPLES следующим образом:

    byte NUM_SAMPLES = 15;
    Serial.println(NUM_SAMPLES); 

Вот так я печатаюсь на терминале

{"count_array":41266,
"range_array":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
"force_array":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}

, 👍1

Обсуждение

попробуйте const для всех байтовых переменных, @Juraj

Если я поставлю const во все байтовые переменные, это сработает. Но мне нужно, чтобы переменные были объявлены как непостоянные переменные. Потому что позже в любой момент кода мне нужно будет изменить значение NUM_SAMPLES, например true экранное меню с кнопками., @Carlos Costa

Ваш вопрос как-то связан с arduino uno или arduino mega?, @timemage

У вас есть *"Для NUM_SAMPLES я получаю 30"* в контексте, где это звучит так, как будто вы говорите о вычисленном значении NUM_SAMPLES, но вы показываете, что код фактически байт NUM_SAMPLES = (60/*start_measure*/ - 30/*end_measure*/)/*РЕЗУЛЬТАТ*/ - 15;, что, казалось бы, ставит 15 в NUM_SAMPLES`. Итак, либо я не понимаю, что вы говорите, либо то, что вы говорите, и то, что у вас есть в вашем коде, не соответствует. Или я просто очень плох в математике сегодня. Вы показываете 15 элементов в своих массивах JSON, поэтому вы имели в виду 15? Но тогда есть 15 и на другом выходе., @timemage

На самом деле я использую Esp32. Не Arduino Uno или Mega. На самом деле вы правы. Пример JSON, который я разместил с 15 значениями, должен быть с 30 значениями., @Carlos Costa

Возможно, исправьте свой код и вопрос, чтобы они совпадали. Если возможно, удалите все, что на самом деле не должно быть частью вопроса. Вероятно, вы можете продемонстрировать эту проблему без какого-либо кода веб-сервера в компилируемом тестируемом примере, который использует только Serial и ArduinoJSON., @timemage

Я исправляю код и вопрос, чтобы они совпадали., @Carlos Costa


1 ответ


0

Когда вы используете константу, которая совпадает с фиксированным числом, ваш код не может ее изменить. Вам нужно определить его как int, float, double и т. д., но без константной части. Просто удалите константу, и она будет работать правильно.

,