Вопросы по EEPROM: хранение и чтение

Почему не катит?
Т.е. считываю в ddd0 и i0 но вижу только “/” на жк экране 15956/101.
а должно быть “100/101”

int i0= 100;
int ddd0=101;

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#include <EEPROM.h>



void Save0() {
EEPROM.put(1, i0);
Serial.print(i0);
}

void Save1() {

EEPROM.put(2, ddd0);
Serial.print(String(ddd0));
}

void Read0() {

String I="";
EEPROM.get(1, i0);
Serial.print("i0:"+String(i0));
}

void Read1() {
String D="";
EEPROM.get(2, ddd0);
Serial.print("ddd0: "+String(ddd0));
}


void setup() {
 Serial.begin(9600);
 Save0();
 Save1();
 Read0();
 Read1();
 lcd.begin(16,2);
 lcd.setCursor(0,0);
 lcd.print(String(i0)+"/"+String(ddd0));
 Serial.print(i0+"/"+ddd0);
}

void loop() {
  // put your main code here, to run repeatedly:

}

А в сериал выводит правильно?

Нет также с косяком данных.
В чем может быть?

int i0= 100;
int ddd0=101;

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#include <EEPROM.h>



void Save0() {
EEPROM.put(1, i0);
Serial.print(String(i0)+"/"+String(ddd0)+"    ");
}

void Save1() {

EEPROM.put(2, ddd0);
Serial.print(String(i0)+"/"+String(ddd0)+"    ");
}

void Read0() {

String I="";
EEPROM.get(1, i0);
Serial.print(String(i0)+"/"+String(ddd0)+"    ");
}

void Read1() {
String D="";
EEPROM.get(2, ddd0);
Serial.print(String(i0)+"/"+String(ddd0)+"    ");
}


void setup() {
Serial.begin(9600);
 Save0();
 Save1();
 Read0();
 Read1();
 lcd.begin(16,2);
 lcd.setCursor(0,0);
 lcd.print(String(i0)+"/"+String(ddd0));
Serial.print(String(i0)+"/"+String(ddd0)+"    ");
}

void loop() {
  // put your main code here, to run repeatedly:

}

Вывод тупой совершенно не логичный:
100/101 100/101 25956/101 25956/101 25956/101
А должно быть:
100/101 100/101 100/101 100/101 100/101

Совершенно логичный. Вы пишете в EEPROM 16-битные данные, которые занимают по две ячейки. А теперь посмотрите, куда вы пишете ddd0

Подсказка - после изменения в двух местах ваш скетч выдает совершенно правильный вывод

Пришлите, код пожалуйста, исправленный, очень прошу…

Подумайте еще раз - данные занимают по две ячейки, вы пишете первую переменную в первую ячейку, значит она занимает ячейки с индексом 1 и 2. А куда вы пишете вторую переменную? Посмотрите в свой код внимательно, я в вас верю :wink:

Так пишет нормально, сейчас догоняю, что дело в поединке слов/снов.
Я не понимаю неужели нельзя сделать индекс 1…N.
Я думал это просто так работает.
Но на деле, оказалось… нужен сдвиг.

#include <LiquidCrystal.h>
#include <EEPROM.h>

int i0 = 100;
int ddd0 = 101;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);

  // адреса без пересечения
  int addr_i0 = 0;
  int addr_ddd0 = addr_i0 + sizeof(i0);

  // сохранить в EEPROM
  EEPROM.put(addr_i0, i0);
  EEPROM.put(addr_ddd0, ddd0);

  // прочитать обратно (для проверки)
  i0 = 0; ddd0 = 0;
  EEPROM.get(addr_i0, i0);
  EEPROM.get(addr_ddd0, ddd0);

  // вывод
  Serial.println(String(i0) + "/" + String(ddd0));
  lcd.setCursor(0, 0);
  lcd.print(String(i0) + "/" + String(ddd0));
}

void loop() {
  // пусто
}

А как тогда сделать метод, чтобы рассчитвать этот индекс сдвига для 5 ячеек по 20 байт информации каждая?

Не нужен никакой сдвиг. У вас есть голова для этого

uint16_t const EEPROM_INDEX_1 = 0; // 2 байта
uint16_t const EEPROM_INDEX_2 = 3; // 2 байта
...................................
EEPROM.put(EEPROM_INDEX_1, i0);
...................................
EEPROM.get(EEPROM_INDEX_1, i0);

Т.е. ручками расставляете номера ячеек и далее их используете

Я не пойму логику.
Дано 3 числа 4-х значных.


int xx=9999;
int yy=8888;
int zz=1111;

Теперь как их записать в EEPROM?
Можете помочь, не понятно ничего!

четырехзначность - это не для МК, а лично для вас. Вы должны смотреть на тип данных. Конкретно в этом случае вы пишете переменные типа int, которые в 8-битных атмегах занимают 16 бит, т.е. 2 (ДВА) байта. Отсюда и пляшите

По какой формуле определить этот индекс?
Нужен оператор sizeOf() для подсчета?

В уме посчитать не судьба?

Первая переменная (2 байта) - индекс idx0 = 0;
Вторая переменная (4 байта) - индекс idx1 = idx0 +2;
Третья переменная (2 байта) - индекс idx2 = idx1 + 4;

И так далее. Зачем вам компьютер для этого?

Первая переменная (2 байта) - индекс idx0 = 0;
Вторая переменная (4 байта) - индекс idx1 = idx0 +2;
Здесь не ошибка случайно:
Третья переменная (6 байта вместо 2 байта) - индекс idx2 = idx1 + 4;

С какого вдруг 6 байт? В скобках размер самой переменной (приведен для примера), а не сдвиг от начала чего-то-там

v258, забей, он “программист с 10-летним стажем”, сам разберётся. Иди лучше стол готовь к накрытию.

2 лайка

Как вы это считает я путаю биты с байтами.
Например число:
xx=255; //это 1 байт.
Число yy=512; //это 2 байта. Верно?
zz=1024//это 3 байта. Выходит!
А число
aa=2048;// Это 4 байта?
Или все что я сказал не верно!?

Надо модеров попросить выкинуть нахрен ртсюда этого идиота, хотя бы на время.

2 лайка

Я тебе такого не говорил!