Giới thiệu về EEPROM trong Arduino

Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề





Trong bài đăng này, chúng ta sẽ hiểu EEPROM là gì, cách dữ liệu được lưu trữ trên EEPROM được xây dựng trên Bảng Arduino của Bộ vi điều khiển và cũng kiểm tra thực tế cách ghi và đọc dữ liệu trên EEPROM bằng một vài ví dụ.

Giới thiệu về EEPROM trong Arduino

Tại sao sử dụng EEPROM?

Trước khi chúng tôi hỏi EEPROM là gì? Điều rất quan trọng là phải biết tại sao EEPROM được sử dụng để lưu trữ ngay từ đầu. Vì vậy, chúng tôi có ý tưởng rõ ràng về EEPROMs.



Ngày nay, có rất nhiều thiết bị lưu trữ có sẵn, từ các thiết bị lưu trữ từ tính như đĩa cứng máy tính, máy ghi băng cassette cũ, phương tiện lưu trữ quang như CD, DVD, đĩa Blu-ray và bộ nhớ trạng thái rắn như SSD (Solid State Drive) cho máy tính và thẻ nhớ, v.v.

Đây là thiết bị lưu trữ dung lượng lớn có thể lưu trữ dữ liệu như nhạc, video, tài liệu, v.v ... từ vài Kilobyte đến nhiều Terabyte. Đây là bộ nhớ không bay hơi, có nghĩa là, dữ liệu có thể được giữ lại ngay cả sau khi ngắt nguồn điện đối với phương tiện lưu trữ.



Thiết bị phát nhạc êm tai hoặc video mãn nhãn như máy tính hoặc điện thoại thông minh lưu trữ một số dữ liệu quan trọng như dữ liệu cấu hình, dữ liệu khởi động, mật khẩu, dữ liệu chỉ số sinh học, dữ liệu đăng nhập, v.v.

Những dữ liệu được đề cập này không thể được lưu trữ trong các thiết bị lưu trữ chung vì lý do bảo mật và những dữ liệu này cũng có thể bị người dùng vô tình sửa đổi có thể dẫn đến sự cố của thiết bị.

Những dữ liệu này chỉ chiếm vài byte đến vài Megabyte, việc kết nối một thiết bị lưu trữ thông thường như phương tiện từ tính hoặc quang học với chip xử lý là không khả thi về mặt kinh tế và vật lý.

Vì vậy, những dữ liệu quan trọng này được lưu trữ trong chính các chip xử lý.

Arduino không khác gì máy tính hoặc điện thoại thông minh. Có một số trường hợp chúng ta cần lưu trữ một số dữ liệu quan trọng không được xóa ngay cả khi đã cắt nguồn, ví dụ dữ liệu cảm biến.

Bây giờ, bạn đã có ý tưởng tại sao chúng ta cần EEPROM trên bộ vi xử lý và chip vi điều khiển.

EEPROM là gì?

EEPROM là viết tắt của Electrically Erasable Programmable Read Only Memory. Nó cũng là một bộ nhớ không thay đổi có thể đọc và ghi byte khôn ngoan.

Đọc và ghi mức byte làm cho nó khác với các bộ nhớ bán dẫn khác. Ví dụ bộ nhớ flash: đọc, ghi và xóa dữ liệu theo cách thức khối.

Một khối có thể có kích thước vài trăm đến hàng nghìn bit, điều này khả thi cho việc lưu trữ hàng loạt, nhưng không khả thi cho các hoạt động “Bộ nhớ chỉ đọc” trong bộ vi xử lý và vi điều khiển, vốn cần truy cập dữ liệu từng byte.

Trên bo mạch Arduino Uno (ATmega328P), nó có trên bo mạch 1KB hoặc 1024 byte EEPROM. Mỗi byte có thể được truy cập riêng lẻ mỗi byte có địa chỉ nằm trong khoảng từ 0 đến 1023 (tổng số đó là 1024).

Địa chỉ (0-1023) là vị trí bộ nhớ nơi dữ liệu của chúng ta sẽ được lưu trữ.

Trên mỗi địa chỉ, bạn có thể lưu trữ dữ liệu 8 bit, các chữ số từ 0 đến 255. Dữ liệu của chúng tôi được lưu trữ ở dạng nhị phân, vì vậy nếu chúng tôi viết số 255 vào EEPROM, nó sẽ lưu trữ chữ số dưới dạng 11111111 trong một địa chỉ và nếu chúng tôi lưu trữ số 0, nó sẽ lưu trữ dưới dạng 00000000.

Bạn cũng có thể lưu trữ văn bản, ký tự đặc biệt, ký tự chữ và số, v.v. bằng cách viết chương trình thích hợp.

Các chi tiết xây dựng và cách làm việc không được thảo luận ở đây có thể làm cho bài viết này dài dòng và chúng tôi có thể khiến bạn buồn ngủ. Hãy hướng tới YouTube hoặc Google, có những bài viết / video thú vị liên quan đến quá trình xây dựng và hoạt động của EEPORM.

Đừng nhầm lẫn EEPROM với EPROM:

Tóm lại, EPROM là Bộ nhớ chỉ đọc có thể lập trình bằng điện, nghĩa là nó có thể được lập trình (bộ nhớ lưu trữ) bằng điện, nhưng không thể xóa bằng điện.

Nó sử dụng sự tỏa sáng của tia cực tím phía trên chip lưu trữ để xóa dữ liệu được lưu trữ. EEPROM thay thế cho EPROM và bây giờ hầu như không được sử dụng trong bất kỳ thiết bị điện tử nào.

Đừng nhầm lẫn Bộ nhớ Flash cho EEPROM:

Bộ nhớ flash là một bộ nhớ bán dẫn và không bay hơi, cũng có thể xóa bằng điện và có thể lập trình bằng điện, trên thực tế bộ nhớ flash có nguồn gốc từ EEPROM. Nhưng cách truy cập bộ nhớ theo khối hay nói cách khác, cách thức truy cập bộ nhớ và cấu tạo của nó khác với EEPROM.

Arduino Uno (Vi điều khiển ATmega328P) cũng có 32KB bộ nhớ flash để lưu trữ chương trình.

Tuổi thọ của EEPROM:

Giống như bất kỳ phương tiện lưu trữ điện tử nào khác, EEPROM cũng có các chu kỳ đọc, ghi, xóa hữu hạn. Nhưng vấn đề là nó có tuổi thọ thấp nhất so với bất kỳ loại bộ nhớ bán dẫn nào khác.

Trên Arduino’s EEPROM, Atmel tuyên bố khoảng 100000 (một lakh) chu kỳ ghi trên mỗi ô. Nếu nhiệt độ phòng của bạn càng thấp thì tuổi thọ của EEPROM càng lớn.

Xin lưu ý rằng việc đọc dữ liệu từ EEPROM không ảnh hưởng đáng kể đến tuổi thọ.

Có các IC EEPROM bên ngoài có thể được giao tiếp với Arduino một cách dễ dàng với dung lượng bộ nhớ từ 8 KB, 128KB, 256 KB, v.v. với tuổi thọ khoảng 1 triệu chu kỳ ghi trên mỗi ô.

Đó là phần kết của EEPROM, bây giờ bạn đã có đủ kiến ​​thức lý thuyết về EEPROM.

Trong phần sau chúng ta sẽ học cách kiểm tra EEPROM trên arduino một cách thực tế.

Cách kiểm tra EEPROM trong Arduino

Để thực hiện điều này, tất cả những gì bạn cần là cáp USB và bo mạch Arduino Uno, bạn đã sẵn sàng.

Từ những giải thích trên, chúng tôi hiểu rằng EEPROMs có Địa chỉ nơi chúng tôi lưu trữ dữ liệu của mình. Chúng tôi có thể lưu trữ từ 0 đến 1023 vị trí trong Arduino Uno. Mỗi vị trí có thể chứa 8 bit hoặc một byte.

Trong ví dụ này, chúng ta sẽ lưu trữ dữ liệu trong một địa chỉ. Để giảm độ phức tạp của chương trình và giữ cho chương trình ngắn nhất có thể, chúng tôi sẽ lưu trữ số nguyên một chữ số (0 đến 9) trên một địa chỉ từ 0 đến 9.

Mã chương trình # 1

Bây giờ, hãy tải mã lên 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-------------------//

ĐẦU RA:

Sau khi mã được tải lên, hãy mở màn hình nối tiếp.

Nó sẽ yêu cầu bạn nhập địa chỉ từ 0 đến 9. Từ đầu ra ở trên, tôi đã nhập địa chỉ 3. Vì vậy, tôi sẽ lưu trữ một giá trị số nguyên trong vị trí (địa chỉ) 3.

Bây giờ, nó sẽ nhắc bạn nhập giá trị số nguyên có một chữ số nằm trong khoảng từ 0 đến 9. Từ kết quả ở trên, tôi đã nhập giá trị 5.

Vì vậy, bây giờ giá trị 5 sẽ được lưu trữ ở vị trí địa chỉ 3.

Sau khi bạn nhập giá trị, nó sẽ ghi giá trị trên EEPROM.

Nó sẽ hiển thị thông báo thành công, có nghĩa là giá trị được lưu trữ.

Sau một vài giây, nó sẽ đọc giá trị được lưu trữ trên địa chỉ đã nhận xét và nó sẽ hiển thị giá trị trên màn hình nối tiếp.

Kết luận, chúng tôi đã viết và đọc các giá trị từ EEPROM của vi điều khiển Arduino.

Bây giờ, chúng ta sẽ sử dụng EEPROM để lưu trữ mật khẩu.

Chúng tôi sẽ nhập một số gồm 6 chữ số (không ít hơn hoặc không nhiều hơn), mật khẩu này sẽ được lưu trữ ở 6 địa chỉ khác nhau (mỗi địa chỉ cho mỗi chữ số) và một địa chỉ bổ sung để lưu trữ “1” hoặc “0”.

Khi bạn nhập mật khẩu, địa chỉ bổ sung sẽ lưu giá trị “1” cho biết mật khẩu đó đã được đặt và chương trình sẽ yêu cầu bạn nhập mật khẩu để BẬT đèn LED.

Nếu địa chỉ bổ sung giá trị được lưu trữ là “0” hoặc bất kỳ giá trị nào khác hiện diện, nó sẽ yêu cầu bạn tạo mật khẩu 6 chữ số mới.

Bằng phương pháp trên, chương trình có thể xác định xem bạn đã đặt mật khẩu hay cần tạo mật khẩu mới.

Nếu mật khẩu đã nhập chính xác, đèn LED tích hợp ở chân số 13 sẽ sáng, nếu mật khẩu đã nhập không chính xác, đèn LED sẽ không phát sáng và màn hình nối tiếp sẽ nhắc rằng mật khẩu của bạn sai.

Mã chương trình # 2

Bây giờ tải lên mã:
//------------------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---------------//

ĐẦU RA:

Mở màn hình nối tiếp, nó sẽ nhắc bạn tạo mật khẩu gồm 6 chữ số.

Nhập mật khẩu 6 chữ số bất kỳ và ghi chú lại và nhấn enter. Bây giờ mật khẩu đã được lưu trữ.

Bạn có thể nhấn nút đặt lại hoặc ngắt kết nối cáp USB khỏi PC, điều này làm cho nguồn cung cấp cho bảng Arduino bị gián đoạn.

Bây giờ, kết nối lại cáp USB, mở màn hình nối tiếp, sẽ nhắc bạn nhập mật khẩu 6 chữ số đã lưu.

Nhập mật khẩu chính xác, đèn LED sẽ phát sáng.

Nếu bạn muốn thay đổi mật khẩu, hãy thay đổi chữ số từ mã:

int passExistAdd = 200

Dòng trên là địa chỉ bổ sung mà chúng ta đã thảo luận trước đây. Thay đổi bất kỳ nơi nào từ 6 đến 1023. Địa chỉ 0 đến 5 được dành riêng để lưu trữ mật khẩu 6 chữ số.

Việc thay đổi địa chỉ bổ sung này sẽ đánh lừa chương trình rằng mật khẩu chưa được tạo và nhắc bạn tạo một mật khẩu 6 chữ số mới.

Nếu bạn có bất kỳ câu hỏi nào liên quan đến EEPROM trong hướng dẫn Arduino này, vui lòng trình bày trong phần nhận xét, bạn có thể nhận được câu trả lời nhanh chóng.




Một cặp: Nguồn điện cắt quá dòng bằng Arduino Tiếp theo: Xe robot điều khiển bằng điện thoại di động sử dụng mô-đun DTMF