использование EEPROM Arduino

Я хочу знать цель использования EEPROM, потому что не могу ее получить, Я имею в виду, что я знаю, что он может хранить значения в течение длительного времени, но я просто не могу получить цель здесь

#include<EEPROM.h>
void setup()
{
  Serial.begin(9600);
  EEPROM.write(0,4);
  int s=EEPROM.read(0);
  int f=10;
  Serial.print(s); 
  Serial.print(" ");
  Serial.print(10);    
}

void loop()  {}

Например, я использую EEPROM, чтобы увидеть разницу, если я печатаю значение внутри переменной s на серийный монитор, используя EEPROM, и обычное значение внутри переменной f. Но я не мог найти разницу между ними, потому что при отключении питания и повторном включении они оба печатаются. Надеюсь, вы поняли идею, и я надеюсь увидеть некоторые отзывы. Спасибо..

программа светодиодов

затем я сделал эту программу, которая сравнивает значение EEPROM с числом 4 и сравнивает переменную F с числом 4. Известно, что значения F и EEPROM равны 4. а затем я изменил оба значения на 3. не должен ли ЗЕЛЕНЫЙ светодиод EEPROM все еще гореть, потому что он уже сохранил num.4??

#include<EEPROM.h>
void setup()
{
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
}

void loop()
{

  EEPROM.write(0,4);                 //ЗЕЛЕНЫЙ СВЕТОДИОД
  int f=4;                           //КРАСНЫЙ СВЕТОДИОД

  if(EEPROM.read(0)==4) digitalWrite(12,HIGH);
  if(f==4) digitalWrite(11,HIGH);   
}

, 👍0

Обсуждение

откуда этот код? Поменяйте местами строки с чтением и записью. Запустите код. Затем измените 4 на 42 и загрузите снова., @Juraj

В вашем скетче светодиоды никогда не будут выключены, потому что вы записываете в eeprom и сразу же считываете его значение. Это довольно тривиально, что они одинаковы. Кроме того, вы довольно быстро убьете eeprom, если будете так часто писать в него. Eeprom обычно рассчитаны примерно на 100 тыс. операций записи, поэтому ваш скетч может заблокировать eeprom в течение нескольких минут., @Sim Son

теперь, даже если я напишу это внутри настройки пустоты, ЗЕЛЕНЫЙ светодиод не загорится, когда я изменю значение на 3. Я имею в виду, что он должен сохранить число 4 внутри, чтобы значение просто оставалось внутри, верно?, @klay

Что вы переместили в setup()? Весь код в loop()? Вы понимаете, что написал Tom_C в своем ответе? ОДНОГО скетча недостаточно, чтобы действительно продемонстрировать назначение eeprom. Вместо этого вы должны загрузить и запустить скетч1, который записывает значение в eeprom в setup(), затем загрузить и запустить скетч2, который читает eeprom и использует соответствующее значение., @Sim Son

я отредактировал свой ответ, @Sim Son


2 ответа


1

Вкратце: Как только вы выключите Arduino, все переменные на нем, которые были рассчитаны скетчем, будут потеряны. Это потому, что они хранятся в оперативной памяти, которая не может хранить вещи без питания. Это не проблема EEPROM: хранящиеся там значения будут доступны при перезагрузке, и их не нужно будет вычислять снова.

Это может оказаться полезным, если ваше устройство позволяет пользователю сохранять пресеты: то есть конфигурацию программы. Если эта конфигурация, которая может быть, например, переменными, влияющими на поведение программы, хранится в оперативной памяти, она будет потеряна при следующей перезагрузке. С другой стороны, значение, сохраненное в EEPROM во время первого выполнения (например, введенное пользователем), все еще будет доступно при следующей перезагрузке, если вы потратили время на его запись (при первом запуске) и чтение (при первом запуске). второй заход). Точно так же, как сохранить, а затем вызвать предустановку.

Остерегайтесь того, что EEPROM не любит перезаписываться слишком много раз и изнашиваться, поэтому вы должны свести это к минимуму (значения, которые действительно необходимо восстанавливать при перезагрузке и не могут быть рассчитаны в настоящее время).

,

спасибо @Tom_C Я отредактировал свой пост и добавил программу LED и спросил, почему светодиод EEPROM не горит, надеюсь, что вы также можете дать мне отзыв, @klay

@klay, как и раньше, в вашем новом примере нет НИКАКИХ преимуществ EEPROM. Вы читали мой ответ? Вот вы пишете и читаете eeprom подряд, что немного похоже на: "Я положила сыр в холодильник, что сейчас у меня в холодильнике? Оооо, сыр!", @Tom

@klay Кроме того, как сказано в ответе, EEPROM [НЕ нравится, когда его часто записывают](https://www.arduino.cc/en/Tutorial/EEPROMUpdate). Ваш EEPROM.write(0,4); в цикле убьет его за очень (очень) короткое время, @Tom

Я просто хочу применить концепцию этого, вы знаете, когда вы сохраняете для него значение, а затем используете его, например, как умный дом, который работает с определенными заказами, поэтому идея здесь состоит в том, чтобы изменить его только один раз, чтобы показать принцип ЭСППЗУ. даже когда я пишу это в НАСТРОЙКЕ, светодиод также не будет работать. так что рассмотрите возможность написания этого скетча внутри установки пустоты, как я могу заставить его работать только один раз?, @klay

Извините, я не понимаю, что вы хотите или не понимаете. Возможно, @Sim Son ближе к тому, что вы ищете. В любом случае, если вы не видите смысла писать в EEPROM, то оно вам скорее всего и не нужно ;). Кроме того, если вы запустили скетч в своем ответе сейчас, имейте в виду, что первый блок памяти EEPROM, скорее всего, не работает., @Tom


0

"Он может хранить значения в течение длительного времени" - это не совсем то, что делает eeprom, главное свойство заключается в том, что информация в eeprom сохраняется во время циклов питания и перезагрузки чипа. Напротив, ОЗУ теряет всю информацию, когда вы отключаете питание чипа.

Чтобы получить представление о eeprom, я предлагаю вам выполнить следующую процедуру:

1. Загрузите этот скетч:

#include "EEPROM.h"

void setup() {
  EEPROM.write(0,4);
}

void loop(){}

2. После того, как этот скетч будет выполнен, загрузите и запустите приведенный ниже скетч (вы можете даже отключить Arduino перед этим шагом):

#include "EEPROM.h"

void setup() {
  pinMode(12,OUTPUT);
  if(EEPROM.read(0)==4) digitalWrite(12,HIGH);
  EEPROM.write(0,3);
}

void loop(){}

3. Теперь загорится зеленый индикатор.

4. Сбросьте atmega, и теперь зеленый светодиод не будет гореть.

Просто используя переменную int f, которая находится в ОЗУ, вы не можете "переносить" значение между этими скетчами/средами выполнения.

,