ESP8266 – jak korzystać z EEPROM-u

4
424

Większość mikrokontrolerów dostępnych obecnie w sprzedaży posiada jakąś formę pamięci nieulotnej. Zwykle program przechowywany jest w pamięci Flash,  natomiast do użytku programisty pozostaje pamięć EEPROM. Pamięć ta kasowana jest za pomocą prądu elektrycznego i ilość możliwych kasowań i zapisów jest ograniczona. Ilość odczytów nie ma wpływu na żywotność tej pamięci.


W przypadku popularnego Arduino UNO, które oparte jest na mikrokontrolerze ATMEGA328, do dyspozycji dostajemy 1024 bajty. Na tych bajtach zapisać możemy dowolne informacje, które zostaną podtrzymane po wyłączeniu zasilania. Ilość cyklów zapisów EEPROM dla tego mikrokontrolera gwarantowana jest przez jego producenta na ok 100 000. Po przekroczeniu tej liczby pamięć ta może ulec uszkodzeniu.

Należy wziąć pod uwagę, że operacje na pamięci EEPROM są stosunkowo czasochłonne (cykl kasowania i zapisu zajmuje 1.8 – 3.4 ms). Nie nadaje się ona również i z tego względu (poza limitowaną ilością zapisów) do wykonywania na niej częstych operacji lub wykorzystania w formie np. bufora.

Z tych oczywistych względów pamięć EEPROM używana jest głównie do przechowywania wszelkiego rodzaju ustawień konfiguracyjnych. W moim projekcie SandwichBoxBot wykorzystuję ją np. do zapamiętania ssid i hasła do sieci WiFi.

Obsługa EEPROM w przypadku Arduino jest bardzo prosta. Wykorzystujemy przede wszystkim funkcje read i write i to generalnie jest wszystko co powinniśmy wiedzieć.

W przypadku ESP8266 jest troszkę inaczej. Tutaj dostępne mamy więcej pamięci niż w Arduino Uno bo aż 4096 bajtów. Nieco inaczej wygląda też obsługa pamięci w dołączonej bibliotece.

Przed wykonaniem operacji zapisu lub odczytu należy wywołać funkcję EEPROM.begin(x) – gdzie x może być wartością z zakresu 4 – 4096 określającą, na jakiej ilości pamięci chcemy operować.

Warto pamiętać o tym, że w przypadku “wyrzucania” obsługi EEPROM do osobnej klasy, raczej nie należy odpalać funkcji begin w konstruktorze, a po wykonaniu begin zrobić krótki delay (np. 10 ms). W przeciwnym wypadku (czyli wywołaniu begin zanim tak naprawdę ESP8266 porządnie “wystartuje”) funkcje zapisu i odczytu mogą po prostu nie działać i zwracać błąd.

Zapis i odczyt wykonujemy identycznie jak w przypadku klasycznego Arduino, za pomocą funkcji read i write. Trzeba jednak pamiętać, że aby wykonać zapis należy wywołać jeszcze funkcję commit() lub end().

Funkcja commit() spowoduje jedynie zapisanie pamięci EEPROM, Skorzystanie z end() dodatkowo zwolni cześć pamięci RAM, która przechowuje kopię danych z EEPROM.

4 KOMENTARZE

  1. Cześć. Jest szansa żebyś pokazał kod który wykorzystujesz do zapisywania i odczytywania później SSID i hasła?

      • Dziękuję bardzo! 🙂 Jeśli nie nadużyję Twojej gościnności i chęci dzielenia się wiedzą (uwielbiam tego typu blogi!) to chciałbym się poradzić w kwestii działania ESP8266-07.

        Do tej chwili moje małe “projekty” pisałem na atmegi328, ale widząc potencjał ESP8266 (wifi + więcej pamięci i szybszy zegar) chciałem je przepisać na ten iC. I o ile sam kod jest prosty, bo właściwie prócz pinów niewiele musiałem zmienić, o tyle problem mam z samym uruchomieniem układu.

        Mianowicie co do wgrywania już doszedłem (nie wszędzie piszą że GPIO0 trzeba podłączyć do masy, a że GPIO15 również to już w ogóle internet można przeszukiwać godzinami. A bez ich zmasowania wgrywanie ni jak nie idzie przy pomocy FT232, nie wiem jak z innymi), po wgraniu program się uruchamia, ale problem powstaje po jego wyłączeniu. Chodzi mi o ponowne włączenie, gdy program się po prostu nie uruchamia. Nie wiem dlaczego tak jest. Robiłem już chyba wszystko: odłączałem GPIO0/15, podłączałem GPIO0 do VCC, zawsze z tym samym mizernym efektem. Układ działa (świeci na czerwono), ale sam program nie działa – nie łączy się do WiFi, nie zapala diody, nie mrygają diody na FT232 (a program wysyła po serialu to co robi).

        Jako że chyba jesteś moją ostatnią deską ratunku chciałem się zapytać czy może ty masz jakiś pomysł?

      • OK, właśnie sobie poradziłem z problemem. Dla potomnych: aby wystartować w normalnym trybie ESP-07 (czyli nie programowania) należy podłączyć PINy jak poniżej:

        GPIO15 – GND
        GPIO2 – VCC
        GPIO0 – VCC
        EN – VCC

ZOSTAW ODPOWIEDŹ

Please enter your comment!
Please enter your name here