מבוא ל- EEPROM בארדואינו

נסה את הכלי שלנו לביטול בעיות





בפוסט זה אנו הולכים להבין מה זה EEPROM, כיצד נשמרים נתונים ב- EEPROM מובנים לוח ארדואינו מיקרו-בקר ובודק למעשה כיצד לכתוב ולקרוא נתונים ב- EEPROM על ידי כמה דוגמאות.

מבוא ל- EEPROM בארדואינו

מדוע EEPROM?

לפני שנשאל מה זה EEPROM? חשוב מאוד לדעת מדוע EEPROM משמש לאחסון מלכתחילה. אז, אנו מקבלים מושג ברור על EEPROMs.



יש הרבה התקני אחסון זמינים בימינו, החל ממכשירי אחסון מגנטיים כמו דיסקים קשיחים למחשב, קלטות קלטות מבית הספר הישן, מדיום אחסון אופטי כמו תקליטורים, DVD, דיסקי Blu-ray וזיכרון מצב מוצק כמו SSD (Solid State Drive) עבור מחשבים וכרטיסי זיכרון וכו '.

מדובר במכשיר אחסון המוני אשר יכול לאחסן נתונים כגון מוסיקה, קטעי וידאו, מסמכים וכו 'החל ממעט קילובייט ועד רב טרה-בתים. מדובר בזיכרון לא נדיף, כלומר הנתונים יכולים להישמר גם לאחר ניתוק החשמל למדיום האחסון.



המכשיר המספק מוסיקה מרגיעה באוזן או קטעי וידאו מנקרי עיניים כמו מחשב או טלפון חכם אוגר נתונים קריטיים כגון נתוני תצורה, נתוני אתחול, סיסמאות, נתונים ביולוגיים, נתוני כניסה וכו '

לא ניתן לאחסן את הנתונים המוזכרים הללו בהתקני אחסון המוניים מטעמי אבטחה, וניתן יהיה לשנות נתונים אלה על ידי המשתמשים שלא בכוונה, דבר שעלול להוביל לתקלה בהתקן.

נתונים אלה לוקחים בתים ספורים למספר מגה-בייט, וחיבור התקן אחסון קונבנציונאלי כמו מדיום מגנטי או אופטי לשבבי מעבדים אינו אפשרי מבחינה כלכלית ופיזית.

אז, נתונים קריטיים אלה נשמרים בשבבי העיבוד עצמם.

הארדואינו אינו שונה ממחשבים או סמארטפונים. ישנן מספר נסיבות בהן אנו צריכים לאחסן נתונים קריטיים שאסור להימחק גם לאחר ניתוק החשמל, למשל נתוני חיישנים.

עד עכשיו היית מקבל מושג מדוע אנו זקוקים ל- EEPROM במיקרו-מעבדים ובשבבי מיקרו-בקרים.

מה זה EEPROM?

EEPROM מייצג זיכרון קריאה בלבד לתכנות המחיק באמצעות חשמל. זהו גם זיכרון שאינו נדיף אשר ניתן לקרוא ולכתוב חכם בתים.

קריאה וכתיבה ברמת בתים הופכת אותה לשונה מזיכרונות מוליכים למחצה אחרים. לדוגמא זיכרון פלאש: קריאה, כתיבה ומחיקה של נתונים בצורה חסימתית.

בלוק יכול להיות כמה מאות עד אלפי סיביות, מה שאפשר לאחסון המוני, אך לא לפעולות 'זיכרון קריאה בלבד' במיקרו-מעבדים ובמיקרו-בקרים, שצריכים לגשת לנתונים בתים בתים.

על לוח Arduino Uno (ATmega328P) יש לו לוח 1KB או 1024 בתים של EEPROM. ניתן לגשת לכל בייט באופן אינדיבידואלי לכל בית יש כתובת שנע בין 0 ל -1023 (זה סך הכל 1024).

כתובת (0-1023) היא מיקום זיכרון שבו הנתונים יאוחסנו.

בכל כתובת תוכלו לאחסן נתונים של 8 סיביות, ספרות מספריות מ -0 עד 255. הנתונים שלנו נשמרים בצורה בינארית, כך שאם אנו כותבים את המספר 255 ל- EEPROM הם יאחסנו את הספרה כ- 11111111 בכתובת ואם נשמור אפס, הוא יאוחסן כ- 00000000.

ניתן גם לאחסן טקסט, תווים מיוחדים, תווים אלפאנומריים וכו 'על ידי כתיבת תוכנית מתאימה.

פרטי הבנייה והעבודה לא נדונים כאן, מה שעשוי להאריך את המאמר הזה ואנחנו עשויים לגרום לך לישון. עבור לכיוון YouTube או גוגל, יש מאמרים / סרטונים מעניינים בנוגע לבנייה ולעבודה של EEPORM.

אל תבלבל את EEPROM עם EPROM:

בקצרה, EPROM הוא זיכרון לקריאה בלבד לתכנות חשמלי, כלומר ניתן לתכנת אותו (לאחסן זיכרון) באופן חשמלי, אך לא ניתן למחוק אותו באופן חשמלי.

הוא מנצל ברק בהיר של אור אולטרה סגול מעל שבב האחסון שמוחק את הנתונים המאוחסנים. EEPROM הגיע כתחליף ל- EPROM וכעת כמעט ולא נעשה בו שימוש במכשירים אלקטרוניים כלשהם.

אל תבלבל בין זיכרון פלאש ל- EEPROM:

זיכרון פלאש הוא מוליך למחצה וזיכרון שאינו נדיף אשר גם ניתן למחיקה חשמלית וניתן לתכנות חשמלית, למעשה זיכרון פלאש נגזר מ- EEPROM. אבל גישה לזיכרון חסום או במילים אחרות, דרך הזיכרון ניגשת והבנייה שלה שונה מ- EEPROM.

Arduino Uno (מיקרו-בקר ATmega328P) כולל גם 32KB זיכרון פלאש לאחסון תוכניות.

אורך חיים של EEPROM:

כמו כל אמצעי אחסון אלקטרוני אחר, ל- EEPROM יש גם מחזורי קריאה, כתיבה, מחיקה סופיים. אבל הבעיה היא שיש לה את אורך החיים הנמוך ביותר בהשוואה לכל סוג אחר של זיכרון מוליכים למחצה.

ב- EEPROM של ארדואינו, אטמל טען כ- 100,000 (אחד לאק) מחזור כתיבה לכל תא. אם טמפרטורת החדר שלך נמוכה יותר ככל שאורך החיים של EEPROM גדול יותר.

שים לב שקריאת נתונים מ- EEPROM אינה משפיעה באופן משמעותי על תוחלת החיים.

ישנם מכשירי EEPROM חיצוניים הניתנים לממשק Arduino בקלות עם יכולת זיכרון הנעה בין 8 KB, 128 KB, 256 KB וכו 'עם אורך חיים של כמיליון מחזורי כתיבה לכל תא.

זה מסכם את ה- EEPROM, עכשיו הייתם צוברים מספיק ידע תיאורטי על EEPROMs.

בחלק הבא נלמד כיצד לבדוק את ה- EEPROM על ארדואינו באופן מעשי.

כיצד לבדוק EEPROM בארדואינו

כדי ליישם זאת, כל מה שאתה צריך הוא כבל USB ולוח Arduino Uno, אתה מוכן לצאת לדרך.

מההסברים לעיל הבנו כי ל- EEPROM יש כתובת בה אנו מאחסנים את הנתונים שלנו. אנו יכולים לאחסן 0 עד 1023 מיקומים בארדואינו אונו. כל מיקום יכול להכיל 8 סיביות או בת אחד.

בדוגמה זו אנו הולכים לאחסן נתונים בכתובת. כדי להפחית את מורכבות התוכנית וכדי לשמור על התוכנית קצרה ככל האפשר, אנו נאחסן מספר שלם חד ספרתי (0 עד 9) בכתובת מ -0 עד 9.

קוד התוכנית מס '1

כעת העלה את הקוד לארדואינו:
//------------------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 של המיקרו-בקר של ארדואינו.

כעת אנו נשתמש ב- EEPROM לאחסון סיסמה.

אנו נכניס סיסמה עם מספר 6 ספרות (לא פחות או יותר), היא תישמר ב 6 כתובות שונות (כל כתובת לכל ספרה) וכתובת נוספת אחת לאחסון '1' או '0'.

לאחר שתזין את הסיסמה, הכתובת הנוספת תשמור את הערך '1' המציין שהסיסמה הוגדרה והתוכנית תבקש ממך להזין את הסיסמה כדי להדליק את נורית הנורית.

אם הערך הנוסף המאוחסן בכתובת הנו '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 ספרות ורשום אותה ולחץ על Enter. כעת הסיסמה נשמרה.

באפשרותך ללחוץ על כפתור האיפוס או לנתק את כבל ה- USB מהמחשב, מה שמפריע לאספקה ​​ללוח Arduino.

כעת, חבר מחדש את כבל ה- USB, פתח את המסך הטורי, שינחה אותך להזין את הסיסמה ששמרת.

הזן את הסיסמה הנכונה נורית הנורית.

אם ברצונך לשנות את הסיסמה שנה את הספרה מהקוד:

int passExistAdd = 200

השורה לעיל היא הכתובת הנוספת עליה דנו קודם. שנה מקום בין 6 ל 1023. 0 עד 5 כתובות שמורה לאחסון סיסמה בת 6 ספרות.

שינוי כתובת נוספת זו ישלה את התוכנית שהסיסמה עדיין לא נוצרה ותבקש ממך ליצור סיסמה חדשה בת 6 ספרות.

אם יש לך שאלות לגבי EEPROM זה במדריך בארדואינו, אנא הביע בתגובות, ייתכן שתקבל תשובה מהירה.




קודם: על ספק כוח מנותק הנוכחי באמצעות Arduino הבא: מכונית רובוט נשלטת בטלפון נייד באמצעות מודול DTMF