รู้เบื้องต้นเกี่ยวกับ EEPROM ใน Arduino

ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา





ในโพสต์นี้เราจะมาทำความเข้าใจว่า EEPROM คืออะไรข้อมูลถูกจัดเก็บอย่างไรใน EEPROM ในตัว บอร์ด Arduino ไมโครคอนโทรลเลอร์และทดสอบวิธีการเขียนและอ่านข้อมูลบน EEPROM ด้วยตัวอย่างสองสามตัวอย่าง

รู้เบื้องต้นเกี่ยวกับ EEPROM ใน Arduino

ทำไมต้อง EEPROM

ก่อนที่เราจะถามว่า EEPROM คืออะไร? เป็นสิ่งสำคัญมากที่จะต้องทราบว่าเหตุใดจึงใช้ EEPROM ในการจัดเก็บข้อมูลตั้งแต่แรก ดังนั้นเราจึงมีแนวคิดที่ชัดเจนเกี่ยวกับ EEPROM



ปัจจุบันมีอุปกรณ์จัดเก็บข้อมูลจำนวนมากตั้งแต่อุปกรณ์จัดเก็บข้อมูลแม่เหล็กเช่นฮาร์ดดิสก์ของคอมพิวเตอร์เครื่องบันทึกเทปคาสเซ็ตแบบเก่าสื่อเก็บข้อมูลแบบออปติคัลเช่นซีดีดีวีดีดิสก์บลูเรย์และหน่วยความจำโซลิดสเตตเช่น SSD (Solid State Drive) สำหรับ คอมพิวเตอร์และการ์ดหน่วยความจำเป็นต้น

อุปกรณ์เหล่านี้เป็นอุปกรณ์จัดเก็บข้อมูลขนาดใหญ่ที่สามารถจัดเก็บข้อมูลเช่นเพลงวิดีโอเอกสาร ฯลฯ ได้ตั้งแต่ระดับต่ำสุดเพียงไม่กี่กิโลไบต์ไปจนถึงหลายเทราไบต์ หน่วยความจำเหล่านี้เป็นหน่วยความจำที่ไม่ลบเลือนซึ่งหมายความว่าข้อมูลสามารถเก็บรักษาไว้ได้แม้จะตัดไฟไปยังสื่อจัดเก็บข้อมูลแล้วก็ตาม



อุปกรณ์ที่ให้เสียงเพลงที่สบายหูหรือวิดีโอที่ทำให้ตากระตุกเช่นคอมพิวเตอร์หรือสมาร์ทโฟนจะจัดเก็บข้อมูลสำคัญบางอย่างเช่นข้อมูลการกำหนดค่าข้อมูลการบูตรหัสผ่านข้อมูลไบโอเมตริกข้อมูลการเข้าสู่ระบบเป็นต้น

ข้อมูลที่กล่าวถึงเหล่านี้ไม่สามารถจัดเก็บในอุปกรณ์จัดเก็บข้อมูลขนาดใหญ่ได้ด้วยเหตุผลด้านความปลอดภัยและข้อมูลเหล่านี้อาจถูกแก้ไขโดยผู้ใช้โดยไม่ได้ตั้งใจซึ่งอาจทำให้อุปกรณ์ทำงานผิดปกติได้

ข้อมูลเหล่านี้ใช้เวลาเพียงไม่กี่ไบต์จนถึงไม่กี่เมกะไบต์การเชื่อมต่ออุปกรณ์จัดเก็บข้อมูลทั่วไปเช่นสื่อแม่เหล็กหรือออปติคอลกับชิปประมวลผลนั้นไม่สามารถทำได้ทั้งทางเศรษฐกิจและทางกายภาพ

ดังนั้นข้อมูลสำคัญเหล่านี้จึงถูกเก็บไว้ในชิปประมวลผลเอง

Arduino ไม่ต่างจากคอมพิวเตอร์หรือสมาร์ทโฟน มีหลายสถานการณ์ที่เราจำเป็นต้องจัดเก็บข้อมูลสำคัญบางอย่างซึ่งจะต้องไม่ถูกลบแม้ว่าระบบจะถูกตัดออกไปแล้วก็ตามเช่นข้อมูลเซ็นเซอร์

ตอนนี้คุณคงพอจะเข้าใจแล้วว่าทำไมเราถึงต้องการ EEPROM บนไมโครโปรเซสเซอร์และชิปไมโครคอนโทรลเลอร์

EEPROM คืออะไร?

EEPROM ย่อมาจาก Electrically Erasable Programmable Read Only Memory นอกจากนี้ยังเป็นหน่วยความจำที่ไม่ลบเลือนซึ่งสามารถอ่านและเขียนได้ ไบต์ฉลาด

การอ่านและเขียนระดับไบต์ทำให้แตกต่างจากความทรงจำเซมิคอนดักเตอร์อื่น ๆ ตัวอย่างเช่นหน่วยความจำแฟลช: การอ่านเขียนและลบข้อมูลในลักษณะที่ชาญฉลาด

บล็อกอาจมีขนาดไม่กี่ร้อยถึงหลายพันบิตซึ่งเป็นไปได้สำหรับการจัดเก็บข้อมูลจำนวนมาก แต่ไม่ใช่สำหรับการดำเนินการ 'หน่วยความจำอ่านอย่างเดียว' ในไมโครโปรเซสเซอร์และไมโครคอนโทรลเลอร์ซึ่งจำเป็นต้องเข้าถึงข้อมูลแบบไบต์ต่อไบต์

บนบอร์ด 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 Microcontroller) ยังมีหน่วยความจำแฟลช 32KB สำหรับจัดเก็บโปรแกรม

อายุการใช้งานของ EEPROM:

เช่นเดียวกับสื่อจัดเก็บข้อมูลอิเล็กทรอนิกส์อื่น ๆ EEPROM ยังมีวงจรการอ่านเขียนลบแบบ จำกัด แต่ปัญหาคือมันมีอายุการใช้งานน้อยที่สุดเมื่อเทียบกับหน่วยความจำเซมิคอนดักเตอร์ประเภทอื่น ๆ

ใน EEPROM ของ Arduino Atmel อ้างว่ามีวงจรการเขียนประมาณ 100,000 (หนึ่งแสน) ต่อเซลล์ หากอุณหภูมิห้องของคุณต่ำลงอายุการใช้งานของ EEPROM ก็จะยิ่งมากขึ้น

โปรดทราบว่าการอ่านข้อมูลจาก EEPROM ไม่ส่งผลต่ออายุการใช้งานอย่างมีนัยสำคัญ

มี EEPROM IC ภายนอกซึ่งสามารถเชื่อมต่อกับ 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’s

ตอนนี้เราจะใช้ EEPROM สำหรับเก็บรหัสผ่าน

เราจะป้อนรหัสผ่าน 6 หลัก (ไม่น้อยกว่าหรือไม่มีเลย) รหัสผ่านจะถูกเก็บไว้ในที่อยู่ 6 ที่แตกต่างกัน (แต่ละที่อยู่สำหรับแต่ละหลัก) และที่อยู่เพิ่มเติมอีกหนึ่งรายการสำหรับจัดเก็บ“ 1” หรือ“ 0”

เมื่อคุณป้อนรหัสผ่านที่อยู่เพิ่มเติมจะจัดเก็บค่า“ 1” ซึ่งระบุว่ารหัสผ่านถูกตั้งค่าและโปรแกรมจะขอให้คุณป้อนรหัสผ่านเพื่อเปิดไฟ LED

หากค่าที่อยู่เพิ่มเติมที่จัดเก็บไว้คือ“ 0” หรือมีค่าอื่นอยู่ระบบจะขอให้คุณสร้างรหัสผ่าน 6 หลักใหม่

ด้วยวิธีการข้างต้นโปรแกรมสามารถระบุได้ว่าคุณได้ตั้งรหัสผ่านไว้แล้วหรือต้องการสร้างรหัสผ่านใหม่

หากรหัสผ่านที่ป้อนถูกต้องไฟ LED ที่ขา # 13 จะสว่างขึ้นหากรหัสผ่านที่ป้อนไม่ถูกต้อง LED จะไม่ติดสว่างและจอภาพอนุกรมจะแจ้งว่ารหัสผ่านของคุณไม่ถูกต้อง

รหัสโปรแกรม # 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 หลักที่บันทึกไว้

ป้อนรหัสผ่านที่ถูกต้องไฟ LED จะติดสว่าง

หากคุณต้องการเปลี่ยนรหัสผ่านให้เปลี่ยนตัวเลขจากรหัส:

int passExistAdd = 200

บรรทัดด้านบนคือที่อยู่เพิ่มเติมที่เราได้พูดคุยกันก่อนหน้านี้ เปลี่ยนที่ใดก็ได้จาก 6 ถึง 1023 ที่อยู่ 0 ถึง 5 ถูกสงวนไว้สำหรับเก็บรหัสผ่าน 6 หลัก

การเปลี่ยนที่อยู่เพิ่มเติมนี้จะหลอกโปรแกรมว่ายังไม่ได้สร้างรหัสผ่านและแจ้งให้คุณสร้างรหัสผ่าน 6 หลักใหม่

หากคุณมีคำถามใด ๆ เกี่ยวกับ EEPROM ในบทช่วยสอน Arduino โปรดแสดงความคิดเห็นคุณอาจได้รับคำตอบอย่างรวดเร็ว




คู่ของ: แหล่งจ่ายไฟตัดกระแสเกินโดยใช้ Arduino ถัดไป: รถหุ่นยนต์ควบคุมโทรศัพท์มือถือโดยใช้โมดูล DTMF