Код работает, если я определяю константный байт 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]}
@Carlos Costa, 👍1
Обсуждение1 ответ
Когда вы используете константу, которая совпадает с фиксированным числом, ваш код не может ее изменить. Вам нужно определить его как int, float, double и т. д., но без константной части. Просто удалите константу, и она будет работать правильно.
- Как объявить массив переменного размера (глобально)
- Преобразование long в массив символов и обратно
- Получение имени перечисления из экземпляра перечисления
- Объявленная переменная внутри void setup не видится в void loop
- Преимущества глобальных переменных перед статическими членами класса?
- Чтение текста построчно с SD
- Arduino создает массив Json с двойными значениями и 2 десятичными знаками
- Глобальная переменная не изменяется, когда значение задано в логической функции
попробуйте 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