Въведение в EEPROM в Arduino

Въведение в EEPROM в Arduino

В тази публикация ще разберем какво е EEPROM, как се съхраняват данните вграден в EEPROM Arduino board’s Микроконтролер, а също и практически тествайте как да пишете и четете данни на EEPROM с няколко примера.



Въведение в EEPROM в Arduino

Защо EEPROM?

Преди да попитаме какво е EEPROM? Много е важно да знаете защо EEPROM се използва за съхранение на първо място. Така че, получаваме ясна представа за EEPROM.

В наши дни има много устройства за съхранение, вариращи от магнитни устройства за съхранение като компютърни твърди дискове, касетофони от стара школа, оптични носители за съхранение като CD, DVD, Blu-ray дискове и SSD памет като SSD (Solid State Drive) за компютри и карти с памет и др.





Това са устройства за масово съхранение, които могат да съхраняват данни като музика, видеоклипове, документи и т.н. от толкова малко, колкото няколко килобайта до няколко терабайта. Това е енергонезависима памет, което означава, че данните могат да бъдат запазени дори след изключване на захранването към носителя за съхранение.

Устройството, което доставя успокояваща музика за ухото или изскачащи видеоклипове, като компютър или смартфон, съхранява някои критични данни като конфигурационни данни, данни за зареждане, пароли, биометрични данни, данни за вход и т.н.



Тези споменати данни не могат да се съхраняват в устройства за масово съхранение от съображения за сигурност, а също така тези данни могат да бъдат модифицирани от потребители неволно, което може да доведе до неизправност на устройството.

Тези данни отнемат само няколко байта до няколко мегабайта, като свързването на конвенционално устройство за съхранение като магнитна или оптична среда към процесорни чипове не е икономически и физически осъществимо.

И така, тези критични данни се съхраняват в самите чипове за обработка.

Arduino не се различава от компютъра или смартфоните. Има няколко обстоятелства, при които трябва да съхраняваме някои критични данни, които не трябва да се изтриват дори след спиране на захранването, например данни от сензора.

Досега бихте имали представа защо ни е необходим EEPROM за микропроцесори и микроконтролери чипове.

Какво е EEPROM?

EEPROM означава електрически изтриваема програмируема памет само за четене. Това също е енергонезависима памет, която може да се чете и пише байт мъдър.

Четенето и писането на ниво байт го прави различен от другите полупроводникови спомени. Например флаш памет: четене, запис и изтриване на данни по блоков начин.

Блокът може да бъде от няколко стотици до хиляди бита, което е възможно за масово съхранение, но не и за операции „Само за четене“ в микропроцесори и микроконтролери, които трябва да получат достъп до байтови данни.

На платката Arduino Uno (ATmega328P) той има на борда 1KB или 1024 байта EEPROM. Всеки байт може да бъде достъпен поотделно, всеки байт има адрес, вариращ от 0 до 1023 (общо 1024).

Адресът (0-1023) е място в паметта, където ще се съхраняват данните ни.

На всеки адрес можете да съхранявате 8-битови данни, цифрови цифри от 0 до 255. Нашите данни се съхраняват в двоична форма, така че ако запишем номер 255 в EEPROM, той ще съхрани цифрата като 11111111 в адрес и ако съхраним нула, ще се съхранява като 00000000.

Можете също да съхранявате текст, специални знаци, буквено-цифрови знаци и др., Като напишете подходяща програма.

Тук не се обсъждат конструктивните детайли и работата, което може да направи тази статия по-дълга и ние може да ви приспи. Насочете се към YouTube или Google, има интересни статии / видеоклипове относно конструкцията и работата на EEPORM.

Не бъркайте EEPROM с EPROM:

Накратко EPROM е електрически програмируема памет само за четене, което означава, че може да се програмира (съхранява памет) електрически, но не може да се изтрие електрически.

Той използва ярък блясък на ултравиолетова светлина над чипа за съхранение, който изтрива съхранените данни. EEPROM дойде като заместител на EPROM и сега почти не се използва в никакви електронни устройства.

Не бъркайте флаш паметта за EEPROM:

Флаш паметта е полупроводникова и енергонезависима памет, която също е електрически изтриваема и електрически програмируема, всъщност флаш паметта е получена от EEPROM. Но блоковият достъп до паметта или с други думи, начинът на памет е достъпен и конструкцията му се различава от EEPROM.

Arduino Uno (микроконтролер ATmega328P) също разполага с 32KB флаш памет за съхранение на програми.

Продължителност на живота на EEPROM:

Както всеки друг електронен носител за съхранение, EEPROM също има краен цикъл на четене, запис, изтриване. Но проблемът е, че има един от най-малкото времетраене в сравнение с всеки друг вид полупроводникова памет.

На EEPROM на Arduino Atmel заяви около 100000 (един лак) цикъл на запис на клетка. Ако стайната ви температура е по-ниска, толкова по-голяма е продължителността на живота на EEPROM.

Моля, обърнете внимание, че четенето на данни от EEPROM не влияе значително на продължителността на живота.

Има външни интегрални схеми EEPROM, които могат да бъдат свързани с Arduino с лекота с капацитет на паметта, вариращ от 8 KB, 128KB, 256 KB и т.н. с продължителност на живота около 1 милион цикли на запис на клетка.

Това завършва EEPROM, сега бихте получили достатъчно теоретични познания за EEPROM.

В следващия раздел ще научим как на практика да тествате EEPROM на arduino.

Как да тествате EEPROM в Arduino

За да приложите това, всичко, от което се нуждаете, е USB кабел и платка Arduino Uno, готови сте за работа.

От горните обяснения разбрахме, че EEPROM имат Адрес, където съхраняваме данните си. Можем да съхраняваме от 0 до 1023 местоположения в Arduino Uno. Всяко място може да побере 8 бита или един байт.

В този пример ще съхраняваме данни в адрес. За да намалим сложността на програмата и да поддържаме програмата възможно най-кратка, ще съхраним едноцифрено цяло число (0 до 9) на адрес от 0 до 9.

Програмен код # 1

Сега качете кода в 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-------------------//

ИЗХОД:

След като кодът бъде качен, отворете серийния монитор.

Той ще ви помоли да въведете адрес, вариращ от 0 до 9. От горния изход, аз въведох адрес 3. И така, ще съхранявам цяла стойност в местоположението (адрес) 3.

Сега ще ви подкани да въведете едноцифрена целочислена стойност, варираща от 0 до 9. От горния изход въведох стойност 5.

И така, сега стойността 5 ще се съхранява на адрес 3.

След като въведете стойността, тя ще я запише в EEPROM.

Той ще покаже съобщение за успех, което означава, че стойността се съхранява.

След няколко секунди ще прочете стойността, която се съхранява на коментирания адрес, и ще покаже стойността на серийния монитор.

В заключение написахме и прочетохме стойностите от EEPROM на микроконтролера на Arduino.

Сега ще използваме EEPROM за съхраняване на парола.

Ще въведем 6-цифрено число (не по-малко или не повече) парола, тя ще се съхранява на 6 различни адреса (всеки адрес за всяка цифра) и един допълнителен адрес за съхранение на „1“ или „0“.

След като въведете паролата, допълнителният адрес ще съхрани стойността „1“, показваща, че паролата е зададена и програмата ще поиска да въведете паролата, за да включите светодиода.

Ако допълнителната съхранена стойност на адреса е „0“ или е налице друга стойност, той ще ви помоли да създадете нова 6-цифрена парола.

По горния метод програмата може да идентифицира дали вече сте задали парола или трябва да създадете нова парола.

Ако въведената парола е правилна, светодиодът за вграждане на щифт № 13 свети, ако въведената парола е неправилна, светодиодът няма да свети и серийният монитор ще извести, че паролата ви е грешна.

Програмен код # 2

Сега качете кода:
//------------------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---------------//

ИЗХОД:

Отворете серийния монитор, той ще ви подкани да създадете 6-цифрена парола.

Въведете 6-цифрена парола и я запишете и натиснете enter. Сега паролата е запазена.

Можете или да натиснете бутона за нулиране, или да изключите USB кабела от компютъра, което прави прекъсването на захранването на платката Arduino.

Сега свържете отново USB кабела, отворете сериен монитор, който ще ви подкани да въведете запазената 6-цифрена парола.

Въведете правилната парола, която светодиодът ще свети.

Ако искате да промените паролата, променете цифрата от кода:

int passExistAdd = 200

Горният ред е допълнителният адрес, който обсъдихме преди. Променете навсякъде от 6 на 1023. 0 до 5 адреса са запазени за съхранение на 6-цифрена парола.

Промяната на този допълнителен адрес ще заблуди програмата, че паролата още не е създадена и ще ви подкани да създадете нова 6-цифрена парола.

Ако имате някакви въпроси относно този урок за EEPROM в Arduino, моля, изразете в коментарите, може да получите бърз отговор.




Предишна: Захранване с прекъснато ток с използване на Arduino Напред: Контролиран от мобилен телефон автомобил-робот, използващ DTMF модул