2015-09-16 13 views
5

私はnodeMCUを使ってスマートなホームシステムを作っています。モジュールからデータを保存したり取得したりする必要があります。私は以下の関数を使用しました。NodeMCUで再起動しても変数を永続化する

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

それは動作しますが、それは遅いですし、私は時々、再びそれを使用できるようにFSのフォーマットを必要とする...急速に上記の機能をトリガーする場合NodeMCUがクラッシュします。

私の質問は、再起動の間に変数を永続化させる他の方法はありますか?

このコードは最初に完了するために、62から63ミリ秒を取って、ミリ秒の数分のを追加しているようだ( https://github.com/nodemcu/nodemcu-firmware/releases

+0

それぞれの書き込みでは、本質的に遅い消去と書き換えが必要な可能性があります。なぜクラッシュするのかわかりませんが、同じ操作が既に起きている間に、書き込みバッファがあふれているか、ページの消去/書き込みを試みている可能性があります。どちらの場合でも、解決策はデータを配列のどこかにバッファリングして書き込む頻度を減らすことです。これで十分ではない場合は、SPI EEPROMまたはSDカードに書き込む必要があるかもしれません:( – user1816847

+0

@ user1816847 Ithxの返信用ですが、私はすでにプロジェクト用にcuatom pcbを作成していて、現在保存機能なしで使用しています...私が今行うことができるのは、いくつかのホームは、ソフトウェアのみを使ってセーブロード機能を実装することです。 –

+0

この場合、 'file.open'で冗長な' file.remove(name) 'を削除することをお勧めしますこれは、ファイルテーブルに変更がないので、FSが行う必要がある作業を単純化することもできます。 –

答えて

4
私は最新のファームウェアを使用してい

、0.9.6-dev_20150704、floatバージョン各コードを連続して実行すると、数百回の実行後にはほぼ100ミリ秒まででした。それは私の上で決して墜落しなかった。あなたは(SDK 1.4.0に基づいて)新しいバージョンにアップグレードする場合

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)) 
+1

read_setting関数では、file.readline(value) .readline()がそのコンテキストに存在しないようにしてください。 – askvictor

+0

また、open()呼び出しが成功したかどうかを確認するために、nilを返した場合、read_setting関数はnilを返す必要があります。 – askvictor

+0

ありがとう反射する あなたのポイント。 – wordsforthewise

3

あなたはrtcmemメモリスロットを使用することができます。

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

メモリは、深い睡眠サイクルを持続するために文書化されていること。ハードウェアリセットとソフトウェアリセットの両方で持続することがわかりましたが(サイクリングパワーはありません)

+0

です。ユーザーはパワーサイクルを通して持続したいと思っています。 – ambassallo

関連する問題