Hoe Arduino EEPROM te gebruiken om gegevens tussen stroomcycli op te slaan

Hoe Arduino EEPROM te gebruiken om gegevens tussen stroomcycli op te slaan

Wist je dat de Arduino gegevens kan opslaan als hij is uitgeschakeld? Niet de schets die in het flashgeheugen is opgeslagen. Ik heb het over variabele gegevens in de EEPROM. Ga met me mee terwijl ik je laat zien hoe je erin kunt lezen en schrijven, en wat het voor je projecten kan betekenen.





Als Arduino nieuw voor je is, bekijk dan zeker onze beginners gids .





Wat is EEPROM?

EEPROM staat voor elektrisch verwijderbaar programmeerbaar leesbaar geheugen . Het is een soort niet-vluchtig geheugen. Maak je geen zorgen als je niet begrijpt wat dat betekent. Het slaat eenvoudig gegevens op, zelfs als de stroom is verwijderd (in tegenstelling tot RAM , die elektriciteit nodig heeft om gegevens vast te houden).





EEPROM is ingebouwd in een groot aantal processors, zoals de field-programmable gate array (FPGA) die wordt gebruikt in de Matrix Creator Pi HAT. Alle Arduino's hebben EEPROM beschikbaar, maar de capaciteit verschilt per model. Zorg ervoor dat je onze koopgids bekijkt voor meer informatie over elk bord.

Hoe werkt het?

EEPROM wordt elektrisch gewist en geprogrammeerd met behulp van: Fowler-Nordheim tunneling . U hoeft de technische details niet te kennen om het te kunnen gebruiken. Het uitgangspunt is dat elektriciteit wordt gebruikt om de binaire gegevens (wat is binair) te veranderen. Het kan elektronisch worden gelezen, gewist en herschreven.



Gelukkig is de Arduino-taal maakt het gemakkelijk om gegevens te wijzigen, en dat allemaal zonder een diploma in informatica.

Levensverwachting

Hoewel het gemakkelijk is om EEPROM in de Arduino te gebruiken, heeft het een beperkte levensduur. EEPROM is gespecificeerd om 100.000 lees-/wiscycli te verwerken. Dit betekent dat u gegevens 100.000 keer kunt schrijven en wissen/herschrijven voordat de EEPROM onstabiel wordt. In werkelijkheid, Atmel (de fabrikanten van de Arduino 'Chip') halfgeleiders kunnen een hoger of lager aantal cycli aan, afhankelijk van de toleranties van elke processor.





Als een locatie te vaak is geschreven en gewist, kan deze onbetrouwbaar worden. Het kan zijn dat het niet de juiste gegevens retourneert of de waarde van een naburig bit retourneert.

Dit klinkt misschien als veel schrijfacties, maar het kan gemakkelijk zijn om deze limiet te bereiken als u programmatisch leest en schrijft (in een lus , bijvoorbeeld). Het lezen van gegevens degradeert het silicium niet, alleen schrijven doet . U kunt zonder angst gegevens uit EEPROM lezen zoveel u wilt!





Het is belangrijk op te merken dat deze limiet van toepassing is op elke geheugenlocatie. Uw Arduino heeft mogelijk 1.000 of meer geheugenlocaties beschikbaar in EEPROM, dus als u te vaak naar één locatie schrijft, wordt alleen die locatie beïnvloed en niet een van de andere. Later zal ik bespreken slijtage nivellering , die EEPROM-slijtage kan verminderen door gegevens gelijkmatig te verdelen - iets waar SSD's gebruik van maken.

Waar is het nuttig voor?

EEPROM is ongelooflijk handig voor uw Arduino-projecten. Omdat het gegevens onthoudt, zelfs wanneer de stroom is verwijderd, kunt u de status van de Arduino opslaan. Misschien kun je een lasertorentje bouwen dat zijn positie onthoudt of hoeveel 'munitie' er nog over is. U kunt het gebruiken om uw apparaten te bedienen en te registreren hoe vaak uw apparaat is geactiveerd.

EEPROM is het meest geschikt voor zaken als instellingen of hoge scores. Wil je regelmatig complexe data schrijven, overweeg dan misschien een ethernet shield (met ingebouwd SD slot) of een Raspberry Pi.

Lezen en schrijven

Nu de theorie uit de weg is, laten we eens kijken hoe we wat gegevens kunnen lezen en schrijven! Voeg eerst de bibliotheek toe (deze wordt geleverd met de Arduino IDE):

#include

Schrijf nu wat gegevens:

EEPROM.write(0, 12);

Dit schrijft het nummer 12 naar EEPROM-locatie 0 . Elke schrijfactie duurt 3,3 milliseconden ( Mevrouw , 1000ms = 1 seconde). Merk op hoe je geen brieven kunt schrijven ( char ), zijn alleen de getallen van nul tot 255 toegestaan. Daarom is EEPROM ideaal voor instellingen of hoge scores, maar niet zo goed voor namen of woorden van spelers. Het is mogelijk om met deze methode tekst op te slaan (u kunt elke letter van het alfabet aan een cijfer toewijzen), maar u moet meerdere geheugenlocaties hebben -- één locatie voor elke letter.

Zo lees je die gegevens:

hoe youtube-video's op de iPhone op te slaan
EEPROM.read(0);

Nul is het adres waarnaar u eerder schreef. Als u nog niet eerder naar een adres hebt geschreven, wordt de maximale waarde geretourneerd ( 255 ).

Er zijn een aantal iets meer bruikbare methoden beschikbaar. Stel dat u een decimale plaats of tekenreeks wilt opslaan:

EEPROM.put(2,'12.67');

Dit schrijft de gegevens naar meerdere locaties -- iets dat gemakkelijk zelf te schrijven zou zijn, maar niettemin handig. U moet nog steeds bijhouden naar hoeveel locaties dit is geschreven, zodat u niet per ongeluk uw gegevens overschrijft! Je moet de gebruiken krijgen methode om deze gegevens weer op te halen:

float f = 0.00f;
EEPROM.get(2, f);

De waarde van get wordt opgeslagen in de float F variabel. Merk op hoe dit wordt geïnitialiseerd met 0,00f als de waarde. De F laat de compiler weten dat je misschien een groot aantal in deze variabele wilt opslaan, dus het stelt tijdens het compileren enkele extra configuraties in.

De EEPROM-documentatie op de Arduino-website heeft nog veel meer voorbeelden.

Slijtage-nivellering

Slijtage-nivellering is een techniek die wordt gebruikt om de slijtage te verminderen en de levensduur van EEPROM te verlengen. Als u slechts aan een klein project werkt, hoeft u zich hier misschien geen zorgen over te maken.

Het eenvoudigste dat u kunt doen om de levensduur van de EEPROM te behouden, is uw schrijfbewerkingen tot een bepaalde locatie te beperken. U kunt dit doen door eerst het adres te lezen, en als de waarde die u wilt schrijven al aanwezig is, hoeft u deze niet opnieuw te schrijven (onthoud dat het lezen van gegevens geen kwaad kan). Hier is hoe je dat zou doen:

int safeWrite(int data, address) {
if(EEPROM.read(address) != data) {
EEPROM.write(address, data);
}
}

Dat is een vrij eenvoudig stukje code, maar het werkt alleen voor gehele getallen! Gebruik in plaats van het wiel opnieuw uit te vinden de functie die is ingebouwd in de Arduino EEPROM-bibliotheek:

EEPROM.update(address, val);

Deze methode heeft precies dezelfde signatuur als de schrijven methode, hoewel het het aantal benodigde schrijfbewerkingen drastisch kan verminderen!

Als u veel gegevens moet schrijven en u zich zorgen maakt over het verslijten van het silicium, kunt u bijhouden hoeveel keer u schrijft, hoewel dit meer gegevens gebruikt. Hier is een ruwe implementatie in pseudocode :

var address = 0
var writeCount = 0
if(writeCount > 75,000)
writeCount = 0
address += 1
EEPROM.write(address, data)

U moet adres en writeCount opslaan in EEPROM (en writeCount moet worden verdeeld over adreslocaties). Meestal is dit beschermingsniveau niet nodig. Arduino's zijn ook zo goedkoop, dus misschien vindt u het gemakkelijker om een ​​back-up te kopen!

Je zou nu genoeg moeten weten om geweldige projecten te maken. Laat het ons weten als je iets leuks hebt gemaakt! Herken jij alle apparaten op de foto's? Laat hieronder een reactie achter!

Deel Deel Tweeten E-mail 5 tips om uw VirtualBox Linux-machines een boost te geven

Ben je de slechte prestaties van virtuele machines beu? Dit is wat u moet doen om uw VirtualBox-prestaties te verbeteren.

Lees volgende
Gerelateerde onderwerpen
  • doe-het-zelf
  • Arduino
  • Elektronica
Over de auteur Joe Coburn(136 gepubliceerde artikelen)

Joe is afgestudeerd in computerwetenschappen aan de Universiteit van Lincoln, VK. Hij is een professionele softwareontwikkelaar en als hij niet met drones vliegt of muziek schrijft, is hij vaak te vinden om foto's te maken of video's te maken.

Meer van Joe Coburn

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren