Jak korzystać z pamięci EEPROM Arduino do zapisywania danych między cyklami zasilania?

Jak korzystać z pamięci EEPROM Arduino do zapisywania danych między cyklami zasilania?

Czy wiesz, że Arduino może przechowywać dane, gdy jest wyłączone? Nie szkic przechowywany w pamięci flash. Mówię o zmiennych danych w EEPROM-ie. Dołącz do mnie, gdy pokażę Ci, jak w nim czytać i pisać oraz co może zrobić dla Twoich projektów.





Jeśli jesteś nowy w Arduino, koniecznie sprawdź nasze Przewodnik dla początkujących .





Co to jest EEPROM?

EEPROM oznacza elektrycznie kasowana programowalna pamięć tylko do odczytu . To rodzaj pamięci nieulotnej. Nie martw się, jeśli nie rozumiesz, co to oznacza. Po prostu przechowuje dane nawet po odłączeniu zasilania (w przeciwieństwie do Baran , który potrzebuje energii elektrycznej do przechowywania jakichkolwiek danych).





EEPROM jest wbudowany w niezliczoną ilość procesorów, takich jak programowalna macierz bramek (FPGA) używana w Matrix Creator Pi HAT. Wszystkie Arduino mają dostępną pamięć EEPROM, ale pojemność różni się w zależności od modelu. Zapoznaj się z naszym przewodnikiem zakupu, aby uzyskać więcej informacji na temat każdej deski.

Jak to działa?

EEPROM jest elektrycznie kasowany i programowany za pomocą Tunelowanie Fowlera-Nordheima . Nie musisz znać szczegółów technicznych, aby móc z niego korzystać. Podstawowym założeniem jest to, że prąd służy do zmiany danych binarnych (co jest binarne). Można go czytać, usuwać i przepisywać elektronicznie.



Na szczęście Język Arduino ułatwia zmianę danych, a wszystko to bez konieczności posiadania dyplomu z informatyki.

Długość życia

Chociaż jest łatwy w użyciu EEPROM w Arduino, ma on ograniczoną żywotność. EEPROM jest przystosowany do obsługi 100 000 cykli odczytu/kasowania. Oznacza to, że możesz zapisać, a następnie wymazać/ponownie zapisać dane 100 000 razy, zanim pamięć EEPROM stanie się niestabilna. W rzeczywistości, Atmel (producenci półprzewodników Arduino „Chip”) mogą obsługiwać większą lub mniejszą liczbę cykli, w zależności od tolerancji każdego procesora.





Gdy lokalizacja zostanie zapisana i usunięta zbyt wiele razy, może zacząć stawać się niewiarygodna. Może nie zwracać poprawnych danych lub zwracać wartości z sąsiedniego bitu.

Może to brzmieć jak wiele zapisów, ale może być łatwo osiągnąć ten limit, jeśli czytasz i piszesz programowo (w pętla , na przykład). Odczyt danych nie degraduje krzemu, tylko pisanie robi . Możesz bez obaw odczytywać dane z EEPROM-u do woli!





Należy zauważyć, że ten limit dotyczy każdej lokalizacji w pamięci. Twój Arduino może mieć 1000 lub więcej lokalizacji pamięci dostępnych w EEPROM, więc jeśli zapisujesz zbyt wiele razy w jednej lokalizacji, dotyczy to tylko tej lokalizacji, a nie żadnej z pozostałych. Później będę dyskutować wyrównywanie zużycia , który może zmniejszyć zużycie pamięci EEPROM poprzez równomierną dystrybucję danych — coś, z czego korzystają dyski SSD.

Do czego to jest przydatne?

EEPROM jest niezwykle przydatny w projektach Arduino. Ponieważ zapamiętuje dane nawet po odłączeniu zasilania, możesz przechowywać stan Arduino. Może mógłbyś zbudować wieżyczkę laserową, która zapamiętuje swoją pozycję lub ile „amunicji” pozostało. Możesz go użyć do sterowania urządzeniami i rejestrowania, ile razy Twoje urządzenie zostało aktywowane.

EEPROM najlepiej nadaje się do takich rzeczy, jak ustawienia lub wysokie wyniki. Jeśli chcesz regularnie pisać złożone dane, rozważ osłonę Ethernet (z wbudowanym gniazdem SD) lub Raspberry Pi.

Czytaj i pisz

Teraz, gdy teoria się skończyła, przyjrzyjmy się, jak czytać i zapisywać dane! Najpierw dołącz bibliotekę (dostarczana z Arduino IDE):

#include

Teraz napisz trochę danych:

EEPROM.write(0, 12);

To zapisuje liczbę 12 do lokalizacji EEPROM 0 . Każdy zapis trwa 3,3 milisekundy ( SM , 1000ms = 1 sekunda). Zauważ, że nie możesz pisać liter ( zwęglać ), dozwolone są tylko liczby od zera do 255. Właśnie dlatego EEPROM jest idealny do ustawień lub wysokich wyników, ale nie jest tak dobry dla nazw graczy lub słów. Możliwe jest przechowywanie tekstu przy użyciu tej metody (możesz zmapować każdą literę alfabetu na liczbę), jednak będziesz potrzebować wielu lokalizacji w pamięci – jedna lokalizacja dla każdej litery.

Oto jak czytasz te dane:

darmowe oprogramowanie do księgowości osobistej w programie Excel
EEPROM.read(0);

Zero to adres, pod który pisałeś wcześniej. Jeśli wcześniej nie pisałeś na adres, zwróci maksymalną wartość ( 255 ).

Dostępnych jest kilka nieco bardziej przydatnych metod. Załóżmy, że chcesz zapisać miejsce dziesiętne lub ciąg znaków:

EEPROM.put(2,'12.67');

To zapisuje dane w wielu lokalizacjach - coś, co byłoby łatwe do napisania samemu, ale mimo to przydatne. Nadal będziesz musiał śledzić, do ilu lokalizacji zostało to napisane, aby przypadkowo nie nadpisać swoich danych! Musisz użyć dostwać metoda ponownego pobrania tych danych:

float f = 0.00f;
EEPROM.get(2, f);

Wartość z get jest przechowywana w pływaku F zmienny. Zwróć uwagę, jak jest to inicjowane za pomocą 0,00f jako wartość. ten F informuje kompilator, że możesz chcieć przechowywać dużą liczbę w tej zmiennej, więc tworzy dodatkowe konfiguracje podczas kompilacji.

ten Dokumentacja EEPROM na Strona Arduino ma dużo więcej przykładów.

Wyrównywanie zużycia

Wyrównywanie zużycia to technika stosowana w celu zmniejszenia zużycia i wydłużenia żywotności EEPROM. Jeśli pracujesz tylko nad małym projektem, nie musisz się tym martwić.

Najprostszą rzeczą, jaką możesz zrobić, aby zachować żywotność EEPROM-u, jest ograniczenie zapisów do określonej lokalizacji. Możesz to zrobić, najpierw odczytując adres, a jeśli wartość, którą chcesz wpisać, jest już obecna, nie ma potrzeby zapisywania jej ponownie (pamiętaj, że odczytanie danych nie zaszkodzi). Oto jak możesz to zrobić:

int safeWrite(int data, address) {
if(EEPROM.read(address) != data) {
EEPROM.write(address, data);
}
}

To dość prosty fragment kodu, ale działa tylko dla liczb całkowitych! Zamiast wymyślać koło na nowo, użyj funkcji wbudowanej w bibliotekę Arduino EEPROM:

EEPROM.update(address, val);

Ta metoda ma dokładnie taki sam podpis jak pisać metoda, chociaż może drastycznie zmniejszyć liczbę potrzebnych zapisów!

Jeśli potrzebujesz zapisać dużo danych i obawiasz się zużycia silikonu, możesz śledzić, ile zapisów wykonujesz, chociaż zużywa to więcej danych. Oto przybliżona implementacja w pseudo kod :

var address = 0
var writeCount = 0
if(writeCount > 75,000)
writeCount = 0
address += 1
EEPROM.write(address, data)

Będziesz musiał przechowywać adres i writeCount w EEPROM (a writeCount będzie musiał być podzielony na lokalizacje adresowe). W większości przypadków ten poziom ochrony nie będzie konieczny. Arduino są również tak tanie, że zakup kopii zapasowej może być łatwiejszy!

Powinieneś teraz wiedzieć wystarczająco dużo, aby tworzyć niesamowite projekty. Daj nam znać, jeśli zrobisz coś fajnego! Czy potrafisz rozpoznać wszystkie urządzenia na zdjęciach? Zostaw nam komentarz poniżej!

Udział Udział Ćwierkać E-mail 5 wskazówek, jak doładować swoje maszyny VirtualBox Linux

Masz dość słabej wydajności oferowanej przez maszyny wirtualne? Oto, co powinieneś zrobić, aby zwiększyć wydajność VirtualBox.

Czytaj dalej
Powiązane tematy
  • majsterkowanie
  • Arduino
  • Elektronika
O autorze Joe Coburn(136 opublikowanych artykułów)

Joe jest absolwentem informatyki na Uniwersytecie w Lincoln w Wielkiej Brytanii. Jest profesjonalnym programistą, a kiedy nie lata dronami ani nie pisze muzyki, często można go spotkać wykonującego zdjęcia lub produkującego filmy.

Więcej od Joe Coburna

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować