Профили с изменяемыми параметрами

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Всем привет.

Назрел вопрос. Сам додуматься никак не могу. Просто в голове даже образно не строится алгоритм действий.

Задача следующая.
Нужно сделать 50 профилей в которых будет по 4-6
изменяемых параметра. То- есть, заходим в первый профиль, меняем четыре параметра как надо, сохраняем в eeprom ,со следующими так же.

Подскажите хотябы направление, куда рыть. Интересует именно конструкция такого меню.

sadman41
Offline
Зарегистрирован: 19.10.2016

Что такое "профиль", что содержит, чем заходим, на что меняем, какой МК используем... Вот направлении ответов на эти вопросы и копайте.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Я наверное не правильно все же объяснил.

Вобщем.

Мне нужно вывести на дисплей номер профиля. Профиль именуется например так "profile 0". Внутри этого профиля имеется от четырех до шести параметров, которые тоже отображаются для читания.

Профиль будет иметь нумерацию от 00 до 50.
Каждый параметр будет содержать число от 00 до 99.

Каждый профиль при переключении, то есть пролистав его вперёд или назад, должен иметь сохраненные параметры которые будут менятся энкодером и соответственно сохраняться в профиль.

Плату хочу использовать НАНО, но пока не точно, в зависимости от веса кода. Если не хватит то другой. Повторюсь, это пока не имеет значения. Для меня сейчас более важно понять, как строится такая структура.

sadman41
Offline
Зарегистрирован: 19.10.2016

Если это обычные числа - хоть массивом длинной 6*50 байт.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Можете пнуть меня в какую-то похожую тему с кодом, изучу.
Просто как уже говорил, не могу в голове выстроить структуру как это все происходит.

MaksVV
Offline
Зарегистрирован: 06.08.2015

а зачем массив, если в еепроме будет храниться? Сразу оттуда читать/писать когда надо. Создать двухуровневое меню. Одна переменная содержит инфу в каком первом уровне сейчас находимся (от 1 до 50). Дисплей при изменении этой переменной (например двумя кнопками вправо влево), обновляет экран - показывает номер профиля и его параметры. 

Вторая переменная показывает в каком параметре сейчас находимся (от 1 до 6). Например долгим нажатием вправо или влево переходим на выбор параметра, а не профиля. Тут уже, крутя энкодер, меняем значение  текущего параметра, кликая энкодер запоминаем в еепром. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно и без массива - я не заставляю. Но потренироваться лучше на массиве.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Я прошу, пните меня куда-то, где есть код, хочу увидеть/изучить.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ggreenpowerp пишет:
. Повторюсь, это пока не имеет значения. Для меня сейчас более важно понять, как строится такая структура.

Вот как раз на структуре и строится. Берете си-шную структуру и описываете ваш профиль. А потом делаете массив из этих структур. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ggreenpowerp пишет:
Я прошу, пните меня куда-то, где есть код, хочу увидеть/изучить.

Ну вот, например - 

https://metanit.com/cpp/c/6.4.php

https://ee.kpi.ua/~yv/edu/amp/book/c/07/0702.htm

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Можно и без массива - я не заставляю. Но потренироваться лучше на массиве.

массив структур в епром?

sadman41
Offline
Зарегистрирован: 19.10.2016

А какая разница - массив структур или просто структура или просто массив? Везде байты.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ua6em пишет:

sadman41 пишет:
Можно и без массива - я не заставляю. Но потренироваться лучше на массиве.

массив структур в епром?

ТСу бы сначала разобраться как с этим в ОЗУ работать , а потом уже можно и в EEPROM пихать.  

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
А какая разница - массив структур или просто структура или просто массив? Везде байты.

проще работать с епром вроде как. чем побайтно, ++ однако?

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Так, немножко всеравно недопонимаю. В структуре я должен описать каждый профиль с каждым его параметром, потом при сравнении вызывать той или иной профиль? То-есть, если у меня 50 профилей то выглядит это так?

 

struct profile
{
byte val0;
byte val1;
byte val2;
byte val3;
...
};

 

или так

struct profile
{
byte val[50];
};

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

А можно словами описать, что за профили и что за параметры и как они изменяются. А то "4-6 изменяемых параметра" очень неопределенно звучить.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

 

 

 

Все будет работать одним энкодером.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ну в таком случае проще всего завести массив или структуру из 4 параметров. И функции записи и получения этого массива или структуры в/из EEPROM  по номеру  профиля.

Таким образом мы в каждый текущий момент работаем с одним набором параметров плюс у нас есть переменна где храним текущий номер профиля.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

тоесть каждый параметр я создаю отдельно ну или вложенный массив?

пример

 

byte parameter0 [99];
byte parameter1 [99];
byte parameter2 [99];
byte parameter3 [99];

и как в целом привязать набор параметров к номеру профиля?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018
byte parameter[4];
byte CurrentProfile;

void SaveProfile(byte profile, byte * parameters){
  
}
void ReadProfile(byte profile, byte * parameters){
}

 

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

еще вопрос. Если у меня данные параметров будут часто меняться,  правильно ли будет, обновлять еепром, а не каждый раз записывать? 

eeprom_update_byte   ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Насколько часто?

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Думаю можно в целом и писать сразу. 5-10 профилей раз в сутки или двое будут меняться.

sadman41
Offline
Зарегистрирован: 19.10.2016

Открываем https://static.chipdip.ru/lib/549/DOC001549488.pdf

Читаем: Write/Erase Cycles: 10,000 Flash/100,000 EEPROM

Делим 10,000 / 1 раз в сутки, получаем 10,000 суток работы, что составляет 27,3972602739726 лет. Хватит для начала?

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

так вот тоже только что пересчитал)) 

Думаю для начала с головой))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Как то так:

#include <EEPROM.h>
typedef struct myStruct{
				char *name;
				int int1;
				int int2;
				int int3;
				int int4;
};
myStruct str1={"name1",1,2,3,4};
myStruct str2={"name2",1,2,3,4};
myStruct str3={"name3",1,2,3,4};
myStruct str4={"name4",1,2,3,4};
myStruct str5={"name5",1,2,3,4};

myStruct structArr[5]={str1,str2,str3,str4,str5	
};

void setup(){
				//если первый старт
				if(EEPROM.read(255)!=22){
								EEPROM.put(0,structArr);
								EEPROM.write(255,22);
				}
			else{
								EEPROM.get(0,structArr);
				}
Serial.begin(9600);
}

void loop(){
Serial.println(structArr[0],name);
				Serial.println(structArr[0].int1);

}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Kakmyc пишет:

Как то так:

#include <EEPROM.h>
typedef struct myStruct{
				char *name;
				int int1;
				int int2;
				int int3;
				int int4;
};
myStruct str1={"name1",1,2,3,4};
myStruct str2={"name2",1,2,3,4};
myStruct str3={"name3",1,2,3,4};
myStruct str4={"name4",1,2,3,4};
myStruct str5={"name5",1,2,3,4};

Нет.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

DetSimen пишет:

Нет.

Чой та ?

Komandir
Offline
Зарегистрирован: 18.08.2018

А что двумерные массивы запретили ? Раз границы заранее известны - зачем городить огород ?

sadman41
Offline
Зарегистрирован: 19.10.2016

При char* не резервируется под строку область памяти, если я правильно помню.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

sadman41 пишет:

При char* не резервируется под строку область памяти, если я правильно помню.

А вроде как и не надо.
Я ж сначала объявил и описал структуры,память уже выделена, потом уже их в массив поместил с известной фиксированной длинной строки.
Понятно, что менять structArr[x].name не стоит.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#297  Ну это .Но жевать эту тему не хочу.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Блин зачем вообще структуры и массивы? Работать сразу с еепром. На каждый профиль отвести 6 параметров в еепром. Соответственно у первого профиля адреса параметров в еепром будут ячейки от 0 до 5. У второго - от 6 до 11 и т.д. дисплей обновлять при смене текущего профиля или параметра. Сохранять в еепром нажатием на кнопку энкодера.

sadman41
Offline
Зарегистрирован: 19.10.2016

С массивом - потренироваться, чтобы EEPROM по глупости в расход не пустить в лупе.

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

А можно маленький пример кода?
Я просто про это тоже думал, но кажется мне что без структур и массивов это будет не так удобно.

b707
Offline
Зарегистрирован: 26.05.2017

Зачем вам массив, если в каждый момент вы работаете с одним набором параметров? С массивом у вас получается совершенно непроизводительный перерасход памяти

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

#297  Ну это .Но жевать эту тему не хочу.

в 15 строке menu.h - //ноказ настроек )))
поправь

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

Я так понимаю, под определенный профиль нужно прописать адрес еепром под каждый параметр?

Если можно, накиньте пожалуйста код примерный, либо пнитев тему где это можно глянуть.

Я уже вообще запутался))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ggreenpowerp пишет:

Я так понимаю, под определенный профиль нужно прописать адрес еепром под каждый параметр?

Если можно, накиньте пожалуйста код примерный, либо пнитев тему где это можно глянуть.

Я уже вообще запутался))

Попробую для тупых армейцев. Для выполнения задачи нужно отделение из 7 человек:командир,водитель,пулеметчик,гранатометчик и так далее. У каждой специальности есть свой Устав.И в этот устав никто не должен лезть крывыми руками. Это progmem. В военкомате набирают 7 призывников. Они нулевые и тупые, но у них есть блокнот, на который отведен свой участок eeprom-а. Вот перед заданием они переписывают устав своей назначенной специальности в свои блокноты. Ну могут в штабе внести изменения но не в устав, а блокнотики этих несчастных. Понятно что это код вашего меню.  И в процессе выполнения задания каждый боец ,если у него есть вопросы, то лезет в свой склерозник, а не к своему командиру. Код писать не буду, так как мне этот гемор не надо. Ищите исполнителя уже за свои деньги и морочьте своими непонятками ему голову.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пух, как хорошо что я твой лямбда-взвод вжывую не видел. Мне такое даже приходящая белочка не показывала. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

ggreenpowerp пишет:

Я так понимаю, под определенный профиль нужно прописать адрес еепром под каждый параметр?

Если можно, накиньте пожалуйста код примерный, либо пнитев тему где это можно глянуть.

Я уже вообще запутался))


Не нужно ничего прописывать. Адрес конкретного параметра будет вычисляться по формуле: Адрес параметра в еепром = номер профиля умножить на 6 + номер параметра. Завести две переменных - текущий номер профиля и текущий номер параметра. Кнопками их выбирать. После выбора можно менять значение, после смены значения нажатием кнопки сохранять в еепром. Адрес вы уже знаете.
Пс. Пух как всегда жгет не по децки

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

MaksVV, спасибо. Теперь вкурил))

На Форуме всегда найдется несколько пухов, которых пчелы покусали. Мне вот только интересно, строчить сто слов про какую-то армию время есть и его не жалко, а более менее нормально описать времени нет. Пух, примите антидепрессантов, лично вас я о помощи не просил. Но все равно, выражаю свою благодарность за потраченное на меня время...

b707
Offline
Зарегистрирован: 26.05.2017

Пуха может и покусали пчелы, но его с его бредом мы любим больше, чем таких новичков, которым требуется 40 сообщений, чтобы вкурить элементарные принципы.
Такие обьяснения,как у Пуха - они ведь от той депрессухи, что навевают элементарные вопросы, раз за разом задаваемые в форум, вместо того чтоб сесть и немного подумать самому

ggreenpowerp
Offline
Зарегистрирован: 11.02.2015

B707, понял. Извините, больше ничего ни у кого не спрошу. Извините за беспокойство

Тему можно закрыть.

П.с.
Хотел просто вкурить тему быстрее. Изначально я просил пихнуть в тему где есть код уже готовый чтобы изучить, не скопировать тупо, а изучить и понять. Потом, начались перепалки между собой, одни говорили про массив, другие про структуру, третьи за то и другое вместе, вот потому еще больше запутался.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

сёдня вечером или завтра утром, если не забуду, накидаю тебе лагаритм. Не плачь.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Без проверок на любые ошибки. Разбирайся

#pragma once
#include <eeprom.h>

const uint8_t INVALID_VALUE = 0xFF;

#pragma pack(push,1)


// 
//  Структура профиля, содержащая 6 байтовых параметров
//
struct TProfile {
	uint8_t Param_0;
	uint8_t Param_1;
	uint8_t Param_2;
	uint8_t Param_3;
	uint8_t Param_4;
	uint8_t Param_5;

	TProfile() {
		memset(this, INVALID_VALUE, sizeof(*this));  // при создании забьем структуру значением INVALID_VALUE
	}
};

#pragma pack(pop)

const uint8_t PROFILE_SIZE = sizeof(TProfile);  // размер структуры профиля



// прочитать из EEPROM профиль номер AIndex, у тебя 0..50
//
TProfile ReadProfile(const uint8_t AIndex) {
	TProfile result;
	uint16_t address = PROFILE_SIZE * AIndex;
	eeprom_read_block(&result, (void*)(address), PROFILE_SIZE);
	return result;

}


// записать в EEPROM профиль номер AIndex
//
void SaveProfile(const uint16_t AIndex, const TProfile& AValue) {
	uint16_t address = PROFILE_SIZE * AIndex;
	eeprom_update_block(&AValue, (void*)(address), PROFILE_SIZE);
}