Introduktion till EEPROM i Arduino

Prova Vårt Instrument För Att Eliminera Problem





I det här inlägget kommer vi att förstå vad EEPROM är, hur data lagras på inbyggd EEPROM på Arduino styrelse Microcontroller och testa också praktiskt hur man skriver och läser data på EEPROM med ett par exempel.

Introduktion till EEPROM i Arduino

Varför EEPROM?

Innan vi frågar vad EEPROM är? Det är mycket viktigt att veta varför EEPROM används för lagring i första hand. Så att vi får en klar uppfattning om EEPROM.



Det finns många lagringsenheter tillgängliga idag, allt från magnetiska lagringsenheter som datorhårddiskar, kassettbandspelare från old school, optiskt lagringsmedium som CD-skivor, DVD-skivor, Blu-ray-skivor och solid state-minne som SSD (Solid State Drive) för datorer och minneskort etc.

Dessa är masslagringsenheter som kan lagra data som musik, videor, dokument etc. från så lite som få kilobyte till flera terabyte. Dessa är icke-flyktigt minne vilket innebär att data kan behållas även efter att strömmen har stängts av till lagringsmediet.



Enheten som levererar öronavslappnande musik eller ögonpoppande videor som dator eller smartphone lagrar kritiska data som konfigurationsdata, startdata, lösenord, biometriska data, inloggningsdata etc.

Dessa nämnda data kan inte lagras i masslagringsenheter av säkerhetsskäl och även dessa data kan modifieras av användare oavsiktligt vilket kan leda till fel på enheten.

Dessa data tar bara få byte till få megabyte, och det är inte ekonomiskt och fysiskt möjligt att ansluta en konventionell lagringsenhet som magnetiskt eller optiskt medium till processorchips.

Så dessa kritiska data lagras i själva processchipsen.

Arduino skiljer sig inte från dator eller smartphones. Det finns flera omständigheter där vi behöver lagra kritiska data som inte får raderas även efter att strömmen är avstängd, till exempel sensordata.

Nu skulle du ha fått en aning varför behöver vi EEPROM på mikroprocessorer och mikrokontrollermarker.

Vad är EEPROM?

EEPROM står för Electrically Erasable Programmable Read Only Memory. Det är också ett icke-flyktigt minne som kan läsas och skrivas byte klokt.

Att läsa och skriva på byte-nivå gör det annorlunda än andra halvledarminnen. Till exempel flashminne: läsa, skriva och radera data på ett blockmässigt sätt.

Ett block kan vara några hundra till tusentals bitar, vilket är möjligt för masslagring, men inte för 'Read Only Memory' -operationer i mikroprocessorer och mikrokontroller, som behöver komma åt byte-byte-data.

På Arduino Uno-kort (ATmega328P) har den ombord 1 KB eller 1024 byte EEPROM. Varje byte kan nås individuellt. Varje byte har en adress som sträcker sig från 0 till 1023 (det är totalt 1024).

Adress (0-1023) är en minnesplats där våra data kommer att lagras.

På varje adress kan du lagra 8-bitars data, numeriska siffror från 0 till 255. Våra data lagras i binär form, så om vi skriver nummer 255 i EEPROM kommer den att lagra siffran som 11111111 i en adress och om vi lagrar noll, den kommer att lagras som 00000000.

Du kan också lagra text, specialtecken, alfanumeriska tecken etc. genom att skriva lämpligt program.

Konstruktionsdetaljerna och arbetet diskuteras inte här, vilket kan göra den här artikeln lång och vi kan göra dig sömnig. Gå mot YouTube eller Google, det finns intressanta artiklar / videor om konstruktion och arbete med EEPORM.

Blanda inte EEPROM med EPROM:

I ett nötskal är EPROM ett elektriskt programmerbart skrivskyddat minne vilket betyder att det kan programmeras (lagra minne) elektriskt men inte kan raderas elektriskt.

Den använder starkt sken av ultraviolett ljus ovanför lagringschipet som raderar lagrad data. EEPROM kom som ersättning för EPROM och används knappast i några elektroniska enheter.

Förväxla inte Flash-minne för EEPROM:

Ett flashminne är ett halvledarminne och icke-flyktigt minne som också är elektriskt raderbart och elektriskt programmerbart, i själva verket härrör flashminne från EEPROM. Men den blockvisa minnesåtkomsten eller med andra ord åtkomst till minnet och dess konstruktion skiljer sig från EEPROM.

Arduino Uno (ATmega328P Microcontroller) har också 32KB flashminne för programlagring.

Livslängd för EEPROM:

Liksom alla andra elektroniska lagringsmedier har EEPROM också ändliga läs-, skriv-, raderingscykler. Men problemet är att det har en av de minsta livslängderna jämfört med någon annan typ av halvledarminne.

På Arduinos EEPROM hävdade Atmel cirka 100000 (en lakh) skrivcykel per cell. Om din rumstemperatur är lägre desto längre är EEPROMs livslängd.

Observera att läsning av data från EEPROM inte påverkar livslängden väsentligt.

Det finns externa EEPROM IC: er som enkelt kan anslutas Arduino med minneskapacitet från 8 KB, 128KB, 256 KB etc. med en livslängd på cirka 1 miljon skrivcykler per cell.

Det avslutar EEPROM, nu skulle du ha fått tillräckligt med teoretisk kunskap om EEPROM.

I följande avsnitt lär vi oss hur man testar EEPROM på arduino praktiskt taget.

Hur man testar EEPROM i Arduino

För att genomföra detta är allt du behöver en USB-kabel och Arduino Uno-kort, du är redo att gå.

Från ovanstående förklaringar förstod vi att EEPROM har adress där vi lagrar våra data. Vi kan lagra 0 till 1023 platser i Arduino Uno. Varje plats har plats för 8 bitar eller en byte.

I det här exemplet ska vi lagra data i en adress. För att minska programmets komplexitet och för att hålla programmet kort som möjligt ska vi lagra ensiffrigt heltal (0 till 9) på en adress från 0 till 9.

Programkod 1

Ladda nu upp koden till 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-------------------//

PRODUKTION:

När koden har laddats upp, öppna den seriella bildskärmen.

Det kommer att fråga dig att ange adress som sträcker sig från 0 till 9. Från ovanstående utmatning har jag angett adress 3. Så jag kommer att lagra ett heltal på platsen (adress) 3.

Nu kommer det att uppmana dig att ange ett ensiffrigt heltal som sträcker sig från 0 till 9. Från ovanstående utdata har jag angett värde 5.

Så nu kommer värdet 5 att lagras på adressplatsen 3.

När du väl har angett värdet skriver det värdet på EEPROM.

Det visar ett framgångsmeddelande, vilket innebär att värdet är lagrat.

Efter några sekunder kommer det att läsa av värdet som är lagrat på den kommenterade adressen och det kommer att visa värdet på den seriella bildskärmen.

Sammanfattningsvis har vi skrivit och läst värdena från EEPROM för Arduinos mikrokontroller.

Nu ska vi använda EEPROM för att lagra lösenord.

Vi kommer att ange ett lösenord med 6 siffror (inte mindre eller mer), det kommer att lagras i 6 olika adresser (varje adress för varje siffra) och en ytterligare adress för att lagra '1' eller '0'.

När du har angett lösenordet kommer den extra adressen att spara värdet “1” som indikerar att lösenordet är inställt och programmet kommer att be dig att ange lösenordet för att tända PÅ lysdioden.

Om det extra adresslagrade värdet är “0” eller något annat värde finns kommer det att be dig att skapa ett nytt 6-siffrigt lösenord.

Genom ovanstående metod kan programmet identifiera om du redan har ställt in ett lösenord eller behöver skapa ett nytt lösenord.

Om det angivna lösenordet är korrekt lyser den inbyggda lysdioden vid stift nr 13, om det angivna lösenordet är felaktigt lyser inte lysdioden och den seriella bildskärmen uppmanar att ditt lösenord är fel.

Programkod # 2

Ladda nu upp koden:
//------------------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---------------//

PRODUKTION:

Öppna den seriella bildskärmen så uppmanas du att skapa ett lösenord med 6 siffror.

Ange valfritt sexsiffrigt lösenord och anteckna det och tryck på Enter. Nu har lösenordet lagrats.

Du kan antingen trycka på återställningsknappen eller koppla bort USB-kabeln från datorn, vilket gör att leveransen till Arduino-kortet avbryts.

Anslut nu USB-kabeln igen, öppna den seriella bildskärmen, som uppmanar dig att ange det sparade 6-siffriga lösenordet.

Ange rätt lösenord som lysdioden lyser.

Om du vill ändra lösenordet ska du ändra siffran från koden:

int passExistAdd = 200

Ovanstående rad är den ytterligare adress som vi diskuterade tidigare. Ändra var som helst från 6 till 1023. 0 till 5 adresser är reserverade för att lagra sexsiffrigt lösenord.

Om du ändrar denna ytterligare adress lurar programmet att lösenordet inte har skapats ännu och uppmanar dig att skapa ett nytt sexsiffrigt lösenord.

Om du har några frågor angående denna EEPROM i Arduino-handledning, vänligen uttryck i kommentarerna, du kan få ett snabbt svar.




Tidigare: Över strömavbrott med Arduino Nästa: Mobiltelefonstyrd robotbil med DTMF-modul