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

Попробуйте наш инструмент устранения неполадок





В этом посте мы собираемся понять, что такое EEPROM, как данные хранятся во встроенной EEPROM на Платы Arduino Микроконтроллер, а также практически проверить, как писать и читать данные в EEPROM, на паре примеров.

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

Почему EEPROM?

Прежде чем мы спросим, ​​что такое EEPROM? Очень важно знать, почему EEPROM используется для хранения в первую очередь. Итак, мы получили четкое представление о EEPROM.



В наши дни доступно множество устройств хранения, начиная от магнитных запоминающих устройств, таких как компьютерные жесткие диски, кассетных магнитофонов старой школы, оптических носителей, таких как компакт-диски, DVD, диски Blu-ray, и твердотельной памяти, такой как SSD (твердотельный накопитель) для компьютеры и карты памяти и т. д.

Это запоминающие устройства большой емкости, которые могут хранить такие данные, как музыка, видео, документы и т. Д., От нескольких килобайт до нескольких терабайт. Это энергонезависимая память, что означает, что данные могут быть сохранены даже после отключения питания носителя данных.



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

Эти упомянутые данные не могут быть сохранены на устройствах массовой памяти по соображениям безопасности, а также эти данные могут быть изменены пользователями непреднамеренно, что может привести к неисправности устройства.

Эти данные занимают от нескольких байтов до нескольких мегабайт, поэтому подключение обычного запоминающего устройства, такого как магнитный или оптический носитель, к микросхемам процессора экономически и физически нецелесообразно.

Таким образом, эти важные данные хранятся в самих микросхемах обработки.

Arduino ничем не отличается от компьютера или смартфона. Есть несколько обстоятельств, когда нам нужно сохранить некоторые важные данные, которые не должны стираться даже после отключения питания, например данные датчиков.

К настоящему времени вы бы уже поняли, зачем нам EEPROM на микропроцессорах и микросхемах микроконтроллеров.

Что такое EEPROM?

EEPROM означает электрически стираемую программируемую постоянную память. Это также энергонезависимая память, которую можно читать и писать. побайтно.

Чтение и запись байтового уровня отличает его от других полупроводниковых запоминающих устройств. Например, флеш-память: чтение, запись и стирание данных по блокам.

Блок может содержать от нескольких сотен до тысяч бит, что возможно для запоминающих устройств большой емкости, но не для операций «только для чтения» в микропроцессорах и микроконтроллерах, которым необходим побайтный доступ к данным.

На плате Arduino Uno (ATmega328P) имеется 1 КБ или 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) также поддерживает 32 КБ флэш-памяти для хранения программ.

Срок службы EEPROM:

Как и любой другой электронный носитель данных, EEPROM также имеет конечные циклы чтения, записи и стирания. Но проблема в том, что у нее один из наименьших срок службы по сравнению с любым другим типом полупроводниковой памяти.

В EEPROM Arduino Atmel требовал около 100000 (один лакх) цикла записи на ячейку. Если ваша комнатная температура ниже, тем больше срок службы EEPROM.

Обратите внимание, что чтение данных из EEPROM не влияет существенно на срок службы.

Существуют внешние микросхемы EEPROM, которые могут быть легко связаны с Arduino с объемом памяти от 8 КБ, 128 КБ, 256 КБ и т. Д. Со сроком службы около 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-значный пароль.

Введите правильный пароль, светодиод будет гореть.

Если вы хотите изменить пароль, измените цифру кода:

интервал passExistAdd = 200

Вышеупомянутая строка - это дополнительный адрес, который мы обсуждали ранее. Измените любое значение от 6 до 1023. Адреса от 0 до 5 зарезервированы для хранения 6-значного пароля.

Изменение этого дополнительного адреса введет в заблуждение программу, что пароль еще не создан, и предложит вам создать новый 6-значный пароль.

Если у вас есть какие-либо вопросы относительно этого руководства по EEPROM в Arduino, пожалуйста, укажите в комментариях, вы можете получить быстрый ответ.




Предыдущая статья: Блок питания с отключением по току с использованием Arduino Следующая статья: Автомобиль-робот, управляемый мобильным телефоном, с использованием модуля DTMF