Wprowadzenie do EEPROM w Arduino

Wypróbuj Nasz Instrument Do Eliminowania Problemów





W tym poście zrozumiemy, czym jest EEPROM, jak dane są przechowywane w wbudowanej pamięci EEPROM Płytka Arduino Mikrokontroler, a także praktycznie przetestuj, jak zapisywać i odczytywać dane w EEPROM na kilku przykładach.

Wprowadzenie do EEPROM w Arduino

Dlaczego EEPROM?

Zanim zapytamy, czym jest EEPROM? Bardzo ważne jest, aby wiedzieć, dlaczego EEPROM jest używany do przechowywania w pierwszej kolejności. W ten sposób otrzymujemy jasny obraz pamięci EEPROM.



Obecnie dostępnych jest wiele urządzeń pamięci masowej, począwszy od magnetycznych urządzeń magazynujących, takich jak dyski twarde komputerowe, magnetofony kasetowe starej szkoły, optyczne nośniki danych, takie jak płyty CD, DVD, dyski Blu-ray i pamięci półprzewodnikowe, takie jak SSD (Solid State Drive) dla komputery i karty pamięci itp.

Są to urządzenia pamięci masowej, które mogą przechowywać dane, takie jak muzyka, filmy, dokumenty itp. Od zaledwie kilku kilobajtów do wielu terabajtów. Są to pamięć nieulotna, co oznacza, że ​​dane mogą być zachowane nawet po odcięciu zasilania nośnika danych.



Urządzenie, które dostarcza kojącą dla ucha muzykę lub przykuwające wzrok filmy, takie jak komputer lub smartfon, przechowuje niektóre krytyczne dane, takie jak dane konfiguracyjne, dane rozruchowe, hasła, dane biometryczne, dane logowania itp.

Powyższe dane nie mogą być przechowywane w urządzeniach pamięci masowej ze względów bezpieczeństwa, a także dane te mogą zostać niezamierzone zmodyfikowane przez użytkowników, co może doprowadzić do nieprawidłowego działania urządzenia.

Dane te zajmują od kilku bajtów do kilku megabajtów, więc podłączenie konwencjonalnego urządzenia pamięci masowej, takiego jak nośnik magnetyczny lub optyczny, do chipów procesora nie jest ekonomicznie i fizycznie wykonalne.

Tak więc te krytyczne dane są przechowywane w samych chipach przetwarzających.

Arduino nie różni się niczym od komputera czy smartfonów. Istnieje kilka okoliczności, w których musimy przechowywać niektóre krytyczne dane, których nie można usunąć nawet po odcięciu zasilania, na przykład dane z czujników.

Do tej pory miałbyś pomysł, dlaczego potrzebujemy EEPROM na mikroprocesorach i chipach mikrokontrolerów.

Co to jest EEPROM?

EEPROM oznacza elektrycznie kasowalną programowalną pamięć tylko do odczytu. Jest to również pamięć nieulotna, którą można odczytywać i zapisywać bajt mądry.

Czytanie i zapisywanie na poziomie bajtów różni się od innych pamięci półprzewodnikowych. Na przykład pamięć flash: odczytywanie, zapisywanie i kasowanie danych w sposób blokowy.

Blok może mieć od kilkuset do tysięcy bitów, co jest możliwe w przypadku pamięci masowej, ale nie w przypadku operacji „Pamięć tylko do odczytu” w mikroprocesorach i mikrokontrolerach, które wymagają dostępu do danych bajt po bajcie.

Na płycie Arduino Uno (ATmega328P) ma na pokładzie 1KB lub 1024 bajty pamięci EEPROM. Dostęp do każdego bajtu można uzyskać osobno, każdy bajt ma adres z zakresu od 0 do 1023 (czyli łącznie 1024).

Adres (0-1023) to lokalizacja pamięci, w której będą przechowywane nasze dane.

Na każdym adresie można zapisać 8-bitowe dane, cyfry od 0 do 255. Nasze dane są przechowywane w postaci binarnej, więc jeśli wpiszemy numer 255 do pamięci EEPROM, zapisze cyfrę jako 11111111 w adresie, a jeśli zapiszemy zero, będzie przechowywać jako 00000000.

Możesz również przechowywać tekst, znaki specjalne, znaki alfanumeryczne itp., Pisząc odpowiedni program.

Szczegóły konstrukcyjne i działanie nie są tutaj omawiane, co może wydłużyć ten artykuł i sprawić, że będziesz senny. Skieruj się w stronę YouTube lub Google, są ciekawe artykuły / filmy dotyczące budowy i działania EEPORM.

Nie myl EEPROM z EPROM:

Krótko mówiąc, EPROM jest elektrycznie programowalną pamięcią tylko do odczytu, co oznacza, że ​​można ją programować (przechowywać pamięć) elektrycznie, ale nie można jej wymazać elektrycznie.

Wykorzystuje jasny połysk światła ultrafioletowego nad układem pamięci, który usuwa zapisane dane. EEPROM przyszedł jako zamiennik EPROM i obecnie prawie nie jest używany w żadnych urządzeniach elektronicznych.

Nie należy mylić pamięci Flash z EEPROM:

Pamięć flash jest pamięcią półprzewodnikową i nieulotną, która jest również kasowalna elektrycznie i programowalna elektrycznie, w rzeczywistości pamięć flash pochodzi z EEPROM. Ale dostęp do pamięci blokowy lub innymi słowy, sposób dostępu do pamięci jest dostępny, a jego konstrukcja różni się od EEPROM.

Arduino Uno (mikrokontroler ATmega328P) ma również 32KB pamięci flash do przechowywania programów.

Żywotność EEPROM:

Jak każdy inny elektroniczny nośnik pamięci, EEPROM ma również skończone cykle odczytu, zapisu i kasowania. Ale problem polega na tym, że ma ona jedną z najmniejszych żywotności w porównaniu z innymi rodzajami pamięci półprzewodnikowej.

W pamięci EEPROM Arduino Atmel stwierdził około 100000 (jeden lakh) cykli zapisu na komórkę. Im niższa temperatura w pomieszczeniu, tym dłuższa żywotność pamięci EEPROM.

Należy pamiętać, że odczyt danych z EEPROM nie wpływa znacząco na żywotność.

Istnieją zewnętrzne układy scalone EEPROM, które można z łatwością połączyć z Arduino z pojemnością pamięci od 8 KB, 128 KB, 256 KB itp. O żywotności około 1 miliona cykli zapisu na komórkę.

Na tym kończy się pamięć EEPROM, teraz zdobyłbyś wystarczającą wiedzę teoretyczną na temat pamięci EEPROM.

W poniższej sekcji dowiemy się, jak praktycznie przetestować EEPROM na arduino.

Jak przetestować EEPROM w Arduino

Aby to zaimplementować, wszystko czego potrzebujesz to kabel USB i płytka Arduino Uno, jesteś gotowy do pracy.

Z powyższych wyjaśnień wynika, że ​​pamięci EEPROM mają adres, pod którym przechowujemy nasze dane. W Arduino Uno możemy przechowywać od 0 do 1023 lokalizacji. Każda lokalizacja może zawierać 8 bitów lub jeden bajt.

W tym przykładzie będziemy przechowywać dane w adresie. Aby zmniejszyć złożoność programu i aby program był jak najkrótszy, będziemy przechowywać jednocyfrową liczbę całkowitą (od 0 do 9) pod adresem od 0 do 9.

Kod programu nr 1

Teraz prześlij kod do Arduino:
//------------------Program Developed by R.GIRISH-------------------//
#include
int inputAddress = 0
int inputValue = 0
int ReadData = 0
boolean Readadd = true
boolean Readval = true
void setup()
{
Serial.begin(9600)
Serial.println('Enter the address (0 to 9)')
Serial.println('')
while(Readadd)
{
inputAddress = Serial.read()
if(inputAddress > 0)
{
inputAddress = inputAddress - 48
Readadd = false
}
}
Serial.print('You have selected Address: ')
Serial.println(inputAddress)
Serial.println('')
delay(2000)
Serial.println('Enter the value to be stored (0 to 9)')
Serial.println('')
while(Readval)
{
inputValue = Serial.read()
if(inputValue > 0)
{
inputValue = inputValue - 48
Readval = false
}
}
Serial.print('The value you entered is: ')
Serial.println(inputValue)
Serial.println('')
delay(2000)
Serial.print('It will be stored in Address: ')
Serial.println(inputAddress)
Serial.println('')
delay(2000)
Serial.println('Writing on EEPROM.....')
Serial.println('')
EEPROM.write(inputAddress, inputValue)
delay(2000)
Serial.println('Value stored successfully!!!')
Serial.println('')
delay(2000)
Serial.println('Reading from EEPROM....')
delay(2000)
ReadData = EEPROM.read(inputAddress)
Serial.println('')
Serial.print('The value read from Address ')
Serial.print(inputAddress)
Serial.print(' is: ')
Serial.println(ReadData)
Serial.println('')
delay(1000)
Serial.println('Done!!!')
}
void loop()
{
// DO nothing here.
}
//------------------Program Developed by R.GIRISH-------------------//

WYNIK:

Po przesłaniu kodu otwórz monitor szeregowy.

Poprosi Cię o wpisanie adresu z zakresu od 0 do 9. Z powyższego wyjścia wpisałem adres 3. Tak więc będę przechowywać wartość całkowitą w lokalizacji (adres) 3.

Teraz wyświetli się monit o wprowadzenie jednocyfrowej liczby całkowitej z zakresu od 0 do 9. Z powyższego wyniku wprowadziłem wartość 5.

Tak więc teraz wartość 5 zostanie zapisana w adresie lokalizacji 3.

Po wprowadzeniu wartości zapisze wartość w pamięci EEPROM.

Wyświetli komunikat o powodzeniu, co oznacza, że ​​wartość jest przechowywana.

Po kilku sekundach odczyta wartość, która jest przechowywana pod komentowanym adresem i pokaże tę wartość na monitorze szeregowym.

Podsumowując, napisaliśmy i odczytaliśmy wartości z pamięci EEPROM mikrokontrolera Arduino.

Teraz będziemy używać pamięci EEPROM do przechowywania hasła.

Będziemy wprowadzać 6-cyfrowe hasło (nie mniej lub więcej), będzie ono przechowywane pod 6 różnymi adresami (każdy adres dla każdej cyfry) i jeden dodatkowy adres do przechowywania „1” lub „0”.

Po wprowadzeniu hasła, dodatkowy adres zapisze wartość „1”, co oznacza, że ​​hasło zostało ustawione, a program poprosi o wprowadzenie hasła w celu zaświecenia diody.

Jeśli dodatkowa zapisana wartość adresu to „0” lub jakakolwiek inna wartość jest obecna, poprosi Cię o utworzenie nowego 6-cyfrowego hasła.

W powyższy sposób program może zidentyfikować, czy już ustawiłeś hasło, czy też potrzebujesz utworzyć nowe hasło.

Jeśli wprowadzone hasło jest poprawne, wbudowana dioda LED na styku nr 13 zaświeci się, jeśli wprowadzone hasło jest nieprawidłowe, dioda LED nie będzie się świecić, a monitor szeregowy wyświetli komunikat, że hasło jest nieprawidłowe.

Kod programu nr 2

Teraz prześlij kod:
//------------------Program Developed by R.GIRISH---------------//
#include
int passExistAdd = 200
const int LED = 13
int inputAddress = 0
int word1 = 0
int word2 = 0
int word3 = 0
int word4 = 0
int word5 = 0
int word6 = 0
int wordAddress1 = 0
int wordAddress2 = 1
int wordAddress3 = 2
int wordAddress4 = 3
int wordAddress5 = 4
int wordAddress6 = 5
int passwordExist = 0
boolean ReadVal1 = true
boolean ReadVal2 = true
boolean ReadVal3 = true
boolean ReadVal4 = true
boolean ReadVal5 = true
boolean ReadVal6 = true
int checkWord1 = 0
int checkWord2 = 0
int checkWord3 = 0
int checkWord4 = 0
int checkWord5 = 0
int checkWord6 = 0
void setup()
{
Serial.begin(9600)
pinMode(LED, OUTPUT)
digitalWrite(LED, LOW)
passwordExist = EEPROM.read(passExistAdd)
if(passwordExist != 1)
{
Serial.println('Enter a new 6 number password:')
while(ReadVal1)
{
word1 = Serial.read()
if(word1 > 0)
{
word1 = word1 - 48
ReadVal1 = false
}
}
while(ReadVal2)
{
word2 = Serial.read()
if(word2 > 0)
{
word2 = word2 - 48
ReadVal2 = false
}
}
while(ReadVal3)
{
word3 = Serial.read()
if(word3 > 0)
{
word3 = word3 - 48
ReadVal3 = false
}
}
while(ReadVal4)
{
word4 = Serial.read()
if(word4 > 0)
{
word4 = word4 - 48
ReadVal4 = false
}
}
while(ReadVal5)
{
word5 = Serial.read()
if(word5 > 0)
{
word5 = word5 - 48
ReadVal5 = false
}
}
while(ReadVal6)
{
word6 = Serial.read()
if(word6 > 0)
{
word6 = word6 - 48
ReadVal6 = false
}
}
Serial.println('')
Serial.print(word1)
Serial.print(word2)
Serial.print(word3)
Serial.print(word4)
Serial.print(word5)
Serial.print(word6)
EEPROM.write(wordAddress1, word1)
EEPROM.write(wordAddress2, word2)
EEPROM.write(wordAddress3, word3)
EEPROM.write(wordAddress4, word4)
EEPROM.write(wordAddress5, word5)
EEPROM.write(wordAddress6, word6)
EEPROM.write(passExistAdd,1)
Serial.println(' Password saved Sucessfully!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
if(passwordExist == 1)
{
Serial.println('')
Serial.println('Please enter the 6 digit number password:')
while(ReadVal1)
{
word1 = Serial.read()
if(word1 > 0)
{
word1 = word1 - 48
ReadVal1 = false
}
}
while(ReadVal2)
{
word2 = Serial.read()
if(word2 > 0)
{
word2 = word2 - 48
ReadVal2 = false
}
}
while(ReadVal3)
{
word3 = Serial.read()
if(word3 > 0)
{
word3 = word3 - 48
ReadVal3 = false
}
}
while(ReadVal4)
{
word4 = Serial.read()
if(word4 > 0)
{
word4 = word4 - 48
ReadVal4 = false
}
}
while(ReadVal5)
{
word5 = Serial.read()
if(word5 > 0)
{
word5 = word5 - 48
ReadVal5 = false
}
}
while(ReadVal6)
{
word6 = Serial.read()
if(word6 > 0)
{
word6 = word6 - 48
ReadVal6 = false
}
}
checkWord1 = EEPROM.read(wordAddress1)
if(checkWord1 != word1)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord2 = EEPROM.read(wordAddress2)
if(checkWord2 != word2)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord3 = EEPROM.read(wordAddress3)
if(checkWord3 != word3)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord4 = EEPROM.read(wordAddress4)
if(checkWord4 != word4)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord5 = EEPROM.read(wordAddress5)
if(checkWord5 != word5)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord6 = EEPROM.read(wordAddress6)
if(checkWord6 != word6)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
digitalWrite(LED, HIGH)
Serial.println('')
Serial.println('LED is ON')
Serial.println('')
Serial.println('Press Reset Button.')
}
}
void loop()
{
}
//------------------Program Developed by R.GIRISH---------------//

WYNIK:

Otwórz monitor szeregowy, a wyświetli się monit o utworzenie 6-cyfrowego hasła.

Wprowadź dowolne 6-cyfrowe hasło, zapisz je i naciśnij enter. Teraz hasło zostało zapisane.

Możesz wcisnąć przycisk reset lub odłączyć kabel USB od komputera, co spowoduje przerwanie zasilania płyty Arduino.

Teraz podłącz ponownie kabel USB, otwórz monitor szeregowy, który wyświetli monit o wprowadzenie zapisanego 6-cyfrowego hasła.

Wprowadź prawidłowe hasło, dioda LED zaświeci się.

Jeśli chcesz zmienić hasło zmień cyfrę z kodu:

int passExistAdd = 200

Powyższa linia to dodatkowy adres, o którym rozmawialiśmy wcześniej. Zmień dowolną liczbę z 6 na 1023. Adresy od 0 do 5 są zarezerwowane do przechowywania 6-cyfrowego hasła.

Zmiana tego dodatkowego adresu oszuka program, że hasło nie zostało jeszcze utworzone i wyświetli monit o utworzenie nowego 6-cyfrowego hasła.

Jeśli masz jakieś pytania dotyczące tej pamięci EEPROM w samouczku Arduino, wyrażaj w komentarzach, możesz otrzymać szybką odpowiedź.




Poprzedni: Nadmierne odcięcie zasilania za pomocą Arduino Dalej: Robot samochodowy sterowany telefonem komórkowym za pomocą modułu DTMF