Kysymys:
Kuinka lukea ja kirjoittaa EEPROM-tiedostoa ESP8266: ssa
Embedded Geek
2016-07-02 23:18:40 UTC
view on stackexchange narkive permalink

Minun on tiedettävä, kuinka voin kirjoittaa kokonaislukuarvot EEPROM-tiedostoon ja pitää arvon käynnistyksen yhteydessä.

  char * Red = strstr (myTestUrl , "/ R"); jos (punainen) {int Punainen arvo = atoi (punainen + 2); analogWrite (12, RedValue); Serial.println ("Punainen:"); Serial.println (RedValue);}  

Haluan kirjoittaa RedValue EEPROM-tiedostoon. Kuinka se voidaan tehdä?

Katso EEPROM-malliluonnokset, jotka asennetaan, kun lisäät ESP8266-tuen arduino-ideoon
sinulla on kysyttävää, onko EEPROM-laitteella flash-riippuvuuksia. Voinko vilkkua 1 Mt: llä (ei SPIFFS) ja voin käyttää EEPROMia? Kiitos T
Viisi vastused:
codechimp
2017-12-19 01:47:21 UTC
view on stackexchange narkive permalink

Vaikka EEPROM.read ja EEPROM.write ovat kelvollisia menetelmiä, se on kuin lattian pyyhkiminen hammasharjalla. Käytä sen sijaan EEPROM.put ja EEPROM.get .

Esimerkki:

  #include <EEPROM.h>void setup () {Serial.begin (9600); uint addr = 0; // väärennetty data struct {uint val = 0; char str [20] = ""; } tiedot; // sitoudu 512 tavua ESP8266-salamaa ("EEPROM" -emulointia varten) // tämä vaihe tosiasiallisesti lataa salaman sisällön (512 tavua) // 512-tavun matriisin välimuistiin RAM-muistissa EEPROM.begin (512); // luetaan tavuja (eli EEPROM-tiedoston "dataof"), // todellisuudessa lukee tavut-taulukon välimuistista // valetaan tavut rakenteeseen nimeltä data EEPROM.get (addr, data); Serial.println ("Vanhat arvot ovat:" + String (data.val) + "," + String (data.str)); // viulata EEPROM-tiedoista "luettujen" tietojen kanssa.val + = 5; if (strcmp (data.str, "hei") == 0) strncpy (data.str, "jerry", 20); else strncpy (data.str, "hei", 20); // korvaa tavutaulukon välimuistin arvot muokatulla tiedolla // ei muutoksia suoritettu flashiin, kaikki paikallisessa tavutaulukkovälimuistissa EEPROM.put (addr, data); // itse kirjoittaa tavutaulukon välimuistin sisältö // laitteistosalamalle. flash-kirjoitus tapahtuu vain ja vain, jos tavu-taulukon välimuistissa on muutettu yhtä tai useampaa tavua //, mutta jos niin, KAIKKI 512 tavua // kirjoitetaan flash-muistiin EEPROM.commit (); // tyhjennä 'data' -rakenteen data.val = 0; strncpy (data.str, "", 20); // lataa EEPROM-tiedot, katso muutos // OOPS, ei tosiasiallisesti lukee flash-tiedostoa, mutta lukee tavu-matriisin välimuistin (RAM-muistissa), // virtasykli ESP8266, jotta näet todella flash- / "EEPROM" -päivityksen EEPROM.get (addr , tiedot); Serial.println ("Uudet arvot ovat:" + String (data.val) + "," + String (data.str));} void loop () {delay (1000);}  

PÄIVITTELY : Jos haluat ymmärtää, kuinka "EEPROM" jäljitellään ESP8266: ssa, kannattaa ehkä viitata osoitteeseen https://github.com/esp8266/Arduino/tree/ master / libraries / EEPROM, erityisesti EEPROM.h.

Myöskään EEPROM.end ei ole tarpeen, se vain tyhjentää flash-muistin / EEPROMin RAM-muistista paikallinen tavu-matriisivälimuisti Se palvelee muita toimintoja.

olet tallentanut päiväni, etsin ratkaisua yli viisi tuntia ja olet antanut sen!
Varsinainen Arduino-dokumentaatio puuttuu täältä ja lähteet eivät myöskään auta. Onko EEPROM.end () vielä tarpeen? Miksi aloitusta (512) tarvitaan? Plus get () / put () -yhdistelmä tai päivityksen () käyttö estäisivät EEPROM-kulumista. Ehkä voisit päivittää vastauksen.
Tein kopion / liitän tämän tarkan koodin NodeMCU v3: lle, ja se ei noudata kirjoitettua arvoa virrankäynnin jälkeen (kommentoin "kirjoitusosaa toisen ajon aikana").
@WhiskerBiscuit, Näetkö JOKA lähtöä sarjakonsolissa? oletko varma, että tiedonsiirtonopeus on asetettu oikein? minulla ei ole v3, vain v0.9, joten en voi auttaa, jos tämä on eteenpäin suuntautuva yhteensopivuusongelma.
viitteestä "EEPROM.write ei kirjoita välkkymään välittömästi, vaan sinun on soitettava EEPROM.commit () aina, kun haluat tallentaa muutokset flashiin. EEPROM.end () sitoutuu myös ja vapauttaa EEPROM-sisällön RAM-kopion. "
Olen oppinut käytännössä sen, että EEPROM.commit () on ehdottoman välttämätön, ainakin esp8266: lla, jotta EEPROM-tiedot säilyvät uudelleenkäynnistyksessä.
user31481
2017-07-04 05:12:28 UTC
view on stackexchange narkive permalink

EEPROM.write (pos, val) kirjoittaa yhden tavun ( val ) osoitteeseen, jonka antaa pos . ESP8266: n "int" vie 4 tavua, joten se on hieman monimutkaisempi, koska EEPROM toimii tavuina, ei tavuina.

Tässä on koodi yhden int val kirjoittamiseen osoitteessa jokin sijainti pos EEPROMissa:

  void eeWriteInt (int pos, int val) {tavu * p = (tavu *) &val; EEPROM.write (pos, * p); EEPROM.write (pos + 1, * (p + 1)); EEPROM.write (pos + 2, * (p + 2)); EEPROM.write (pos + 3, * (p + 3)); EEPROM.commit ();}  

ja tietysti sinun on luettava se takaisin:

  int eeGetInt (int pos) {int val; tavu * p = (tavu *) &val; * p = EEPROM.luku (pos); * (p + 1) = EEPROM.luku (pos + 1); * (p + 2) = EEPROM.luku (pos + 2); * (p + 3) = EEPROM.luku (pos + 3); return val;}  

Arduinossa soitat EEPROM.begin () , mutta ESP8266: ssa sinun on soitettava EEPROM.begin (n) , jossa n on tarvitsemiesi tavujen kokonaismäärä.

Ja muista, että EEPROMilla on lyhyt käyttöikä (kirjoitusten lukumäärän mukaan). Sinun on minimoitava kirjoitusten määrä!

EEPROM on pysyvä; sinun ei tarvitse tehdä mitään.

Tein joitain hakuja ja näyttää siltä, ​​että EEPROM: t pystyvät käsittelemään paljon enemmän kirjoitusjaksoja kuin flash-tallennustila, mutta sitten flash-tallennuksessa on myös ohjain, joka lopettaa huonojen osien käytön ja jatkaa työskentelyä jäljellä olevien kanssa.
YLIMÄÄRÄINEN elinkaarihälytyksen takia. 100k sykliä, jotkut sanovat.
360
2018-01-05 07:37:22 UTC
view on stackexchange narkive permalink

Menetelmä kirjainten lukumäärän avulla.

  #include <ESP8266WiFi.h>const char * SSID = "R360"; // MAX 32const char * PASSWORD = "HFDYUK64323246"; // MAX 32 # sisältää <EEPROM.h>void setup () {Serial.begin (9600); EEPROM_ESP8266_GRABAR (SSID, 0); // Primero de 0 al 32, del 32 al 64 jne. EEPROM_ESP8266_GRABAR (SALASANA, 32); // TALLENNA Serial.println (); Serial.println (EEPROM_ESP8266_LEER (0, 32)); // Primero de 0 al 32, del 32 al 64 jne. Serial.println (EEPROM_ESP8266_LEER (32, 64)); WiFi.begin (EEPROM_ESP8266_LEER (0,32) .c_str (), EEPROM_ESP8266_LEER (32,64) .c_str ());} // void loop () {} // void EEPROM_ESP8266_GRABAR (Merkkijonopuskuri, int N) {EEPROM. alkaa (512); viive (10); (int L = 0; L < 32; ++ L) {EEPROM.write (N + L, puskuri [L]); } EEPROM.commit ();} // Merkkijono EEPROM_ESP8266_LEER (int min, int max) {EEPROM.begin (512); viive (10); Merkkijono puskuri; for (int L = min; L < max; ++ L) if (isAphaNumeric (EEPROM.read (L))) -puskuri + = char (EEPROM.read (L)); palautuspuskuri;}  
Embedded Geek
2017-03-04 23:37:31 UTC
view on stackexchange narkive permalink

Käytä #include <EEPROM.h>

  EEPROM.begin (koko); // Koko voi olla missä tahansa välillä 4 ja 4096 tavua.EEPROM.write (0, RedValue); // Tallennetaan 0. sijaintiin LocationEEPROM.commit ();  
PeterM
2017-12-30 05:57:56 UTC
view on stackexchange narkive permalink

Käytän koodissa ESP8266 kahta erillistä toimintoa - yhden koodilla EEPROM.put () , toisella EEPROM.get () .

Minulla oli EEPROM.begin (sizeof ...); vain EEPROM.put () -toiminnossa ja put toimi, mutta se vei minut jonkin aikaa, kunnes sain selville, että sitä on käytettävä myös ennen EEPROM.get () .



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...