2015-09-16 14 views
5

Realizzo un sistema di casa intelligente utilizzando nodeMCU e ho bisogno di memorizzare e recuperare i dati dal modulo. Ho usato la seguente funzione.Rendere persistenti le variabili dopo un riavvio su NodeMCU

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

Funziona, ma è lento e il NodeMCU si blocca se attivare la funzione di cui sopra rapidamente ... A volte richiede un formato FS per essere in grado di utilizzare di nuovo.

Quindi la mia domanda è: esiste un altro modo per rendere persistenti le variabili tra riavvii?

+0

ogni scrittura probabilmente richiede un blocco di flash da cancellare e riscrivere, che è intrinsecamente lento. Non ho idea del motivo per cui si bloccherebbe, ma potrebbe traboccare il buffer di scrittura o tentare di cancellare/scrivere una pagina mentre la stessa operazione sta già accadendo. In entrambi i casi, la soluzione potrebbe essere quella di memorizzare i dati in un array da qualche parte e scrivere meno spesso. Se ciò non è sufficiente, potrebbe essere necessario scrivere su una EEPROM SPI o sulla scheda SD :( – user1816847

+0

@ user1816847 Ithx per la risposta, ma non è più un'opzione perché ho già realizzato un pcb cuatom per il progetto e attualmente lo utilizzo senza la funzione di salvataggio ... Tutto quello che posso fare ora è un po 'di casa implementare una funzione di salvataggio del carico solo attraverso il software .. –

+0

Ti consiglio di rimuovere 'file.remove (nome)' in quanto è ridondante con 'file.open' in questo caso a causa della modalità 'w +' Questo può anche semplificare il lavoro che le FS devono fare dato che non ci sono cambiamenti nella tabella dei file. –

risposta

4

sto utilizzando l'ultimo firmware, 0.9.6-dev_20150704, la versione galleggiante (https://github.com/nodemcu/nodemcu-firmware/releases)

Questo codice ha preso 62-63 ms per completare in un primo momento, e sembra di aggiungere qualche frazione di un millisecondo con ogni esecuzione successiva del codice, dopo alcune centinaia di esecuzioni, era di circa 100 ms. Non si è mai schiantato su di me.

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

nella funzione read_setting, hai file.readline (valore) - questo probabilmente dovrebbe essere solo un file .readline() come valore non dovrebbe esistere in quel contesto – askvictor

+0

Inoltre, vorrei aggiungere un controllo per vedere se la chiamata open() è riuscita - se restituisce nil, la funzione read_setting dovrebbe restituire nil. – askvictor

+0

Grazie, aggiornato per riflettere i tuoi punti. – wordsforthewise

3

Se si esegue l'aggiornamento alla versione più recente (sulla base di SDK 1.4.0) è possibile utilizzare gli slot di memoria rtcmem:

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

che la memoria è documentato a persistere attraverso un ciclo di sonno profondo; Ho riscontrato che persiste su entrambi i ripristini hardware e software (ma non sul ciclo).

+0

L'utente desidera che persista attraverso un ciclo di spegnimento, ecco perché sta scrivendo su file. – ambassallo

Problemi correlati