Úvod do EEPROM v Arduinu

Vyzkoušejte Náš Nástroj Pro Odstranění Problémů





V tomto příspěvku pochopíme, co je to EEPROM, jak jsou data uložena na vestavěné EEPROM Desky Arduino Mikrokontrolér a také prakticky vyzkouší, jak zapisovat a číst data na EEPROM na několika příkladech.

Úvod do EEPROM v Arduinu

Proč EEPROM?

Než se zeptáme, co je EEPROM? Je velmi důležité vědět, proč se EEPROM používá pro ukládání dat. Abychom dostali jasnou představu o EEPROM.



V dnešní době je k dispozici spousta úložných zařízení, od magnetických úložných zařízení, jako jsou pevné disky počítačů, kazetové magnetofony staré školy, optická paměťová média jako CD, DVD, Blu-ray disky a polovodičová paměť jako SSD (Solid State Drive) pro počítače a paměťové karty atd.

Jedná se o velkokapacitní paměťové zařízení, které dokáže ukládat data, jako je hudba, videa, dokumenty atd., Od pouhých několika kilobajtů po multi-terabajty. Jedná se o energeticky nezávislou paměť, což znamená, že data lze uchovat i po přerušení napájení paměťového média.



Zařízení, které dodává uši uklidňující hudbu nebo videa, která praskají v očích, jako je počítač nebo smartphone, ukládá některá důležitá data, jako jsou konfigurační data, bootovací data, hesla, biometrická data, přihlašovací data atd.

Uvedená data nelze z bezpečnostních důvodů uložit do velkokapacitních paměťových zařízení a také tato data mohou uživatelé neúmyslně upravit, což by mohlo vést k poruše zařízení.

Tato data zabírají jen několik bajtů až několik megabajtů, takže připojení běžného paměťového zařízení, jako je magnetické nebo optické médium, k procesorovým čipům není ekonomicky ani fyzicky proveditelné.

Tato kritická data jsou tedy uložena v samotných procesorových čipech.

Arduino se neliší od počítače nebo smartphonu. Existuje několik okolností, kdy musíme uložit některá kritická data, která se nesmí vymazat ani po vypnutí napájení, například data senzoru.

Nyní byste měli představu, proč potřebujeme EEPROM na mikroprocesorech a čipech mikrokontrolérů.

Co je EEPROM?

EEPROM znamená elektricky mazatelnou programovatelnou paměť pouze pro čtení. Je to také energeticky nezávislá paměť, kterou lze číst a zapisovat bajt moudrý.

Čtením a zápisem na úrovni bajtů se liší od ostatních polovodičových pamětí. Například flash paměť: čtení, zápis a mazání dat blokovým způsobem.

Blok může mít několik stovek až tisíců bitů, což je možné pro velkokapacitní úložiště, ale ne pro operace „Read Only Memory“ v mikroprocesorech a mikrokontrolérech, které potřebují přistupovat k bajtům po bajtových datech.

Na desce Arduino Uno (ATmega328P) má na desce 1 kB nebo 1024 bajtů EEPROM. Ke každému bajtu lze přistupovat jednotlivě. Každý bajt má adresu v rozsahu od 0 do 1023 (to je celkem 1024).

Adresa (0-1023) je paměťové místo, kde budou uložena naše data.

Na každou adresu můžete uložit 8bitová data, číselné číslice od 0 do 255. Naše data jsou uložena v binární podobě, takže pokud zapíšeme číslo 255 do EEPROM, uloží číslici jako 11111111 na adresu a pokud uložíme nulu, uloží se jako 00000000.

Můžete také uložit text, speciální znaky, alfanumerické znaky atd. Napsáním příslušného programu.

Podrobnosti o konstrukci a fungování zde nejsou popsány, což by mohlo tento článek zdlouhavě vést a my bychom vás mohli ospalý. Vydejte se na YouTube nebo Google, existují zajímavé články / videa týkající se konstrukce a fungování EEPORM.

Nezaměňujte EEPROM s EPROM:

Stručně řečeno, EPROM je elektricky programovatelná paměť pouze pro čtení, což znamená, že ji lze programovat (ukládat do paměti) elektricky, ale nelze ji elektricky mazat.

Využívá jasný lesk ultrafialového světla nad čipem úložiště, který vymaže uložená data. EEPROM přišel jako náhrada za EPROM a nyní se téměř nepoužívá v žádném elektronickém zařízení.

Nezaměňujte Flash paměť pro EEPROM:

Flash paměť je polovodičová a energeticky nezávislá paměť, která je také elektricky mazatelná a elektricky programovatelná, ve skutečnosti je flash paměť odvozena z EEPROM. Blokový přístup do paměti nebo jinými slovy způsob přístupu do paměti a jeho konstrukce se liší od EEPROM.

Arduino Uno (mikrokontrolér ATmega328P) také obsahuje 32 kB flash paměti pro ukládání programů.

Životnost EEPROM:

Jako každé jiné elektronické paměťové médium má EEPROM také konečné cykly čtení, zápisu a mazání. Ale problém je, že má jednu z nejmenších životností ve srovnání s jakýmkoli jiným druhem polovodičové paměti.

Na Arduino EEPROM Atmel požadoval přibližně 100 000 (jeden lakh) cyklus zápisu na buňku. Pokud je vaše pokojová teplota nižší, tím větší je životnost EEPROM.

Pamatujte, že čtení dat z EEPROM nijak výrazně neovlivňuje životnost.

Existují externí integrované obvody EEPROM, které lze snadno propojit s Arduino s kapacitou paměti od 8 kB, 128 kB, 256 kB atd. S životností přibližně 1 milion cyklů zápisu na buňku.

Tím končí EEPROM, nyní byste získali dostatek teoretických znalostí o EEPROM.

V následující části se naučíme, jak prakticky otestovat EEPROM na arduino.

Jak testovat EEPROM v Arduinu

K implementaci potřebujete pouze kabel USB a desku Arduino Uno, jste připraveni jít.

Z výše uvedených vysvětlení jsme pochopili, že EEPROM mají adresu, kam ukládáme naše data. V Arduino Uno můžeme uložit 0 až 1023 míst. Každé umístění může obsahovat 8 bitů nebo jeden bajt.

V tomto příkladu budeme ukládat data na adresu. Abychom snížili složitost programu a udrželi program co nejkratší, budeme ukládat jednociferné celé číslo (0 až 9) na adresu od 0 do 9.

Programový kód # 1

Nyní nahrajte kód do Arduina:
//------------------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-------------------//

VÝSTUP:

Po nahrání kódu otevřete sériový monitor.

Požádá vás o zadání adresy v rozsahu od 0 do 9. Z výše uvedeného výstupu jsem zadal adresu 3. Takže do umístění (adresy) 3 uložím celočíselnou hodnotu.

Nyní vás vyzve k zadání jednociferné celočíselné hodnoty v rozsahu od 0 do 9. Z výše uvedeného výstupu jsem zadal hodnotu 5.

Takže nyní bude hodnota 5 uložena v umístění adresy 3.

Jakmile zadáte hodnotu, zapíše ji na EEPROM.

Zobrazí se zpráva o úspěchu, což znamená, že hodnota je uložena.

Po několika sekundách přečte hodnotu, která je uložena na komentované adrese, a zobrazí ji na sériovém monitoru.

Na závěr jsme napsali a načetli hodnoty z EEPROM mikrokontroléru Arduino.

Nyní použijeme EEPROM pro ukládání hesla.

Budeme zadávat šestimístné číslo (ne méně ani více) hesla, které bude uloženo na 6 různých adresách (každá adresa pro každou číslici) a jednu další adresu pro uložení „1“ nebo „0“.

Jakmile zadáte heslo, další adresa uloží hodnotu „1“, což znamená, že heslo je nastaveno, a program vás vyzve k zadání hesla pro rozsvícení LED.

Pokud je uložená hodnota další adresy „0“ nebo existuje jiná hodnota, požádá vás o vytvoření nového šestimístného hesla.

Podle výše uvedené metody může program zjistit, zda jste již nastavili heslo nebo potřebujete vytvořit nové heslo.

Pokud je zadané heslo správné, LED dioda zabudovaná na kolíku č. 13 svítí, pokud je zadané heslo nesprávné, dioda LED nesvítí a sériový monitor vás vyzve k zadání nesprávného hesla.

Programový kód # 2

Nyní nahrajte kód:
//------------------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---------------//

VÝSTUP:

Otevřete sériový monitor, který vás vyzve k vytvoření šestimístného číselného hesla.

Zadejte libovolné šestimístné heslo, poznamenejte si ho a stiskněte klávesu Enter. Nyní bylo heslo uloženo.

Můžete buď stisknout resetovací tlačítko nebo odpojit kabel USB od počítače, což způsobí přerušení napájení desky Arduino.

Nyní znovu připojte kabel USB, otevřete sériový monitor, který vás vyzve k zadání uloženého šestimístného hesla.

Zadejte správné heslo, LED bude svítit.

Chcete-li změnit heslo, změňte číslici z kódu:

int passExistAdd = 200

Výše uvedený řádek je další adresa, o které jsme diskutovali dříve. Změňte kdekoli od 6 do 1023. 0 až 5 adres je vyhrazeno pro ukládání šestimístného hesla.

Změna této dodatečné adresy ošálí program, že heslo ještě není vytvořeno, a vyzve vás k vytvoření nového šestimístného hesla.

Pokud máte nějaké dotazy týkající se této EEPROM v tutoriálu Arduino, vyjádřete prosím v komentářích, můžete obdržet rychlou odpověď.




Předchozí: Nadproudový odpojovací zdroj napájení pomocí Arduina Další: Robotické auto řízené mobilním telefonem pomocí modulu DTMF