Как загрузить scal-фактор, внешний по отношению к коду?

Мы знаем, что нам нужны калибровочные коэффициенты (масштабные коэффициенты) для считывания текущих данных датчика (ACS758) в arduino. Я также использую считыватель напряжения с использованием схемы делителя напряжения для своего проекта. Мне нужно построить 5 таких плат и каждый раз менять калибровочный коэффициент в основной программе из-за допуска компонентов. В настоящее время для одной из моих плат reference_factor равен 0.81, и это изменится из-за допуска резисторов для других плат.

Из-за этой проблемы мне нужно поддерживать 5 различных кодов для 5 различных плат. Эти значения датчиков управляют включением и выключением определенных реле. (Не показано в коде).

могу ли я загрузить этот referrence_factor извне через текстовый файл или как любой другой носитель, чтобы мне не нужно было каждый раз менять код? Я использую arduino Nano.

int reference_Factor = 0.81;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // read the raw data coming in on analog pin 0:
  int lightLevel = analogRead(A0);
  // Convert the raw data value (0 - 1023) to voltage (0.0V - 5.0V):
  float voltage = lightLevel * reference_factor;
  // write the voltage value to the serial monitor:
  Serial.println(voltage);
}

, 👍1

Обсуждение

Вы можете сохранить его в EEPROM. Напишите метод в программе установки, который увидит, был ли записан EEPROM, а если нет, то позволит вам ввести номер для использования. Вы устанавливаете его при первом включении питания на заводе. С этого момента он видит, что EEPROM был записан, и пропускает этот бит, а вместо этого считывает коэффициент из EEPROM., @Delta_G

Кстати, ваш текущий код ошибочен. Вы должны посмотреть, какие типы значений может содержать переменная int., @Delta_G

Спасибо за ответ. Я действительно использовал float в моем фактическом коде., @Amrutha B V

Вы всегда должны публиковать "фактический код", когда просите о помощи. В противном случае вы в конечном итоге получаете ответы, которые не относятся к вашему "фактическому коду", и тогда вы теряете и наше время, и свое., @Delta_G


1 ответ


-1

Как написано в комментариях вы совладающее eepron, но в вашем случае у нее есть один большой недостаток: все должно быть записано во время компиляции (он же, когда вы программка нано, вы также должны заполнить EEPROM с соответствующими значениями), так, например, если у вас температуру в зависимости от фактора, который вы хотите изменить, а на поле...
Я бы выбрал устройство для чтения SD-карт:

  • Дешево купить (2 доллара)
  • Легко обрабатывается в коде (чтение из файла является стандартной функцией)
  • использование совместимой с ПК файловой системы FAT позволяет считывать/записывать данные на SD-карту на ПК/другом устройстве без перекомпиляции кода.
  • Если вы по какой-либо причине переключаете датчики, просто напишите новый scale.txt файл на SD-карту, вставьте и перезагрузите nano, чтобы получить новые значения
  • вы все еще можете использовать eeprom в качестве резервного сценария

В качестве подсказки (также упомянутой в комментариях Delta_G) ввод для чего - то вроде 0.01-это не то, что вы хотите-определите как float и следите за "ловушкой преобразования" при использовании с другими переменными, не определенными как float.

,

Спасибо за ваше уважение. Поскольку я не прикрепил здесь полный код, int-это ошибка с опечаткой. Я действительно понимаю структуру данных. Я действительно использовал float в своем коде. Я хочу знать, в чем здесь разница между прямой загрузкой кода и загрузкой кода с помощью EPROM? Мне нужно отредактировать основной код для всех 5 плат, даже если я буду использовать EPROM, верно?, @Amrutha B V

Да, либо загрузка eeprom из программы (5 версий), либо с помощью дополнительной программы, которую вы запускаете перед загрузкой (5 версий флэш - памяти eeprom + 1 идентичная программа), либо какой-либо ввод (нажатие кнопки/мигание светодиода для ввода во время первого запуска-1 программа). Вот почему я предложил SD как беспроблемный ;-), @Codebreaker007

Нет, вам не придется загружать EEPROM во время компиляции. Вы могли бы скомпилировать один и тот же код для всех плат. Что вам понадобится, так это некоторый код в настройках, который проверяет, было ли значение уже задано в EEPROM. Если это не так, то он вызывает функцию, которая запрашивает вас через последовательный монитор, позволяет ввести номер и сохраняет его в EEPROM. Этот код будет выполняться только при первом включении платы. После этого никто никогда не увидит это приглашение, если вы не очистите плату и не перезагрузите ее., @Delta_G