Сохранение переменных после перезапуска в NodeMCU

Я делаю систему умного дома с помощью nodeMCU, и мне нужно хранить и извлекать данные из модуля. Я использовал следующую функцию.

function save_settings(name,value)
  file.remove(name)
  file.open(name,"w+")
  file.writeline(value)
  file.close()
end

Он работает, но медленно, и NodeMCU дает сбой, если я быстро запускаю вышеуказанную функцию ... Иногда требуется формат FS, чтобы снова использовать его.

Итак, мой вопрос: есть ли другой способ сделать переменные постоянными между перезапусками?


person Suraj Bhawal    schedule 16.09.2015    source источник
comment
каждая запись, вероятно, требует стирания и перезаписи блока флэш-памяти, что по своей сути является медленным. Я понятия не имею, почему произойдет сбой, но это может быть переполнение буфера записи или попытка стереть/записать страницу, когда та же операция уже выполняется. В любом случае решение может состоять в том, чтобы где-то буферизовать данные в массиве и реже записывать. Если этого недостаточно, вам может потребоваться запись в SPI EEPROM или SD-карту :(   -  person user1816847    schedule 04.10.2015
comment
@ user1816847 Спасибо за ответ, но это больше не вариант, потому что я уже сделал печатную плату cuatom для проекта и в настоящее время использую ее без функции сохранения ... Все, что я могу сделать сейчас, это реализовать дома функцию сохранения загрузки только с помощью программного обеспечения. .   -  person Suraj Bhawal    schedule 04.10.2015
comment
Я бы порекомендовал удалить file.remove(name), так как в данном случае он избыточен с file.open из-за режима w+. Это также может упростить работу, которую должна выполнять FS, поскольку в таблице файлов нет изменений.   -  person Adam B    schedule 30.03.2016


Ответы (2)


Я использую последнюю прошивку, 0.9.6-dev_20150704, версию с плавающей запятой (https://github.com/nodemcu/nodemcu-firmware/releases)

Сначала этот код выполнялся за 62-63 мс, и кажется, что он добавляет несколько долей миллисекунды с каждым последующим запуском кода, после нескольких сотен выполнений это время достигло почти 100 мс. Он ни разу не разбился на меня.

function save_setting(name, value)
  file.open(name, 'w') -- you don't need to do file.remove if you use the 'w' method of writing
  file.writeline(value)
  file.close()
end

function read_setting(name)
  if (file.open(name)~=nil) then
      result = string.sub(file.readline(), 1, -2) -- to remove newline character
      file.close()
      return true, result
  else
      return false, nil
  end
end

startTime = tmr.now()

test1 = 1200
test2 = 15.7
test3 = 75
test4 = 15000001
save_setting('test1', test1)
save_setting('test2', test2)
save_setting('test3', test3)
save_setting('test4', test4)

1exists, test1 = read_setting('test1')
2exists, test2 = read_setting('test2')
3exists, test3 = read_setting('test3')
4exists, test4 = read_setting('test4')

completeTime = (tmr.now()-startTime)/(1000)
print('time to complete (ms):')
print(tostring(completeTime))
person wordsforthewise    schedule 17.10.2015
comment
в функции read_setting у вас есть file.readline(value) - вероятно, это должен быть просто file.readline(), так как value не должно существовать в этом контексте. - person askvictor; 07.03.2016
comment
Кроме того, я бы добавил проверку, чтобы увидеть, был ли вызов open() успешным - если он возвращает nil, то функция read_setting должна возвращать nil. - person askvictor; 07.03.2016
comment
более короткая форма для удаления новой строки: file.readline():match("[^\n]*") - person rodvlopes; 16.09.2017

При обновлении до более новой версии (на основе SDK 1.4.0) вы можете использовать слоты памяти rtcmem:

local offset = 10
local val = rtcmem.read32(offset, 1)
rtcmem.write32(offset, val + 1)

Документально подтверждено, что эта память сохраняется в течение цикла глубокого сна; Я обнаружил, что он сохраняется как при аппаратном, так и при программном сбросе (но не при отключении питания).

person Mark McGinty    schedule 19.04.2016
comment
Пользователь хочет, чтобы он сохранялся после выключения питания, поэтому он записывает в файл. - person ambassallo; 29.05.2016