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