Сохранение настроек. Когда?

sirota
Offline
Зарегистрирован: 18.08.2015

Собственно вопрос в заголовке.

Грубо говоря есть 50 параметров. 40 из них настраиваются в отдельном пункте меню и сохраняются по отдельному запросу из того же меню. Но есть еще 10 параметров которые туда не входят. Т.е. - эти параметры изменяются пользователем отдельно с кнопок, либо же изменяются самой программой.

Сохряняю сейчас примерное так:

void write_ee(int all) {
  //Пишем в EEPROM
  if (all == 1) {
    eeprom_write_dword( & ee_delta, delta);
    eeprom_write_dword( & ee_need_t, need_t);
    eeprom_write_dword( & ee_need_t_wash, need_t_wash);
    eeprom_write_dword( & ee_t_cor_time, t_cor_time);
    eeprom_write_dword( & ee_t_max, t_max);
    eeprom_write_dword( & ee_move_drive, move_drive);
  }
  eeprom_write_dword( & ee_water, water);
}

Т.е.  или сохряняю все, или сохраняю отдельные перменные. Я пока с мк только знакомлюсь, это мой 3-й проект, ушел от чистой меги к ардуинке, ибо ценник выходит 1 в 1, а проблем с хотя бы тем же АЦП в разы меньше, хотя и дольше. Посему задаю этот вопрос: А праивльно ли я поступаю? А может лучше переписывать всегда? Но тогда на сколько мне хватит циклов записи по времени. А нет ли глюков с тем что я пишу не поочереди, а вот так куском (просто в 1-ом проекте я уже столкнулся с подобной проблемой, записанная отдельно перменная перебила почему-то все остальные и после загрузки мк прочитал сдвинутые хаотично значения, т.е. грубо говоря из 10 прочитались все 10, но не в том порядке в котором они были записаны). данный баг был воспроизведен и на железе. Из 1000 попыток один раз да выскакивает.

И опять же, перменная water у меня меняется пользователем, а скажем положение 2-х сервомоторов меняются каждые 5 секунд, а мне при включении надо знать их положение.

Особо ситуацию усугубляет то что я не знаю когда выключится МК.

Как мне поступить в итоге? Заранее благодарю.

 

Araris
Offline
Зарегистрирован: 09.11.2012

 Писать можно и по очереди, и "куском", я нигде не встречал запретов/ограничений.

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

 А вот что с этим делать... подумать надо. Поподробнее напишите, что это за сервомоторы, положение которых надо знать при включении. Может получится с другой стороны как-то решить, например, через внешние датчики положения сервомоторов.

Diemon
Offline
Зарегистрирован: 18.11.2011

Если у вас хоббийные сервы, выведите провод с потенциометра. Будете знать положение сервы в любой момент

Araris
Offline
Зарегистрирован: 09.11.2012

Да-да, я тоже про потенциометры.

sirota
Offline
Зарегистрирован: 18.08.2015

Ну пока сервы самее простецкие (у знакомого взял, с вертолетом шли в комплекте, я даже не помню что там, видел их секунд 5 и закинул в коробочку, еще даже макет не собирал). Обратной связи там нет. Пригондобить туда потенциомер отдельно... цестно даже не представлю как.

Вообще суть какая. У меня колонка газовая проточная. Т.к. официально для устанвоки нужно пройти 300 кругов ада, и после прохождения 2-ого мне их работник сообщила, что ее установка обойдется мне тыр в 30 минимум и что не лечи мозг и поставь ее в тихую и все. В общем я так и сделал (офф уставнока конечно длится, жду уже 4 месяца когда приедут и сделают замеры помещения, а потом рассмотрят где ее можно постаивть), устанвоил колонку в гараже. Колонка хорошая, греет спокойно мой не слабый напор до 70 градусов (дальше не знаю, отбивает защита, у меня вытяжка еще не готова полностью), но с механическим управлением, без автоподстройки как по температуре, так и по давлению.  А колонка то сейчас стоит в гараже. Вот настроил ее скажем на 50 градусов для набора воды в ванную. А умываться уже не выходит. Или напор бешеный, или через 10 секунд тушится колонка по перегреву.

ПОэтому и родилась идея:

1. При включении колонки загорается индикатор температуры, с него через транзистор будем подавать питание и включать соответственно МК (хотел оставлять все время включенным, но думаю при использовании в течении 20 минут в сутки держать включеным как-то не камильфо, с другой стороны еще думаю над этим, тогда конечно вопрос сей отпадает, но пока так)

2. МК инициализируется у меня примерно 1 секунду. За это время вода успеет как-то прогрется до почти прежнего уровня. Сервы не дернутся, ибо питание на них появится только после полного пробуждения МК

3. Если открыть кран посильнее, количество воды увеличится и ее температура упадет, мк подбавит сервой на регуляторе газа на опредленный процент,. (ну и с повышением температуры так же)

3.1 если разница от нормы в пределах 1-5 градусов, то будет двигать по 1 шагу.

3.2 если разница от нормы  в пределах 5-10 грудусов, то будет двигать по 2 шага

3.3. если разница от нормы больше 10 градусов, будет двигать по 5 шагов.

(есть еще коэфф коррекции, он настраивается)

 

4. 2 режима работы.

4.1 Авто, когда мк корректирует температуру к заданной. Так же 2 режима, т.е. температура для купания (включается отдельной кнопкой) и температура для умывания (последняя включается при загрузке автоматически).

4.2 Ручной режим. Тут за температуру не корректируем. Просто удаленноеуправление ручкой газа.

5. Управление потоком воды на колонке.

 

При всем при этом я оставляю все степени защиты колонки. Т.е. так же при отсутствии давления воды она или не загорится, или потухнет. При отсутствии давления газа клапан закроется. Если потухнет пламя, газ перекроется. При перегреве колонка потухнет. Но к тому моменту (при 70 градусах) я на мк выкручу газ в крайнее положение (т.е. огонек будет еле гореть, а воду принудительно открою на всю).

В принципе все это уже реализовано, и даже знакомый реализовал это на железе и пользуется. Но там Atmega8 и 0 свободных пинов. Т.е. расти не куда. Плюс проблема с обновление ПО. Надо снимать с кроватки и шить на прогромматоре. Я было пробовал на меге так АЦП, но или лыжи не едут... В общем рабочий код АЦП под CodeVision с исходником от туда на МК работает, а когда я его перевожу на C++ в Atmel Studio то получаю шишь. А тут решил что сразу убью 2-х зайцев. И ардуинку попробую и с кнопок через АЦП получу без геморроя вагон.

Сейчас у меня задействовано 10 пинов. Это и 10 кнопок и 2 сервомотора и датчик температуры и экранчик.

 

А ну и вернемся к нашим баранам. Когда мне вода не нужна, я закрываю кран на колонке, колонка тухнет, выключается экранчик на ней, соответственно закрывается транзистор и МК тухнет как и все остальное, т.е. отследить послденее положение не получается. Каогда опять открываю газ, колонка включается, зажигает свой экранчик, открывается транзистор, просыпается МК, открывает питание на сервы. Вот такая вот идея.

Diemon
Offline
Зарегистрирован: 18.11.2011

Всю простыню не читал. Еще раз повторюсь: подпаяйтесь к потенциометру сервомашинки. Он там есть.  Если в "устройстве" нет потенциометра(обратной связи), как вы говорите, то это не сервопривод. 

sirota
Offline
Зарегистрирован: 18.08.2015

Точно. Я как-то и не мыслил на эту тему. Ведь действительно, как мк установленный в серву определяет куда ему нужно матнуть двигатель, ведь без нагрузки он молчит. Спасибо большое! Завтра пойду достану серву и разберу.

Клапауций 998
Offline
Зарегистрирован: 12.08.2015

sirota пишет:

Особо ситуацию усугубляет то что я не знаю когда выключится МК

а, ты узнай, когда он выключится - сделай программную кнопку "power", и нажимай ею на выключение блока питания халабуды, предварительно сбрасывая переменные в eeprom, если они изменились.

делов то - красиво и удобно получится.

sirota
Offline
Зарегистрирован: 18.08.2015

Решил сделать так:

Аппаратная часть:

Програмная часть выполняется так:

void powerControl(int _write_ee) {
  if (digitalRead(checkPowPin) == LOW) {
    if (_write_ee == 1) {
      Serial.println("Prepare the device to shutdown");
      write_ee(0);
    }
    digitalWrite(powerControlPin, LOW);
  }
  else
  digitalWrite(powerControlPin, HIGH);
}
void setup () {

Serial.println("Initial external power");
  pinMode(checkPowPin, INPUT);
  digitalWrite(checkPowPin, LOW);
  pinMode(powerControlPin, OUTPUT);
  powerControl(0);
}

void loop () {
powerControl(1);
}

 

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

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

На данный момент испытываю трудности в протеусе. Почему с транзистора он мне показывает такое падение? Я уже все транзисторы перепробовал (я в аппаратной части не селен). Это прикол протеуса? Просто мосфеты как-то не так. Даже тот же диод шоттке при 5 вольтах на катоде на оноде выдает 1 вольт. При чем если запустить моделирование и изначально на аноде ни чего не будет, то и после появления питания на катоде на аноде будет ноль. КОроче я в шоке... буду ждать урдуинки и видимо уже на макетке буду пробовать, что-то протеус меня задолбал. Со вчерашнего дня не работает эмуляция отображения работы серв. Даже осцилографом там не виждно ни чего не ноге, а если залесть в тело программы и выводить в скажем serial, то видно что все отрабатывает. Чем вы моделируете на компе? У меня протеус8 с библиотекой от хз кого для ардуино уно. Заранее благодарю.