Εισαγωγή στο EEPROM στο Arduino

Δοκιμάστε Το Όργανο Μας Για Την Εξάλειψη Των Προβλημάτων





Σε αυτήν την ανάρτηση θα καταλάβουμε τι είναι το EEPROM, πώς αποθηκεύονται τα δεδομένα ενσωματωμένα στο EEPROM Πίνακας Arduino Μικροελεγκτής και επίσης πρακτικά δοκιμάστε πώς να γράφετε και να διαβάζετε δεδομένα στο EEPROM με μερικά παραδείγματα.

Εισαγωγή στο EEPROM στο Arduino

Γιατί το EEPROM;

Πριν ρωτήσουμε τι είναι το EEPROM; Είναι πολύ σημαντικό να γνωρίζουμε γιατί το EEPROM χρησιμοποιείται για αποθήκευση στην πρώτη θέση. Έτσι, έχουμε ξεκάθαρη ιδέα για τα EEPROM.



Υπάρχουν πολλές διαθέσιμες συσκευές αποθήκευσης αυτές τις μέρες, που κυμαίνονται από μαγνητικές συσκευές αποθήκευσης όπως σκληρούς δίσκους υπολογιστών, μαγνητοταινίες κασέτας παλιού σχολείου, οπτικό μέσο αποθήκευσης όπως CD, DVD, δίσκους Blu-ray και μνήμη στερεάς κατάστασης όπως SSD (Solid State Drive) για υπολογιστές και κάρτες μνήμης κ.λπ.

Πρόκειται για μια συσκευή μαζικής αποθήκευσης που μπορεί να αποθηκεύσει δεδομένα όπως μουσική, βίντεο, έγγραφα κ.λπ. από μόλις λίγα Kilobytes έως multi-Terabytes. Αυτές είναι μη πτητικές μνήμες που σημαίνει, τα δεδομένα μπορούν να διατηρηθούν ακόμη και μετά τη διακοπή της τροφοδοσίας στο μέσο αποθήκευσης.



Η συσκευή που παρέχει καταπραϋντική μουσική ή βίντεο που αναβλύζουν τα μάτια, όπως υπολογιστής ή smartphone αποθηκεύει ορισμένα κρίσιμα δεδομένα, όπως δεδομένα διαμόρφωσης, δεδομένα εκκίνησης, κωδικούς πρόσβασης, δεδομένα βιομετρικών δεδομένων, δεδομένα σύνδεσης κ.λπ.

Αυτά τα αναφερόμενα δεδομένα δεν μπορούν να αποθηκευτούν σε συσκευές μαζικής αποθήκευσης για λόγους ασφαλείας και επίσης αυτά τα δεδομένα θα μπορούσαν να τροποποιηθούν ακούσια από χρήστες που θα μπορούσαν να οδηγήσουν σε δυσλειτουργία της συσκευής.

Αυτά τα δεδομένα χρειάζονται μόνο λίγα byte σε λίγα Megabyte, ενώ η σύνδεση μιας συμβατικής συσκευής αποθήκευσης όπως μαγνητικό ή οπτικό μέσο με επεξεργαστές δεν είναι εφικτή από οικονομική και φυσική άποψη.

Έτσι, αυτά τα κρίσιμα δεδομένα αποθηκεύονται στα ίδια τα τσιπ επεξεργασίας.

Το Arduino δεν διαφέρει από τον υπολογιστή ή τα smartphone. Υπάρχουν αρκετές περιπτώσεις όπου πρέπει να αποθηκεύσουμε ορισμένα κρίσιμα δεδομένα που δεν πρέπει να διαγραφούν ακόμη και μετά τη διακοπή ισχύος, για παράδειγμα δεδομένα αισθητήρα.

Μέχρι τώρα, θα είχατε μια ιδέα γιατί χρειαζόμαστε το EEPROM σε μικροεπεξεργαστές και μικροελεγκτές.

Τι είναι το EEPROM;

Το EEPROM σημαίνει Ηλεκτρικά Διαγράψιμη Προγραμματιζόμενη Μνήμη Μόνο για Ανάγνωση. Είναι επίσης μια μη πτητική μνήμη που μπορεί να διαβαστεί και να γραφτεί byte σοφό.

Η ανάγνωση και η γραφή byte-level το κάνουν διαφορετικό από άλλες αναμνήσεις ημιαγωγών. Για παράδειγμα, μνήμη flash: ανάγνωση, εγγραφή και διαγραφή δεδομένων κατά τρόπο μπλοκ.

Ένα μπλοκ μπορεί να είναι μερικές εκατοντάδες έως χιλιάδες bits, κάτι που είναι εφικτό για μαζική αποθήκευση, αλλά όχι για λειτουργίες 'Μνήμη μόνο για ανάγνωση' σε μικροεπεξεργαστές και μικροελεγκτές, οι οποίες πρέπει να έχουν πρόσβαση σε δεδομένα byte byte.

Στην πλακέτα Arduino Uno (ATmega328P) διαθέτει 1KB ή 1024 byte EEPROM. Μπορείτε να έχετε πρόσβαση σε κάθε byte ξεχωριστά, κάθε byte έχει διεύθυνση που κυμαίνεται από 0 έως 1023 (δηλαδή 1024 σύνολο).

Η διεύθυνση (0-1023) είναι μια θέση μνήμης όπου θα αποθηκευτούν τα δεδομένα μας.

Σε κάθε διεύθυνση μπορείτε να αποθηκεύσετε δεδομένα 8-bit, αριθμητικά ψηφία από 0 έως 255. Τα δεδομένα μας αποθηκεύονται σε δυαδική μορφή, οπότε αν γράψουμε τον αριθμό 255 στο EEPROM θα αποθηκεύσει το ψηφίο ως 11111111 σε μια διεύθυνση και αν αποθηκεύσουμε μηδέν, θα αποθηκεύσει ως 00000000.

Μπορείτε επίσης να αποθηκεύσετε κείμενο, ειδικούς χαρακτήρες, αλφαριθμητικούς χαρακτήρες κ.λπ. γράφοντας το κατάλληλο πρόγραμμα.

Οι λεπτομέρειες κατασκευής και η εργασία δεν συζητούνται εδώ που μπορεί να κάνουν αυτό το άρθρο μακρά και μπορεί να σας κάνουμε υπνηλία. Προχωρήστε προς το YouTube ή το Google, υπάρχουν ενδιαφέροντα άρθρα / βίντεο σχετικά με την κατασκευή και την εργασία της EEPORM.

Μην συγχέετε το EEPROM με το EPROM:

Με λίγα λόγια, το EPROM είναι μια ηλεκτρικά προγραμματιζόμενη μνήμη μόνο για ανάγνωση που σημαίνει ότι μπορεί να προγραμματιστεί (αποθήκευση μνήμης) ηλεκτρικά, αλλά δεν μπορεί να διαγραφεί ηλεκτρικά.

Χρησιμοποιεί έντονη λάμψη υπεριώδους φωτός πάνω από το τσιπ αποθήκευσης που διαγράφει τα αποθηκευμένα δεδομένα. Το EEPROM ήρθε ως αντικατάσταση του EPROM και τώρα σχεδόν δεν χρησιμοποιείται σε καμία ηλεκτρονική συσκευή.

Μην συγχέετε τη μνήμη Flash για το EEPROM:

Η μνήμη flash είναι ημιαγωγός και μη πτητική μνήμη που είναι επίσης ηλεκτρικά διαγράψιμη και ηλεκτρικά προγραμματιζόμενη, στην πραγματικότητα η μνήμη flash προέρχεται από την EEPROM. Όμως, η πρόσβαση στη μνήμη κατά μπλοκ ή με άλλα λόγια, προσπελάζεται ο τρόπος μνήμης και η κατασκευή της διαφέρει από την EEPROM.

Το Arduino Uno (ATmega328P Microcontroller) διαθέτει επίσης 32KB μνήμης flash για αποθήκευση προγραμμάτων.

Διάρκεια ζωής του EEPROM:

Όπως οποιοδήποτε άλλο ηλεκτρονικό μέσο αποθήκευσης, το EEPROM διαθέτει επίσης πεπερασμένους κύκλους ανάγνωσης, εγγραφής, διαγραφής. Αλλά το πρόβλημα είναι ότι έχει μία από τις λιγότερες διάρκεια ζωής σε σύγκριση με οποιαδήποτε άλλη μνήμη ημιαγωγών.

Στο EEPROM του Arduino, ο Atmel διεκδίκησε περίπου 100000 κύκλους εγγραφής ανά κελί. Εάν η θερμοκρασία του δωματίου σας είναι χαμηλότερη, τόσο μεγαλύτερη είναι η διάρκεια ζωής του EEPROM.

Λάβετε υπόψη ότι η ανάγνωση δεδομένων από το EEPROM δεν επηρεάζει σημαντικά τη διάρκεια ζωής.

Υπάρχουν εξωτερικά IC EEPROM που μπορούν να διασυνδεθούν με ευκολία το Arduino με χωρητικότητα μνήμης που κυμαίνεται από 8 KB, 128KB, 256 KB κ.λπ. με διάρκεια ζωής περίπου 1 εκατομμύριο κύκλους εγγραφής ανά κελί.

Αυτό ολοκληρώνει το EEPROM, τώρα θα έχετε αποκτήσει αρκετές θεωρητικές γνώσεις για τα EEPROM.

Στην παρακάτω ενότητα θα μάθουμε πώς να δοκιμάζουμε πρακτικά το EEPROM στο arduino.

Πώς να δοκιμάσετε το EEPROM στο Arduino

Για να το εφαρμόσετε, το μόνο που χρειάζεστε είναι ένα καλώδιο USB και μια πλακέτα Arduino Uno, είστε έτοιμοι να πάτε.

Από τις παραπάνω εξηγήσεις καταλάβαμε ότι τα EEPROM έχουν Διεύθυνση όπου αποθηκεύουμε τα δεδομένα μας. Μπορούμε να αποθηκεύσουμε 0 έως 1023 τοποθεσίες στο Arduino Uno. Κάθε τοποθεσία μπορεί να φιλοξενήσει 8-bit ή ένα byte.

Σε αυτό το παράδειγμα πρόκειται να αποθηκεύσουμε δεδομένα σε μια διεύθυνση. Για να μειώσουμε την πολυπλοκότητα του προγράμματος και να διατηρήσουμε το πρόγραμμα όσο το δυνατόν πιο σύντομο, θα αποθηκεύσουμε μονοψήφιο ακέραιο αριθμό (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' υποδεικνύοντας ότι ο κωδικός πρόσβασης έχει οριστεί και το πρόγραμμα θα σας ζητήσει να εισαγάγετε τον κωδικό πρόσβασης για να ανάψετε το LED.

Εάν η πρόσθετη αποθηκευμένη διεύθυνση είναι '0' ή υπάρχει οποιαδήποτε άλλη τιμή, θα σας ζητήσει να δημιουργήσετε νέο 6ψήφιο κωδικό πρόσβασης.

Με την παραπάνω μέθοδο, το πρόγραμμα μπορεί να προσδιορίσει εάν έχετε ήδη ορίσει έναν κωδικό πρόσβασης ή πρέπει να δημιουργήσετε έναν νέο κωδικό πρόσβασης.

Εάν ο κωδικός πρόσβασης που έχετε εισαγάγει είναι σωστός, το LED ενσωματωμένο στο pin # 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