在这篇文章中,我们将了解什么是EEPROM,数据是如何在EEPROM中存储的Arduino董事会并通过几个实例实际测试了如何在EEPROM上读写数据。
为什么eepm ?
在我们问EEPROM是什么之前?首先了解为什么将EEPROM用于存储是非常重要的。因此,我们对eeprom有了清晰的认识。
现在有很多可用的存储设备,从像计算机硬盘这样的磁存储设备,老式盒式磁带录音机,像cd、dvd、蓝光磁盘这样的光存储介质,以及像计算机SSD(固态驱动器)这样的固态存储器和内存卡等等。
这是一种大容量存储设备,可以存储音乐、视频、文档等数据,从低至几千字节到多兆兆字节。这些是非易失性存储器,这意味着,数据可以保留,即使在电源切断后,存储介质。
能播放舒缓音乐或令人瞠目的视频的设备;如电脑或智能手机;存储一些关键数据,如配置数据,启动数据,密码,生物测量数据,登录数据等。
由于安全原因,这些数据不能存储在大容量存储设备中,而且这些数据可能会被用户无意中修改,从而导致设备故障。
这些数据只需要几字节到几兆字节,将传统的存储设备(如磁性或光学介质)连接到处理器芯片在经济上和物理上都是不可行的。
因此,这些关键数据存储在处理芯片本身。
Arduino与电脑或智能手机没有什么不同。在一些情况下,我们需要存储一些关键数据,这些数据即使在断电后也不能被擦除,例如传感器数据。
到目前为止,您应该已经知道了为什么我们需要在微处理器和微控制器芯片上使用EEPROM。
eepm是什么?
EEPROM是电可擦可编程只读存储器的缩写。它也是一种可以读写的非易失性存储器字节明智的。
读写字节级使得它不同于其他半导体存储器。例如闪存:以块的方式读取、写入和擦除数据。
一个块可以是几百位到几千位,这对于大容量存储是可行的,但对于微处理器和微控制器中的“只读内存”操作,它们需要逐个字节访问数据。
在Arduino Uno板(ATmega328P)上,板上有1KB或1024字节的EEPROM。每个字节都可以单独访问;每个字节的地址范围从0到1023(总共1024个)。
Address(0-1023)是存储数据的内存位置。
在每个地址上可以存储8位数据,从0到255的数字。我们的数据以二进制形式存储,所以如果我们将数字255写入EEPROM,它将在一个地址中存储数字为11111111,如果我们存储0,它将存储为00000000。
您也可以存储文本,特殊字符,字母数字字符等通过编写适当的程序。
这里不讨论构造细节和工作,这可能会使本文冗长,我们可能会使您昏昏欲睡。前往YouTube或谷歌,有有趣的文章/视频关于建设和工作的EEPORM。
不要混淆EEPROM和EPROM:
简而言之,EPROM是一种电可编程只读存储器,这意味着它可以电编程(存储内存),但不能电擦除。
它利用在存储芯片上的明亮的紫外线光来消除存储的数据。EEPROM取代了EPROM,现在几乎不用于任何电子设备。
不要混淆闪存和EEPROM:
闪存是一种半导体非易失性存储器,它也是电可擦和电可编程的,实际上闪存是由EEPROM衍生而来的。但是块级内存访问,或者换句话说,访问内存的方式和它的构造不同于EEPROM。
Arduino Uno (ATmega328P微控制器)也有32KB的闪存用于程序存储。
eepm寿命:
像任何其他电子存储介质一样,EEPROM的读、写、擦除周期也是有限的。但问题是;与其他类型的半导体存储器相比,它的寿命最短。
在Arduino的EEPROM上,Atmel声称每单元大约有100000(10万)个写周期。如果室温较低,则EEPROM的寿命更长。
请注意,从EEPROM读取数据不会显著影响寿命。
有外接的EEPROM芯片,可以方便地与Arduino接口,内存容量从8kb、128KB、256kb等,每个cell的生命周期约为100万个写周期。
这就是关于EEPROM的结论,现在你应该已经获得了足够的关于EEPROM的理论知识。
在下一节中,我们将学习如何在arduino上实际测试EEPROM。
如何在Arduino测试EEPROM
要实现这一点,你只需要一根USB连接线和Arduino Uno板,就可以开始了。
从上面的解释中,我们了解到eeprom具有存储数据的Address。我们可以在Arduino Uno中存储0到1023个位置。每个位置可以容纳8位或一个字节。
在这个例子中,我们将把数据存储在一个地址中。为了减少程序的复杂性并使程序尽可能简短,我们将在从0到9的地址上存储单个数字整数(0到9)。
程序代码# 1
现在,将代码上传到Arduino://------------------ 项目由R.GIRISH -------------------//
# include < EEPROM.h >
int inputAddress = 0;
int inputValue = 0;
int ReadData = 0;
boolean Readadd = true;
boolean Readval = true;
无效的设置()
{
Serial.begin (9600);
系列。println("输入地址(0到9)");
以(" ");
而(Readadd)
{
inputAddress = Serial.read ();
如果(inputAddress > 0)
{
inputAddress = inputAddress - 48;
Readadd = false;
}
}
系列。print("您选择的地址:");
以inputAddress);
以(" ");
延迟(2000);
系列。println(“输入要存储的值(0到9)”);
以(" ");
而(Readval)
{
inputValue = Serial.read ();
如果(inputValue > 0)
{
inputValue = inputValue - 48;
Readval = false;
}
}
系列。print(“您输入的值是:”);
以inputValue);
以(" ");
延迟(2000);
系列。print("It will be stored in Address: ");
以inputAddress);
以(" ");
延迟(2000);
系列。println(“写eepm…”);
以(" ");
eepm。写(inputAddress inputValue);
延迟(2000);
系列。println(“价值存储成功! !”);
以(" ");
延迟(2000);
系列。println(“朗读eepm…”);
延迟(2000);
ReadData = EEPROM.read (inputAddress);
以(" ");
系列。print("从Address读取的值");
并同时inputAddress);
系列。打印(“:”);
以ReadData);
以(" ");
延迟(1000);
以“做! !”);
}
无效循环()
{
//这里什么也不做。
}
//------------------ 项目由R.GIRISH -------------------//
输出:
一旦代码上传,打开串行监视器。
它会要求您输入从0到9的地址。从上面的输出中,我输入了地址3。因此,我将在位置(地址)3中存储一个整数值。
现在,它将提示您输入一个从0到9的单位数整数值。从上面的输出中,我输入了值5。
因此,现在值5将被存储在地址位置3中。
一旦您输入值,它将把该值写入EEPROM。
它将显示一条成功消息,这意味着存储了值。
几秒钟后,它将读取存储在注释地址上的值,并将该值显示在串行监视器上。
综上所述,我们对Arduino单片机的EEPROM进行了读写。
现在,我们将使用EEPROM来存储密码。
我们将输入一个6位数字(不少于或不多于)密码,它将存储在6个不同的地址(每个地址对应每一位数字)和一个额外的地址存储“1”或“0”。
一旦您输入密码,附加的地址将存储值“1”,表示密码已设置,程序将要求您输入密码以打开LED。
如果额外的地址存储值为“0”或存在任何其他值,它将要求您创建新的6位密码。
通过上述方法,程序可以识别您是否已经设置了密码或需要创建一个新密码。
如果输入的密码是正确的,构建在LED在引脚# 13发光,如果输入的密码是不正确的,LED不会发光,串行监视器将提示您的密码是错误的。
程序代码# 2
现在上传代码://------------------ 项目由R.GIRISH ---------------//
# include < EEPROM.h >
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;
无效的设置()
{
Serial.begin (9600);
pinMode(领导、输出);
digitalWrite(领导、低);
passwordExist = EEPROM.read (passExistAdd);
如果(passwordExist ! = 1)
{
系列。println("Enter a new 6 number password:");
而(ReadVal1)
{
word1 = Serial.read ();
如果(word1 > 0)
{
Word1 = Word1 - 48;
ReadVal1 = false;
}
}
而(ReadVal2)
{
word2 = Serial.read ();
如果(word2 > 0)
{
Word2 = Word2 - 48;
ReadVal2 = false;
}
}
而(ReadVal3)
{
word3 = Serial.read ();
如果(word3 > 0)
{
Word3 = Word3 - 48;
ReadVal3 = false;
}
}
而(ReadVal4)
{
word4 = Serial.read ();
如果(word4 > 0)
{
Word4 = Word4 - 48;
ReadVal4 = false;
}
}
而(ReadVal5)
{
经常= Serial.read ();
如果经常> 0)
{
Word5 = Word5 - 48;
ReadVal5 = false;
}
}
而(ReadVal6)
{
word6 = Serial.read ();
如果(word6 > 0)
{
Word6 = Word6 - 48;
ReadVal6 = false;
}
}
以(" ");
并同时word1);
并同时word2);
并同时word3);
并同时word4);
并同时(经常);
并同时word6);
eepm。写(wordAddress1 word1);
eepm。写(wordAddress2 word2);
eepm。写(wordAddress3 word3);
eepm。写(wordAddress4 word4);
eepm。写(wordAddress5经常);
eepm。写(wordAddress6 word6);
EEPROM.write (passExistAdd, 1);
系列。println("密码保存成功!!");
以(" ");
系列。println(“按下重置按钮。”);
而(真){}
}
如果(passwordExist = = 1)
{
以(" ");
系列。println("Please enter the 6 digit number password:");
而(ReadVal1)
{
word1 = Serial.read ();
如果(word1 > 0)
{
Word1 = Word1 - 48;
ReadVal1 = false;
}
}
而(ReadVal2)
{
word2 = Serial.read ();
如果(word2 > 0)
{
Word2 = Word2 - 48;
ReadVal2 = false;
}
}
而(ReadVal3)
{
word3 = Serial.read ();
如果(word3 > 0)
{
Word3 = Word3 - 48;
ReadVal3 = false;
}
}
而(ReadVal4)
{
word4 = Serial.read ();
如果(word4 > 0)
{
Word4 = Word4 - 48;
ReadVal4 = false;
}
}
而(ReadVal5)
{
经常= Serial.read ();
如果经常> 0)
{
Word5 = Word5 - 48;
ReadVal5 = false;
}
}
而(ReadVal6)
{
word6 = Serial.read ();
如果(word6 > 0)
{
Word6 = Word6 - 48;
ReadVal6 = false;
}
}
checkWord1 = EEPROM.read (wordAddress1);
如果(checkWord1 ! = word1)
{
以(" ");
系列。println(“错误密码! !”);
以(" ");
系列。println(“按下重置按钮。”);
而(真){}
}
checkWord2 = EEPROM.read (wordAddress2);
如果checkWord2 ! = word2
{
以(" ");
系列。println(“错误密码! !”);
以(" ");
系列。println(“按下重置按钮。”);
而(真){}
}
checkWord3 = EEPROM.read (wordAddress3);
如果(checkWord3 ! = word3)
{
以(" ");
系列。println(“错误密码! !”);
以(" ");
系列。println(“按下重置按钮。”);
而(真){}
}
checkWord4 = EEPROM.read (wordAddress4);
如果(checkWord4 ! = word4)
{
以(" ");
系列。println(“错误密码! !”);
以(" ");
系列。println(“按下重置按钮。”);
而(真){}
}
checkWord5 = EEPROM.read (wordAddress5);
如果(checkWord5 ! =经常)
{
以(" ");
系列。println(“错误密码! !”);
以(" ");
系列。println(“按下重置按钮。”);
而(真){}
}
checkWord6 = EEPROM.read (wordAddress6);
如果(checkWord6 ! = word6)
{
以(" ");
系列。println(“错误密码! !”);
以(" ");
系列。println(“按下重置按钮。”);
而(真){}
}
digitalWrite(领导、高);
以(" ");
系列。println(“领导”);
以(" ");
系列。println(“按下重置按钮。”);
}
}
无效循环()
{
}
//------------------ 项目由R.GIRISH ---------------//
输出:
打开串口监视器;它会提示你创建一个6位数字的密码。
输入任意6位密码,记下来并按Enter键。现在密码已经被存储了。
您可以按下复位按钮,也可以断开PC上的USB线,这会导致Arduino板的电源中断。
现在,重新连接USB线,打开串行监视器,将提示您输入保存的6位密码。
输入正确的密码,LED会发光。
如果你想更改密码,请从代码中更改数字:
int passExistAdd = 200;
上面一行是我们之前讨论过的附加地址。从6更改到1023。保留0 ~ 5个地址用于保存6位密码。
更改这个额外的地址会欺骗程序,密码还没有创建,并提示您创建一个新的6位密码。
如果你在Arduino教程中对这个EEPROM有任何问题,请在评论中表达,你可以收到一个快速的回复。
喂,
你可以在verständlich erklärt上找到它。
有格勒乌ße
沃尔特
十分感谢!好了,帽子掉了…
我对你的解释很理解。我在学校的HND水平上做过。
谢谢你!
先生
你能帮帮我吗
我需要一个电路
我给电路通电时,它就会接通继电器。
当传感器或任何东西检测到绿色,它将关闭继电器。如果得到任何其他颜色不要关闭继电器。
先生,请帮我提供这个电路
法尔汉,用颜色检测触发电路看起来很难,我不知道怎么做……
你好,
通过Arduino或任何微控制器的RGB颜色传感器可以触发带有颜色的电路。
问候
嗨GR,
你可以把这篇文章寄给我发表。您可以分别编写模块和项目文章。
好的!
嗨Swagatam
文章不错,容易理解。根据我的理解是,如果你想建立一个项目,将被永久使用,如在家用电子产品等,然后你必须在EEPROM中编写你的程序。我说的对吗?因为即使断电,存储的数据也不会被删除。
非常感谢
嗨,阿爸,谢谢你喜欢这篇文章。
我还没有看完这篇文章,我还没有学习微处理器。
这是由Mr. GR写的,他是微控制器专家,他知道你问题的确切答案,你可以随时通过他的FB ID联系他。
你好,先生,你…非常有趣的话题…我有疑问,
你可能在路上和商店里看到过很多led显示屏——不同的led图案,滚动的单词和句子等等。如何做到这一点?是否使用eeprom?
你们有这个的电路吗?
你好Sinu,复杂的显示许多许多模式肯定是基于微控制器,目前我没有这种类型的项目所需的代码
我不要密码,先生。我只想要电路或理论。意味着他们的表现如何。如果你有任何想法…
Sinu,我会去找它,如果我碰巧找到它,我会帮你更新它……
谢谢你,先生…希望很快能听到你的消息