Настройки ESP32. Одна ошибка возвращается, все остальные работают.

Я использую библиотеку Preferences.h в своем коде Arduino. Я инициализирую некоторые значения. Я сохраняю их вместе с библиотекой предпочтений. Затем я изменяю все значения, а затем считываю исходные сохраненные значения.

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

Может кто-нибудь указать на мою ошибку с калиброванным весом? И если вы видите какие-то другие общие ошибки с кодом, пожалуйста, укажите на них. (Я не программист)

#include <Preferences.h>

Preferences preferences;

int currentFile = 1;
int outputRate = 10;           // milliSeconds
float outputGain = 1.23;
int zeroWeight = 900;          // dac value to produce Zero on scale
int calibratedWeight = 2800;   // dac value equal to 100lb calibration weight.
float DACmultiplier = 20.1;  

//---------------------------------------
void savePreferences() {
    preferences.begin("ScaleSetup", false);      // false for read/write
    preferences.putInt("currentFile", currentFile);
    preferences.putInt("outputRate", outputRate);
    preferences.putFloat("outputGain", outputGain);
    preferences.putInt("zeroWeight", zeroWeight);
    preferences.putInt("calibratedWeight", calibratedWeight);  // ???
    preferences.putFloat("DACmultiplier", DACmultiplier);
    preferences.end();
}

//---------------------------------------
void getPreferences() {
    preferences.begin("ScaleSetup", false);        // false for read/write

    currentFile = preferences.getInt("currentFile", currentFile);
    outputRate = preferences.getInt("outputRate", outputRate);
    outputGain = preferences.getFloat("outputGain", outputGain);
    zeroWeight = preferences.getInt("zeroWeight", zeroWeight);
    calibratedWeight = preferences.getInt("calibratedWeight", calibratedWeight);  // ???
    DACmultiplier = preferences.getFloat("DACmultiplier", DACmultiplier);
    preferences.end();
}

//============================================
void setup() {
  Serial.begin(115200);
  Serial.println();

  preferences.begin("ScaleSetup", false);        // false for read/write
  preferences.clear();
  preferences.end();
  delay(90);

  savePreferences();
  Serial.println("\n save preferences");
  Serial.println("\n Original asigned values. \n");

  Serial.printf("currentFile: %i\n", currentFile);
  Serial.printf("outputRate: %i\n", outputRate);
  Serial.printf("outputGain: %f\n", outputGain);
  Serial.printf("zeroWeight: %i\n", zeroWeight);
  Serial.printf("calibratedWeight: %i\n", calibratedWeight);  // ???
  Serial.printf("DACmultiplier: %f\n", DACmultiplier);

  Serial.println("\n modify values. \n");

  currentFile = 5;
  outputRate = 50;           // milliSeconds
  outputGain = 0.45;
  zeroWeight = 1333;         // dac value to produce Zero on scale
  calibratedWeight = 2200;   // dac value equal to 100lb calibration weight.
  DACmultiplier = 12.34;

  Serial.printf("currentFile: %i\n", currentFile);
  Serial.printf("outputRate: %i\n", outputRate);
  Serial.printf("outputGain: %f\n", outputGain);
  Serial.printf("zeroWeight: %i\n", zeroWeight);
  Serial.printf("calibratedWeight: %i\n", calibratedWeight);  // ???
  Serial.printf("DACmultiplier: %f\n", DACmultiplier);

  Serial.println("\n Get original saved preferences. \n");
  getPreferences();

  Serial.printf("currentFile: %i\n", currentFile);
  Serial.printf("outputRate: %i\n", outputRate);
  Serial.printf("outputGain: %f\n", outputGain);
  Serial.printf("zeroWeight: %i\n", zeroWeight);
  Serial.printf("calibratedWeight: %i\n", calibratedWeight);  // ???
  Serial.printf("DACmultiplier: %f\n", DACmultiplier);

//  Serial.println("Restarting in 10 seconds...");
  delay(10000);
//  ESP.restart();
}

//============================================
void loop() {}

Вот результат.

 save preferences

 Original asigned values. 

currentFile: 1
outputRate: 10
outputGain: 1.230000
zeroWeight: 900
calibratedWeight: 2800
DACmultiplier: 20.100000

 modify values. 

currentFile: 5
outputRate: 50
outputGain: 0.450000
zeroWeight: 1333
calibratedWeight: 2200
DACmultiplier: 12.340000

 Get original saved preferences. 

currentFile: 1
outputRate: 10
outputGain: 1.230000
zeroWeight: 900
calibratedWeight: 2200
DACmultiplier: 20.100000

, 👍1

Обсуждение

Я не вижу ничего плохого в вашем коде, но я не знаком с этой библиотекой. begin() [кажется, возвращает a success/fail](https://github.com/espressif/arduino-esp32/blob/1.0.4/libraries/Preferences/src/Preferences.h#L28) и различные функции put могут [возвращать короткие значения вкл. failure](https://github.com/espressif/arduino-esp32/blob/1.0.4/libraries/Preferences/src/Preferences.h#L34). Так же, как проверка здравомыслия, я бы убедился, что все они возвращают ожидаемые значения., @timemage

Интересно, я что-то испортил раньше, и теперь это испорчено. Я думал, что функция preferences.clear(); может исправить это, если это проблема. Я постараюсь проверить на успех/неудачу как-нибудь. Спасибо, что посмотрела., @Rudy

я бы отладил такого рода проблему, переименовав calibratedWeight в abc123, чтобы увидеть, связано ли это с именем, @jsotola

Когда я изменяю его на abc123, он возвращает правильное значение. Затем, когда я изменяю все abc123 обратно на calibratedWeight, он не работает, он возвращает тот же результат, который я первоначально показал. Я думаю, что изменение его на abc123 сделало новую запись, а не перезапись калиброванного веса. И когда я вернулся к калиброванному весу, проблема осталась. Но я думал, что preferences.clear(); должен был очистить все., @Rudy

Я изменил preferences.begin("ScaleSetup", false); на preferences.begin("Scale_Setup", false); Я был уверен, что это исправит это, но я получаю тот же результат., @Rudy

Может быть, мне нужно перезагрузить Windows. :), @Rudy

Я уверен, что знаю, в чем проблема. 16 символов, когда 15 символов является максимально допустимым., @Rudy

"Примечание: Имя пространства имен ограничено 15 символами" Я не понимаю Пространство имен, но думаю, что то же самое относится и к именам переменных. Он работает с именем 15 символов., @Rudy

Вы можете опубликовать ответ на свой собственный вопрос., @timemage

Итак, *did* this preferences.putInt("calibratedWeight", калиброванный вес); return 0?, @timemage

Я собирался попробовать, но подумал о длине. Я все еще хочу сделать пару тестов, но в то время я больше беспокоился о том, чтобы сделать остальную часть моего кода. Я опубликую больше позже., @Rudy


1 ответ


Лучший ответ:

1

В конце комментариев выше я сказал, что, по-моему, проблема заключалась в длине имени переменной.

Сегодня я попробовал опцию отладки, а затем запустил код. И следующее сообщение об ошибке было включено в вывод com.

[E][Preferences.cpp:163] putInt(): ошибка nvs_set_i32: КЛЮЧ с откалиброванным ВЕСОМ_TOO_LONG

Так что, думаю, я был прав. Раньше я ничего не знал о опции отладки.

,